windows_gui 2.0.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.
@@ -0,0 +1,153 @@
1
+ require 'windows_gui'
2
+
3
+ include WindowsGUI
4
+
5
+ def OnNCCreate(hwnd,
6
+ cs
7
+ )
8
+ answer = MessageBox(nil,
9
+ L('NCCreate?'),
10
+ cs[:lpszName],
11
+ MB_YESNO | MB_ICONQUESTION
12
+ )
13
+
14
+ return 0 if answer == IDNO
15
+
16
+ 1
17
+ end
18
+
19
+ def OnCreate(hwnd,
20
+ cs
21
+ )
22
+ answer = MessageBox(nil,
23
+ L('Create?'),
24
+ cs[:lpszName],
25
+ MB_YESNO | MB_ICONQUESTION
26
+ )
27
+
28
+ return -1 if answer == IDNO
29
+
30
+ 0
31
+ end
32
+
33
+ def OnClose(hwnd)
34
+ answer = MessageBox(hwnd,
35
+ L('Close?'),
36
+ APPNAME,
37
+ MB_YESNO | MB_ICONQUESTION |
38
+ MB_DEFBUTTON2
39
+ )
40
+
41
+ DestroyWindow(hwnd) if answer == IDYES
42
+
43
+ 0
44
+ end
45
+
46
+ def OnDestroy(hwnd)
47
+ MessageBox(nil,
48
+ L(__method__.to_s),
49
+ APPNAME,
50
+ MB_ICONINFORMATION
51
+ )
52
+
53
+ 0
54
+ end
55
+
56
+ def OnNCDestroy(hwnd)
57
+ MessageBox(nil,
58
+ L(__method__.to_s),
59
+ APPNAME,
60
+ MB_ICONINFORMATION
61
+ )
62
+
63
+ PostQuitMessage(0); 0
64
+ end
65
+
66
+ WindowProc = FFI::Function.new(:long,
67
+ [:pointer, :uint, :uint, :long],
68
+ convention: :stdcall
69
+ ) { |hwnd, uMsg, wParam, lParam|
70
+ begin
71
+ result = case uMsg
72
+ when WM_NCCREATE
73
+ DefWindowProc(hwnd, uMsg, wParam, lParam)
74
+
75
+ OnNCCreate(hwnd, CREATESTRUCT.new(FFI::Pointer.new(lParam)))
76
+ when WM_CREATE
77
+ OnCreate(hwnd, CREATESTRUCT.new(FFI::Pointer.new(lParam)))
78
+ when WM_CLOSE
79
+ OnClose(hwnd)
80
+ when WM_DESTROY
81
+ OnDestroy(hwnd)
82
+ when WM_NCDESTROY
83
+ OnNCDestroy(hwnd)
84
+ end
85
+
86
+ result || DefWindowProc(hwnd, uMsg, wParam, lParam)
87
+ rescue SystemExit => ex
88
+ PostQuitMessage(ex.status)
89
+ rescue
90
+ case MessageBox(hwnd,
91
+ L(Util.FormatException($!)),
92
+ APPNAME,
93
+ MB_ABORTRETRYIGNORE | MB_ICONERROR
94
+ )
95
+ when IDABORT
96
+ PostQuitMessage(2)
97
+ when IDRETRY
98
+ retry
99
+ end
100
+ end
101
+ }
102
+
103
+ def WinMain
104
+ WNDCLASSEX.new { |wc|
105
+ wc[:cbSize] = wc.size
106
+ wc[:lpfnWndProc] = WindowProc
107
+ wc[:hInstance] = GetModuleHandle(nil)
108
+ wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
109
+ wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
110
+ wc[:hbrBackground] = FFI::Pointer.new(COLOR_WINDOW + 1)
111
+
112
+ PWSTR(APPNAME) { |className|
113
+ wc[:lpszClassName] = className
114
+
115
+ DetonateLastError(0, :RegisterClassEx,
116
+ wc
117
+ )
118
+ }
119
+ }
120
+
121
+ hwnd = CreateWindowEx(
122
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
123
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
124
+ nil, nil, GetModuleHandle(nil), nil
125
+ )
126
+
127
+ raise "CreateWindowEx failed (last error: #{GetLastError()})" if
128
+ hwnd.null? && GetLastError() != 0
129
+
130
+ exit(0) if hwnd.null?
131
+
132
+ ShowWindow(hwnd, SW_SHOWNORMAL)
133
+ UpdateWindow(hwnd)
134
+
135
+ MSG.new { |msg|
136
+ until DetonateLastError(-1, :GetMessage,
137
+ msg, nil, 0, 0
138
+ ) == 0
139
+ TranslateMessage(msg)
140
+ DispatchMessage(msg)
141
+ end
142
+
143
+ exit(msg[:wParam])
144
+ }
145
+ rescue
146
+ MessageBox(hwnd,
147
+ L(Util.FormatException($!)),
148
+ APPNAME,
149
+ MB_ICONERROR
150
+ ); exit(1)
151
+ end
152
+
153
+ WinMain()
data/examples/Menu.rbw ADDED
@@ -0,0 +1,274 @@
1
+ require 'windows_gui'
2
+
3
+ include WindowsGUI
4
+
5
+ WndExtra = Struct.new(
6
+ :dummy
7
+ )
8
+
9
+ def OnCreate(hwnd,
10
+ cs
11
+ )
12
+ xtra = Util::Id2Ref[GetWindowLong(hwnd, GWL_USERDATA)]
13
+
14
+ hbar = CreateMenu()
15
+ hmenu1 = CreatePopupMenu()
16
+ AppendMenu(hmenu1, MF_STRING, CMD[:ITEM1], L('Item&1'))
17
+ SetMenuDefaultItem(hmenu1, CMD[:ITEM1], 0)
18
+
19
+ AppendMenu(hmenu1, MF_STRING | MF_GRAYED, CMD[:ITEM2], L('Item&2'))
20
+ AppendMenu(hmenu1, MF_STRING | MF_CHECKED, CMD[:ITEM3], L('Item&3'))
21
+
22
+ AppendMenu(hmenu1, MF_SEPARATOR, 0, nil)
23
+
24
+ AppendMenu(hmenu1, MF_STRING | MF_CHECKED | MFT_RADIOCHECK,
25
+ CMD[:ITEM4], L('Item&4'))
26
+ AppendMenu(hmenu1, MF_STRING, CMD[:ITEM5], L('Item&5'))
27
+
28
+ AppendMenu(hmenu1, MF_SEPARATOR, 0, nil)
29
+
30
+ hmenu2 = CreatePopupMenu()
31
+ AppendMenu(hmenu2, MF_STRING | MF_CHECKED | MFT_RADIOCHECK,
32
+ CMD[:ITEM6], L('Item&6'))
33
+ AppendMenu(hmenu2, MF_STRING, CMD[:ITEM7], L('Item&7'))
34
+ AppendMenu(hmenu1, MF_POPUP, hmenu2.to_i, L('Menu&2'))
35
+ AppendMenu(hbar, MF_POPUP, hmenu1.to_i, L('Menu&1'))
36
+
37
+ AppendMenu(hbar, MF_STRING, CMD[:ITEM8], L('Item&8!'))
38
+
39
+ hmenu3 = CreatePopupMenu()
40
+ AppendMenu(hmenu3, MF_STRING, CMD[:ITEM9], L('Item&9'))
41
+ AppendMenu(hbar, MF_POPUP | MF_RIGHTJUSTIFY, hmenu3.to_i, L('Menu&3'))
42
+ SetMenu(hwnd, hbar)
43
+
44
+ 0
45
+ end
46
+
47
+ def OnDestroy(hwnd)
48
+ xtra = Util::Id2Ref[GetWindowLong(hwnd, GWL_USERDATA)]
49
+
50
+ PostQuitMessage(0); 0
51
+ end
52
+
53
+ def OnItem1(verb,
54
+ hctl, hwnd
55
+ )
56
+ hbar = GetMenu(hwnd)
57
+ i2grayed = (GetMenuState(hbar, CMD[:ITEM2], 0) & MF_GRAYED) == MF_GRAYED
58
+
59
+ EnableMenuItem(hbar, CMD[:ITEM2], (i2grayed) ? MF_ENABLED : MF_GRAYED)
60
+
61
+ 0
62
+ end
63
+
64
+ def OnItem2(verb,
65
+ hctl, hwnd
66
+ )
67
+ MessageBox(hwnd,
68
+ L(__method__.to_s),
69
+ APPNAME,
70
+ MB_ICONINFORMATION
71
+ )
72
+
73
+ 0
74
+ end
75
+
76
+ def OnItem3(verb,
77
+ hctl, hwnd
78
+ )
79
+ hbar = GetMenu(hwnd)
80
+ i3checked = (GetMenuState(hbar, CMD[:ITEM3], 0) & MF_CHECKED) == MF_CHECKED
81
+
82
+ CheckMenuItem(hbar, CMD[:ITEM3], (i3checked) ? MF_UNCHECKED : MF_CHECKED)
83
+
84
+ 0
85
+ end
86
+
87
+ def OnItem4(verb,
88
+ hctl, hwnd
89
+ )
90
+ CheckMenuRadioItem(GetMenu(hwnd), CMD[:ITEM4], CMD[:ITEM5], CMD[:ITEM4], 0)
91
+
92
+ 0
93
+ end
94
+
95
+ def OnItem5(verb,
96
+ hctl, hwnd
97
+ )
98
+ CheckMenuRadioItem(GetMenu(hwnd), CMD[:ITEM4], CMD[:ITEM5], CMD[:ITEM5], 0)
99
+
100
+ 0
101
+ end
102
+
103
+ def OnItem6(verb,
104
+ hctl, hwnd
105
+ )
106
+ CheckMenuRadioItem(GetMenu(hwnd), CMD[:ITEM6], CMD[:ITEM7], CMD[:ITEM6], 0)
107
+
108
+ 0
109
+ end
110
+
111
+ def OnItem7(verb,
112
+ hctl, hwnd
113
+ )
114
+ CheckMenuRadioItem(GetMenu(hwnd), CMD[:ITEM6], CMD[:ITEM7], CMD[:ITEM7], 0)
115
+
116
+ 0
117
+ end
118
+
119
+ def OnItem8(verb,
120
+ hctl, hwnd
121
+ )
122
+ MessageBox(hwnd,
123
+ L(__method__.to_s),
124
+ APPNAME,
125
+ MB_ICONINFORMATION
126
+ )
127
+
128
+ 0
129
+ end
130
+
131
+ def OnItem9(verb,
132
+ hctl, hwnd
133
+ )
134
+ hbar = GetMenu(hwnd)
135
+ i2grayed = (GetMenuState(hbar, CMD[:ITEM2], 0) & MF_GRAYED) == MF_GRAYED
136
+ i3checked = (GetMenuState(hbar, CMD[:ITEM3], 0) & MF_CHECKED) == MF_CHECKED
137
+ i4checked = (GetMenuState(hbar, CMD[:ITEM4], 0) & MF_CHECKED) == MF_CHECKED
138
+ i5checked = (GetMenuState(hbar, CMD[:ITEM5], 0) & MF_CHECKED) == MF_CHECKED
139
+ i6checked = (GetMenuState(hbar, CMD[:ITEM6], 0) & MF_CHECKED) == MF_CHECKED
140
+ i7checked = (GetMenuState(hbar, CMD[:ITEM7], 0) & MF_CHECKED) == MF_CHECKED
141
+
142
+ MessageBox(hwnd,
143
+ L("
144
+ Item2 - #{(i2grayed) ? 'grayed' : 'enabled'}
145
+ Item3 - #{(i3checked) ? 'checked' : 'unchecked'}
146
+ Item4 - #{(i4checked) ? 'checked' : 'unchecked'}
147
+ Item5 - #{(i5checked) ? 'checked' : 'unchecked'}
148
+ Item6 - #{(i6checked) ? 'checked' : 'unchecked'}
149
+ Item7 - #{(i7checked) ? 'checked' : 'unchecked'}
150
+ "),
151
+ APPNAME,
152
+ MB_ICONINFORMATION
153
+ )
154
+
155
+ 0
156
+ end
157
+
158
+ WindowProc = FFI::Function.new(:long,
159
+ [:pointer, :uint, :uint, :long],
160
+ convention: :stdcall
161
+ ) { |hwnd, uMsg, wParam, lParam|
162
+ begin
163
+ result = case uMsg
164
+ when WM_NCCREATE
165
+ DefWindowProc(hwnd, uMsg, wParam, lParam)
166
+
167
+ SetWindowLong(hwnd,
168
+ GWL_USERDATA,
169
+ CREATESTRUCT.new(FFI::Pointer.new(lParam))[:lpCreateParams].to_i
170
+ )
171
+
172
+ 1
173
+ when WM_CREATE
174
+ OnCreate(hwnd, CREATESTRUCT.new(FFI::Pointer.new(lParam)))
175
+ when WM_DESTROY
176
+ OnDestroy(hwnd)
177
+
178
+ when WM_COMMAND
179
+ id, verb = LOWORD(wParam), HIWORD(wParam)
180
+ hctl = FFI::Pointer.new(lParam)
181
+
182
+ case id
183
+ when CMD[:ITEM1]
184
+ OnItem1(verb, hctl, hwnd)
185
+ when CMD[:ITEM2]
186
+ OnItem2(verb, hctl, hwnd)
187
+ when CMD[:ITEM3]
188
+ OnItem3(verb, hctl, hwnd)
189
+ when CMD[:ITEM4]
190
+ OnItem4(verb, hctl, hwnd)
191
+ when CMD[:ITEM5]
192
+ OnItem5(verb, hctl, hwnd)
193
+ when CMD[:ITEM6]
194
+ OnItem6(verb, hctl, hwnd)
195
+ when CMD[:ITEM7]
196
+ OnItem7(verb, hctl, hwnd)
197
+ when CMD[:ITEM8]
198
+ OnItem8(verb, hctl, hwnd)
199
+ when CMD[:ITEM9]
200
+ OnItem9(verb, hctl, hwnd)
201
+ end
202
+ end
203
+
204
+ result || DefWindowProc(hwnd, uMsg, wParam, lParam)
205
+ rescue SystemExit => ex
206
+ PostQuitMessage(ex.status)
207
+ rescue
208
+ case MessageBox(hwnd,
209
+ L(Util.FormatException($!)),
210
+ APPNAME,
211
+ MB_ABORTRETRYIGNORE | MB_ICONERROR
212
+ )
213
+ when IDABORT
214
+ PostQuitMessage(2)
215
+ when IDRETRY
216
+ retry
217
+ end
218
+ end
219
+ }
220
+
221
+ def WinMain
222
+ Util.Id2RefTrack(xtra = WndExtra.new)
223
+
224
+ WNDCLASSEX.new { |wc|
225
+ wc[:cbSize] = wc.size
226
+ wc[:lpfnWndProc] = WindowProc
227
+ wc[:cbWndExtra] = FFI::Type::Builtin::POINTER.size
228
+ wc[:hInstance] = GetModuleHandle(nil)
229
+ wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
230
+ wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
231
+ wc[:hbrBackground] = FFI::Pointer.new(COLOR_WINDOW + 1)
232
+
233
+ PWSTR(APPNAME) { |className|
234
+ wc[:lpszClassName] = className
235
+
236
+ DetonateLastError(0, :RegisterClassEx,
237
+ wc
238
+ )
239
+ }
240
+ }
241
+
242
+ hwnd = CreateWindowEx(
243
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
244
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
245
+ nil, nil, GetModuleHandle(nil), FFI::Pointer.new(xtra.object_id)
246
+ )
247
+
248
+ raise "CreateWindowEx failed (last error: #{GetLastError()})" if
249
+ hwnd.null? && GetLastError() != 0
250
+
251
+ exit(0) if hwnd.null?
252
+
253
+ ShowWindow(hwnd, SW_SHOWNORMAL)
254
+ UpdateWindow(hwnd)
255
+
256
+ MSG.new { |msg|
257
+ until DetonateLastError(-1, :GetMessage,
258
+ msg, nil, 0, 0
259
+ ) == 0
260
+ TranslateMessage(msg)
261
+ DispatchMessage(msg)
262
+ end
263
+
264
+ exit(msg[:wParam])
265
+ }
266
+ rescue
267
+ MessageBox(hwnd,
268
+ L(Util.FormatException($!)),
269
+ APPNAME,
270
+ MB_ICONERROR
271
+ ); exit(1)
272
+ end
273
+
274
+ WinMain()
@@ -0,0 +1,158 @@
1
+ require 'windows_gui'
2
+
3
+ include WindowsGUI
4
+
5
+ WndExtra = Struct.new(
6
+ :hcm
7
+ )
8
+
9
+ def OnCreate(hwnd,
10
+ cs
11
+ )
12
+ xtra = Util::Id2Ref[GetWindowLong(hwnd, GWL_USERDATA)]
13
+
14
+ xtra[:hcm] = CreatePopupMenu()
15
+ AppendMenu(xtra[:hcm], MF_STRING, CMD[:ITEM1], L('Item&1'))
16
+
17
+ 0
18
+ end
19
+
20
+ def OnDestroy(hwnd)
21
+ xtra = Util::Id2Ref[GetWindowLong(hwnd, GWL_USERDATA)]
22
+
23
+ DestroyMenu(xtra[:hcm])
24
+
25
+ PostQuitMessage(0); 0
26
+ end
27
+
28
+ def OnContextMenu(hwnd,
29
+ x, y
30
+ )
31
+ xtra = Util::Id2Ref[GetWindowLong(hwnd, GWL_USERDATA)]
32
+
33
+ POINT.new { |point|
34
+ GetCursorPos(point)
35
+
36
+ x, y = point.values
37
+ } if x == -1
38
+
39
+ TrackPopupMenu(xtra[:hcm], TPM_RIGHTBUTTON, x, y, 0, hwnd, nil)
40
+
41
+ 0
42
+ end
43
+
44
+ def OnItem1(verb,
45
+ hctl, hwnd
46
+ )
47
+ MessageBox(hwnd,
48
+ L(__method__.to_s),
49
+ APPNAME,
50
+ MB_ICONINFORMATION
51
+ )
52
+
53
+ 0
54
+ end
55
+
56
+ WindowProc = FFI::Function.new(:long,
57
+ [:pointer, :uint, :uint, :long],
58
+ convention: :stdcall
59
+ ) { |hwnd, uMsg, wParam, lParam|
60
+ begin
61
+ result = case uMsg
62
+ when WM_NCCREATE
63
+ DefWindowProc(hwnd, uMsg, wParam, lParam)
64
+
65
+ SetWindowLong(hwnd,
66
+ GWL_USERDATA,
67
+ CREATESTRUCT.new(FFI::Pointer.new(lParam))[:lpCreateParams].to_i
68
+ )
69
+
70
+ 1
71
+ when WM_CREATE
72
+ OnCreate(hwnd, CREATESTRUCT.new(FFI::Pointer.new(lParam)))
73
+ when WM_DESTROY
74
+ OnDestroy(hwnd)
75
+
76
+ when WM_CONTEXTMENU
77
+ OnContextMenu(hwnd, LOSHORT(lParam), HISHORT(lParam))
78
+ when WM_COMMAND
79
+ id, verb = LOWORD(wParam), HIWORD(wParam)
80
+ hctl = FFI::Pointer.new(lParam)
81
+
82
+ case id
83
+ when CMD[:ITEM1]
84
+ OnItem1(verb, hctl, hwnd)
85
+ end
86
+ end
87
+
88
+ result || DefWindowProc(hwnd, uMsg, wParam, lParam)
89
+ rescue SystemExit => ex
90
+ PostQuitMessage(ex.status)
91
+ rescue
92
+ case MessageBox(hwnd,
93
+ L(Util.FormatException($!)),
94
+ APPNAME,
95
+ MB_ABORTRETRYIGNORE | MB_ICONERROR
96
+ )
97
+ when IDABORT
98
+ PostQuitMessage(2)
99
+ when IDRETRY
100
+ retry
101
+ end
102
+ end
103
+ }
104
+
105
+ def WinMain
106
+ Util.Id2RefTrack(xtra = WndExtra.new)
107
+
108
+ WNDCLASSEX.new { |wc|
109
+ wc[:cbSize] = wc.size
110
+ wc[:lpfnWndProc] = WindowProc
111
+ wc[:cbWndExtra] = FFI::Type::Builtin::POINTER.size
112
+ wc[:hInstance] = GetModuleHandle(nil)
113
+ wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
114
+ wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
115
+ wc[:hbrBackground] = FFI::Pointer.new(COLOR_WINDOW + 1)
116
+
117
+ PWSTR(APPNAME) { |className|
118
+ wc[:lpszClassName] = className
119
+
120
+ DetonateLastError(0, :RegisterClassEx,
121
+ wc
122
+ )
123
+ }
124
+ }
125
+
126
+ hwnd = CreateWindowEx(
127
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
128
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
129
+ nil, nil, GetModuleHandle(nil), FFI::Pointer.new(xtra.object_id)
130
+ )
131
+
132
+ raise "CreateWindowEx failed (last error: #{GetLastError()})" if
133
+ hwnd.null? && GetLastError() != 0
134
+
135
+ exit(0) if hwnd.null?
136
+
137
+ ShowWindow(hwnd, SW_SHOWNORMAL)
138
+ UpdateWindow(hwnd)
139
+
140
+ MSG.new { |msg|
141
+ until DetonateLastError(-1, :GetMessage,
142
+ msg, nil, 0, 0
143
+ ) == 0
144
+ TranslateMessage(msg)
145
+ DispatchMessage(msg)
146
+ end
147
+
148
+ exit(msg[:wParam])
149
+ }
150
+ rescue
151
+ MessageBox(hwnd,
152
+ L(Util.FormatException($!)),
153
+ APPNAME,
154
+ MB_ICONERROR
155
+ ); exit(1)
156
+ end
157
+
158
+ WinMain()