ffi-wingui-core 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/examples/Command.rbw CHANGED
@@ -1,13 +1,14 @@
1
1
  require 'ffi-wingui-core'
2
2
 
3
- include WinGUI
3
+ exit if defined?(Ocra)
4
4
 
5
- EnableVisualStyles()
5
+ include WinGUI
6
6
 
7
7
  APPNAME = L(File.basename(__FILE__, '.rbw'))
8
8
 
9
9
  CMD_ITEM1 = WM_APP + 1
10
- CTL_BUTTON1 = CMD_ITEM1 + 1
10
+ CTL_FOCUS = CMD_ITEM1 + 1
11
+ CTL_BUTTON1 = CTL_FOCUS + 1
11
12
 
12
13
  WndExtra = Struct.new(
13
14
  :haccel,
@@ -47,13 +48,20 @@ def onCreate(hwnd,
47
48
  }
48
49
 
49
50
  hbtn1 = CreateWindowEx(
50
- 0, L('Button'), L('&Button1'), WS_CHILD | WS_VISIBLE,
51
+ 0, L('Button'), L('&Button1'), WS_CHILD | WS_CLIPSIBLINGS |
52
+ WS_VISIBLE | WS_TABSTOP,
51
53
  *DPIAwareXY(10, 10, 100, 25),
52
54
  hwnd, FFI::Pointer.new(CTL_BUTTON1), GetModuleHandle(nil), nil
53
55
  )
54
56
 
55
57
  SendMessage(hbtn1, WM_SETFONT, xtra[:hmf].to_i, 1)
56
58
 
59
+ CreateWindowEx(
60
+ 0, L('Static'), L(''), WS_CHILD | WS_CLIPSIBLINGS,
61
+ 0, 0, 0, 0,
62
+ hwnd, FFI::Pointer.new(CTL_FOCUS), GetModuleHandle(nil), nil
63
+ )
64
+
57
65
  0
58
66
  end
59
67
 
@@ -66,6 +74,15 @@ def onDestroy(hwnd)
66
74
  PostQuitMessage(0); 0
67
75
  end
68
76
 
77
+ def onActivate(hwnd,
78
+ state, minimized,
79
+ hother
80
+ )
81
+ SetFocus(GetDlgItem(hwnd, CTL_FOCUS)) if state != WA_INACTIVE
82
+
83
+ 0
84
+ end
85
+
69
86
  def onItem1(verb,
70
87
  hctl, hwnd
71
88
  )
@@ -133,6 +150,12 @@ begin
133
150
  when WM_DESTROY
134
151
  onDestroy(hwnd)
135
152
 
153
+ when WM_ACTIVATE
154
+ onActivate(hwnd,
155
+ LOWORD(wParam), HIWORD(wParam) > 0,
156
+ FFI::Pointer.new(lParam)
157
+ )
158
+
136
159
  when WM_COMMAND
137
160
  id, verb = LOWORD(wParam), HIWORD(wParam)
138
161
  hctl = FFI::Pointer.new(lParam)
@@ -170,7 +193,9 @@ def main
170
193
  wc[:hInstance] = GetModuleHandle(nil)
171
194
  wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
172
195
  wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
173
- wc[:hbrBackground] = FFI::Pointer.new(CTLCOLOR_DLG + 1)
196
+ wc[:hbrBackground] = FFI::Pointer.new(
197
+ ((WINVER == WINXP) ? COLOR_MENUBAR : COLOR_MENU) + 1
198
+ )
174
199
 
175
200
  PWSTR(APPNAME) { |className|
176
201
  wc[:lpszClassName] = className
@@ -182,7 +207,7 @@ def main
182
207
  }
183
208
 
184
209
  hwnd = CreateWindowEx(
185
- 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW,
210
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
186
211
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
187
212
  nil, nil, GetModuleHandle(nil), FFI::Pointer.new(xtra.object_id)
188
213
  )
@@ -199,7 +224,9 @@ def main
199
224
  until DetonateLastError(-1, :GetMessage,
200
225
  msg, nil, 0, 0
201
226
  ) == 0
202
- if TranslateAccelerator(hwnd, xtra[:haccel], msg) == 0
227
+ if TranslateAccelerator(hwnd, xtra[:haccel], msg) == 0 &&
228
+ IsDialogMessage(hwnd, msg) == 0
229
+
203
230
  TranslateMessage(msg)
204
231
  DispatchMessage(msg)
205
232
  end
data/examples/Hello.rbw CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'ffi-wingui-core'
2
2
 
3
- include WinGUI
3
+ exit if defined?(Ocra)
4
4
 
5
- EnableVisualStyles()
5
+ include WinGUI
6
6
 
7
7
  MessageBox(nil,
8
8
  L('Hello, world!'),
@@ -0,0 +1,14 @@
1
+ WINGUI_VISUAL_STYLES = false
2
+ WINGUI_DPI_AWARE = false
3
+
4
+ require 'ffi-wingui-core'
5
+
6
+ exit if defined?(Ocra)
7
+
8
+ include WinGUI
9
+
10
+ MessageBox(nil,
11
+ L('Hello, world!'),
12
+ L('Hello'),
13
+ MB_ICONINFORMATION
14
+ )
@@ -1,8 +1,8 @@
1
1
  require 'ffi-wingui-core'
2
2
 
3
- include WinGUI
3
+ exit if defined?(Ocra)
4
4
 
5
- EnableVisualStyles()
5
+ include WinGUI
6
6
 
7
7
  if respond_to?(:MessageBoxTimeout)
8
8
  MessageBoxTimeout(nil,
@@ -1,8 +1,8 @@
1
1
  require 'ffi-wingui-core'
2
2
 
3
- include WinGUI
3
+ exit if defined?(Ocra)
4
4
 
5
- EnableVisualStyles()
5
+ include WinGUI
6
6
 
7
7
  APPNAME = L(File.basename(__FILE__, '.rbw'))
8
8
 
@@ -79,7 +79,9 @@ def main
79
79
  wc[:hInstance] = GetModuleHandle(nil)
80
80
  wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
81
81
  wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
82
- wc[:hbrBackground] = FFI::Pointer.new(COLOR_WINDOW + 1)
82
+ wc[:hbrBackground] = FFI::Pointer.new(
83
+ ((WINVER == WINXP) ? COLOR_MENUBAR : COLOR_MENU) + 1
84
+ )
83
85
 
84
86
  PWSTR(APPNAME) { |className|
85
87
  wc[:lpszClassName] = className
@@ -91,7 +93,7 @@ def main
91
93
  }
92
94
 
93
95
  hwnd = CreateWindowEx(
94
- 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW,
96
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
95
97
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
96
98
  nil, nil, GetModuleHandle(nil), nil
97
99
  )
@@ -1,8 +1,8 @@
1
1
  require 'ffi-wingui-core'
2
2
 
3
- include WinGUI
3
+ exit if defined?(Ocra)
4
4
 
5
- EnableVisualStyles()
5
+ include WinGUI
6
6
 
7
7
  APPNAME = L(File.basename(__FILE__, '.rbw'))
8
8
 
@@ -109,7 +109,9 @@ def main
109
109
  wc[:hInstance] = GetModuleHandle(nil)
110
110
  wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
111
111
  wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
112
- wc[:hbrBackground] = FFI::Pointer.new(COLOR_WINDOW + 1)
112
+ wc[:hbrBackground] = FFI::Pointer.new(
113
+ ((WINVER == WINXP) ? COLOR_MENUBAR : COLOR_MENU) + 1
114
+ )
113
115
 
114
116
  PWSTR(APPNAME) { |className|
115
117
  wc[:lpszClassName] = className
@@ -121,7 +123,7 @@ def main
121
123
  }
122
124
 
123
125
  hwnd = CreateWindowEx(
124
- 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW,
126
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
125
127
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
126
128
  nil, nil, GetModuleHandle(nil), nil
127
129
  )
data/examples/Menu.rbw ADDED
@@ -0,0 +1,288 @@
1
+ require 'ffi-wingui-core'
2
+
3
+ exit if defined?(Ocra)
4
+
5
+ include WinGUI
6
+
7
+ APPNAME = L(File.basename(__FILE__, '.rbw'))
8
+
9
+ CMD_ITEM1 = WM_APP + 1
10
+ CMD_ITEM2 = CMD_ITEM1 + 1
11
+ CMD_ITEM3 = CMD_ITEM2 + 1
12
+ CMD_ITEM4 = CMD_ITEM3 + 1
13
+ CMD_ITEM5 = CMD_ITEM4 + 1
14
+ CMD_ITEM6 = CMD_ITEM5 + 1
15
+ CMD_ITEM7 = CMD_ITEM6 + 1
16
+ CMD_ITEM8 = CMD_ITEM7 + 1
17
+ CMD_ITEM9 = CMD_ITEM8 + 1
18
+
19
+ WndExtra = Struct.new(
20
+ :dummy
21
+ ).send(:include, Util::Id2RefTracking)
22
+
23
+ def onCreate(hwnd,
24
+ cs
25
+ )
26
+ xtra = WndExtra::REFS[GetWindowLong(hwnd, GWL_USERDATA)]
27
+
28
+ hbar = CreateMenu()
29
+ hmenu1 = CreatePopupMenu()
30
+ AppendMenu(hmenu1, MF_STRING, CMD_ITEM1, L('Item&1'))
31
+ SetMenuDefaultItem(hmenu1, CMD_ITEM1, 0)
32
+
33
+ AppendMenu(hmenu1, MF_STRING | MF_GRAYED, CMD_ITEM2, L('Item&2'))
34
+ AppendMenu(hmenu1, MF_STRING | MF_CHECKED, CMD_ITEM3, L('Item&3'))
35
+
36
+ AppendMenu(hmenu1, MF_SEPARATOR, 0, nil)
37
+
38
+ AppendMenu(hmenu1, MF_STRING | MF_CHECKED | MFT_RADIOCHECK,
39
+ CMD_ITEM4, L('Item&4'))
40
+ AppendMenu(hmenu1, MF_STRING, CMD_ITEM5, L('Item&5'))
41
+
42
+ AppendMenu(hmenu1, MF_SEPARATOR, 0, nil)
43
+
44
+ hmenu2 = CreatePopupMenu()
45
+ AppendMenu(hmenu2, MF_STRING | MF_CHECKED | MFT_RADIOCHECK,
46
+ CMD_ITEM6, L('Item&6'))
47
+ AppendMenu(hmenu2, MF_STRING, CMD_ITEM7, L('Item&7'))
48
+ AppendMenu(hmenu1, MF_POPUP, hmenu2.to_i, L('Menu&2'))
49
+ AppendMenu(hbar, MF_POPUP, hmenu1.to_i, L('Menu&1'))
50
+
51
+ AppendMenu(hbar, MF_STRING, CMD_ITEM8, L('Item&8'))
52
+
53
+ hmenu3 = CreatePopupMenu()
54
+ AppendMenu(hmenu3, MF_STRING, CMD_ITEM9, L('Item&9'))
55
+ AppendMenu(hbar, MF_POPUP | MF_RIGHTJUSTIFY, hmenu3.to_i, L('Menu&3'))
56
+ SetMenu(hwnd, hbar)
57
+
58
+ 0
59
+ end
60
+
61
+ def onDestroy(hwnd)
62
+ xtra = WndExtra::REFS[GetWindowLong(hwnd, GWL_USERDATA)]
63
+
64
+ PostQuitMessage(0); 0
65
+ end
66
+
67
+ def onItem1(verb,
68
+ hctl, hwnd
69
+ )
70
+ hbar = GetMenu(hwnd)
71
+ i2grayed = (GetMenuState(hbar, CMD_ITEM2, 0) & MF_GRAYED) == MF_GRAYED
72
+
73
+ EnableMenuItem(hbar, CMD_ITEM2, (i2grayed) ? MF_ENABLED : MF_GRAYED)
74
+
75
+ 0
76
+ end
77
+
78
+ def onItem2(verb,
79
+ hctl, hwnd
80
+ )
81
+ MessageBox(hwnd,
82
+ L(__method__.to_s),
83
+ APPNAME,
84
+ MB_ICONINFORMATION
85
+ )
86
+
87
+ 0
88
+ end
89
+
90
+ def onItem3(verb,
91
+ hctl, hwnd
92
+ )
93
+ hbar = GetMenu(hwnd)
94
+ i3checked = (GetMenuState(hbar, CMD_ITEM3, 0) & MF_CHECKED) == MF_CHECKED
95
+
96
+ CheckMenuItem(hbar, CMD_ITEM3, (i3checked) ? MF_UNCHECKED : MF_CHECKED)
97
+
98
+ 0
99
+ end
100
+
101
+ def onItem4(verb,
102
+ hctl, hwnd
103
+ )
104
+ CheckMenuRadioItem(GetMenu(hwnd), CMD_ITEM4, CMD_ITEM5, CMD_ITEM4, 0)
105
+
106
+ 0
107
+ end
108
+
109
+ def onItem5(verb,
110
+ hctl, hwnd
111
+ )
112
+ CheckMenuRadioItem(GetMenu(hwnd), CMD_ITEM4, CMD_ITEM5, CMD_ITEM5, 0)
113
+
114
+ 0
115
+ end
116
+
117
+ def onItem6(verb,
118
+ hctl, hwnd
119
+ )
120
+ CheckMenuRadioItem(GetMenu(hwnd), CMD_ITEM6, CMD_ITEM7, CMD_ITEM6, 0)
121
+
122
+ 0
123
+ end
124
+
125
+ def onItem7(verb,
126
+ hctl, hwnd
127
+ )
128
+ CheckMenuRadioItem(GetMenu(hwnd), CMD_ITEM6, CMD_ITEM7, CMD_ITEM7, 0)
129
+
130
+ 0
131
+ end
132
+
133
+ def onItem8(verb,
134
+ hctl, hwnd
135
+ )
136
+ MessageBox(hwnd,
137
+ L(__method__.to_s),
138
+ APPNAME,
139
+ MB_ICONINFORMATION
140
+ )
141
+
142
+ 0
143
+ end
144
+
145
+ def onItem9(verb,
146
+ hctl, hwnd
147
+ )
148
+ hbar = GetMenu(hwnd)
149
+ i2grayed = (GetMenuState(hbar, CMD_ITEM2, 0) & MF_GRAYED) == MF_GRAYED
150
+ i3checked = (GetMenuState(hbar, CMD_ITEM3, 0) & MF_CHECKED) == MF_CHECKED
151
+ i4checked = (GetMenuState(hbar, CMD_ITEM4, 0) & MF_CHECKED) == MF_CHECKED
152
+ i5checked = (GetMenuState(hbar, CMD_ITEM5, 0) & MF_CHECKED) == MF_CHECKED
153
+ i6checked = (GetMenuState(hbar, CMD_ITEM6, 0) & MF_CHECKED) == MF_CHECKED
154
+ i7checked = (GetMenuState(hbar, CMD_ITEM7, 0) & MF_CHECKED) == MF_CHECKED
155
+
156
+ MessageBox(hwnd,
157
+ L("
158
+ Item2 - #{(i2grayed) ? 'grayed' : 'enabled'}
159
+ Item3 - #{(i3checked) ? 'checked' : 'unchecked'}
160
+ Item4 - #{(i4checked) ? 'checked' : 'unchecked'}
161
+ Item5 - #{(i5checked) ? 'checked' : 'unchecked'}
162
+ Item6 - #{(i6checked) ? 'checked' : 'unchecked'}
163
+ Item7 - #{(i7checked) ? 'checked' : 'unchecked'}
164
+ "),
165
+ APPNAME,
166
+ MB_ICONINFORMATION
167
+ )
168
+
169
+ 0
170
+ end
171
+
172
+ WindowProc = FFI::Function.new(:long,
173
+ [:pointer, :uint, :uint, :long],
174
+ convention: :stdcall
175
+ ) { |hwnd, uMsg, wParam, lParam|
176
+ begin
177
+ result = case uMsg
178
+ when WM_NCCREATE
179
+ DefWindowProc(hwnd, uMsg, wParam, lParam)
180
+
181
+ SetWindowLong(hwnd,
182
+ GWL_USERDATA,
183
+ CREATESTRUCT.new(FFI::Pointer.new(lParam))[:lpCreateParams].to_i
184
+ )
185
+
186
+ 1
187
+ when WM_CREATE
188
+ onCreate(hwnd, CREATESTRUCT.new(FFI::Pointer.new(lParam)))
189
+ when WM_DESTROY
190
+ onDestroy(hwnd)
191
+
192
+ when WM_COMMAND
193
+ id, verb = LOWORD(wParam), HIWORD(wParam)
194
+ hctl = FFI::Pointer.new(lParam)
195
+
196
+ case id
197
+ when CMD_ITEM1
198
+ onItem1(verb, hctl, hwnd)
199
+ when CMD_ITEM2
200
+ onItem2(verb, hctl, hwnd)
201
+ when CMD_ITEM3
202
+ onItem3(verb, hctl, hwnd)
203
+ when CMD_ITEM4
204
+ onItem4(verb, hctl, hwnd)
205
+ when CMD_ITEM5
206
+ onItem5(verb, hctl, hwnd)
207
+ when CMD_ITEM6
208
+ onItem6(verb, hctl, hwnd)
209
+ when CMD_ITEM7
210
+ onItem7(verb, hctl, hwnd)
211
+ when CMD_ITEM8
212
+ onItem8(verb, hctl, hwnd)
213
+ when CMD_ITEM9
214
+ onItem9(verb, hctl, hwnd)
215
+ end
216
+ end
217
+
218
+ result || DefWindowProc(hwnd, uMsg, wParam, lParam)
219
+ rescue
220
+ case MessageBox(hwnd,
221
+ L(Util.FormatException($!)),
222
+ APPNAME,
223
+ MB_ABORTRETRYIGNORE | MB_ICONERROR
224
+ )
225
+ when IDABORT
226
+ PostQuitMessage(2)
227
+ when IDRETRY
228
+ retry
229
+ end
230
+ end
231
+ }
232
+
233
+ def main
234
+ xtra = WndExtra.new
235
+
236
+ WNDCLASSEX.new { |wc|
237
+ wc[:cbSize] = wc.size
238
+ wc[:lpfnWndProc] = WindowProc
239
+ wc[:cbWndExtra] = FFI::Type::Builtin::POINTER.size
240
+ wc[:hInstance] = GetModuleHandle(nil)
241
+ wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
242
+ wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
243
+ wc[:hbrBackground] = FFI::Pointer.new(
244
+ ((WINVER == WINXP) ? COLOR_MENUBAR : COLOR_MENU) + 1
245
+ )
246
+
247
+ PWSTR(APPNAME) { |className|
248
+ wc[:lpszClassName] = className
249
+
250
+ DetonateLastError(0, :RegisterClassEx,
251
+ wc
252
+ )
253
+ }
254
+ }
255
+
256
+ hwnd = CreateWindowEx(
257
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
258
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
259
+ nil, nil, GetModuleHandle(nil), FFI::Pointer.new(xtra.object_id)
260
+ )
261
+
262
+ raise "CreateWindowEx failed (last error: #{GetLastError()})" if
263
+ hwnd.null? && GetLastError() != 0
264
+
265
+ exit(0) if hwnd.null?
266
+
267
+ ShowWindow(hwnd, SW_SHOWNORMAL)
268
+ UpdateWindow(hwnd)
269
+
270
+ MSG.new { |msg|
271
+ until DetonateLastError(-1, :GetMessage,
272
+ msg, nil, 0, 0
273
+ ) == 0
274
+ TranslateMessage(msg)
275
+ DispatchMessage(msg)
276
+ end
277
+
278
+ exit(msg[:wParam])
279
+ }
280
+ rescue
281
+ MessageBox(hwnd,
282
+ L(Util.FormatException($!)),
283
+ APPNAME,
284
+ MB_ICONERROR
285
+ ); exit(1)
286
+ end
287
+
288
+ main