ffi-wingui-core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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