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/Minimal.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
  APPNAME = L(File.basename(__FILE__, '.rbw'))
8
8
 
@@ -42,7 +42,9 @@ def main
42
42
  wc[:hInstance] = GetModuleHandle(nil)
43
43
  wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
44
44
  wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
45
- wc[:hbrBackground] = FFI::Pointer.new(COLOR_WINDOW + 1)
45
+ wc[:hbrBackground] = FFI::Pointer.new(
46
+ ((WINVER == WINXP) ? COLOR_MENUBAR : COLOR_MENU) + 1
47
+ )
46
48
 
47
49
  PWSTR(APPNAME) { |className|
48
50
  wc[:lpszClassName] = className
@@ -54,7 +56,7 @@ def main
54
56
  }
55
57
 
56
58
  hwnd = CreateWindowEx(
57
- 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW,
59
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
58
60
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
59
61
  nil, nil, GetModuleHandle(nil), nil
60
62
  )
@@ -1,29 +1,15 @@
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
  WndExtra = Struct.new(
10
10
  :scribbles,
11
11
  :hpen
12
- )
13
-
14
- class WndExtra
15
- REFS = {}
16
-
17
- def initialize(*args)
18
- super
19
-
20
- REFS[object_id] = self
21
-
22
- ObjectSpace.define_finalizer(self, -> id {
23
- REFS.delete(id)
24
- })
25
- end
26
- end
12
+ ).send(:include, Util::Id2RefTracking)
27
13
 
28
14
  def onCreate(hwnd,
29
15
  cs
@@ -212,7 +198,7 @@ def main
212
198
  }
213
199
 
214
200
  hwnd = CreateWindowEx(
215
- 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW,
201
+ WS_EX_CLIENTEDGE, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
216
202
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
217
203
  nil, nil, GetModuleHandle(nil), FFI::Pointer.new(xtra.object_id)
218
204
  )
@@ -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
 
@@ -78,7 +78,9 @@ def main
78
78
  wc[:hInstance] = GetModuleHandle(nil)
79
79
  wc[:hIcon] = LoadIcon(nil, IDI_APPLICATION)
80
80
  wc[:hCursor] = LoadCursor(nil, IDC_ARROW)
81
- wc[:hbrBackground] = FFI::Pointer.new(COLOR_WINDOW + 1)
81
+ wc[:hbrBackground] = FFI::Pointer.new(
82
+ ((WINVER == WINXP) ? COLOR_MENUBAR : COLOR_MENU) + 1
83
+ )
82
84
 
83
85
  PWSTR(APPNAME) { |className|
84
86
  wc[:lpszClassName] = className
@@ -90,7 +92,7 @@ def main
90
92
  }
91
93
 
92
94
  hwnd = CreateWindowEx(
93
- 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW,
95
+ 0, APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
94
96
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
95
97
  nil, nil, GetModuleHandle(nil), FFI::Pointer.new(xtra.object_id)
96
98
  )
Binary file
@@ -29,6 +29,14 @@ module WinGUI
29
29
  end
30
30
  end
31
31
 
32
+ unless FFI::Struct.respond_to?(:by_ref)
33
+ class << FFI::Struct
34
+ def by_ref(*args)
35
+ FFI::Type::Builtin::POINTER
36
+ end
37
+ end
38
+ end
39
+
32
40
  module ScopedStruct
33
41
  def new(*args)
34
42
  raise ArgumentError, 'Cannot accept both arguments and a block' if
@@ -51,7 +59,9 @@ module WinGUI
51
59
  end
52
60
  end
53
61
 
62
+ #{ INVALID_xxx
54
63
  INVALID_HANDLE_VALUE = FFI::Pointer.new(-1)
64
+ #}
55
65
 
56
66
  def MAKEWORD(lobyte, hibyte)
57
67
  (lobyte & 0xff) | ((hibyte & 0xff) << 8)
@@ -65,6 +75,8 @@ module WinGUI
65
75
  (word >> 8) & 0xff
66
76
  end
67
77
 
78
+ module_function :MAKEWORD, :LOBYTE, :HIBYTE
79
+
68
80
  def MAKELONG(loword, hiword)
69
81
  (loword & 0xffff) | ((hiword & 0xffff) << 16)
70
82
  end
@@ -77,9 +89,7 @@ module WinGUI
77
89
  (long >> 16) & 0xffff
78
90
  end
79
91
 
80
- module_function \
81
- :MAKEWORD, :LOBYTE, :HIBYTE,
82
- :MAKELONG, :LOWORD, :HIWORD
92
+ module_function :MAKELONG, :LOWORD, :HIWORD
83
93
 
84
94
  def L(str)
85
95
  (str << "\0").encode!('utf-16le')
@@ -184,7 +194,7 @@ module WinGUI
184
194
  end
185
195
 
186
196
  attach_function :GetVersionEx, :GetVersionExW, [
187
- :pointer # OSVERSIONINFOEX.by_ref
197
+ OSVERSIONINFOEX.by_ref
188
198
  ], :int
189
199
 
190
200
  OSVERSION = OSVERSIONINFOEX.new.tap { |ovi|
@@ -249,14 +259,6 @@ module WinGUI
249
259
 
250
260
  WINVER = HIWORD(NTDDI_VERSION)
251
261
 
252
- if WINVER == WIN2K
253
- class << FFI::Struct
254
- def by_ref(*args)
255
- FFI::Type::Builtin::POINTER
256
- end
257
- end
258
- end
259
-
260
262
  attach_function :GetModuleHandle, :GetModuleHandleW, [
261
263
  :buffer_in
262
264
  ], :pointer
@@ -375,6 +377,9 @@ module WinGUI
375
377
 
376
378
  module_function :EnableVisualStyles
377
379
 
380
+ EnableVisualStyles() unless
381
+ Object.const_defined?(:WINGUI_VISUAL_STYLES) && !WINGUI_VISUAL_STYLES
382
+
378
383
  attach_function :MulDiv, [
379
384
  :int,
380
385
  :int,
@@ -535,7 +540,7 @@ module WinGUI
535
540
  ], :int
536
541
 
537
542
  Detonate(0, :SetProcessDPIAware) unless
538
- Object.const_defined?(:DPI_AWARE) && !DPI_AWARE
543
+ Object.const_defined?(:WINGUI_DPI_AWARE) && !WINGUI_DPI_AWARE
539
544
  end
540
545
 
541
546
  attach_function :GetDC, [
@@ -682,6 +687,7 @@ module WinGUI
682
687
  :ulong
683
688
  ], :int
684
689
  rescue FFI::NotFoundError # MessageBoxTimeout is undocumented
690
+
685
691
  end
686
692
  end
687
693
 
@@ -713,6 +719,30 @@ module WinGUI
713
719
  :long
714
720
  ], :long
715
721
 
722
+ #{ IMAGE_xxx
723
+ IMAGE_BITMAP = 0
724
+ IMAGE_ICON = 1
725
+ IMAGE_CURSOR = 2
726
+ #}
727
+
728
+ #{ LR_xxx
729
+ LR_SHARED = 0x00008000
730
+ LR_LOADFROMFILE = 0x00000010
731
+ LR_CREATEDIBSECTION = 0x00002000
732
+ LR_LOADTRANSPARENT = 0x00000020
733
+ LR_LOADMAP3DCOLORS = 0x00001000
734
+ LR_DEFAULTSIZE = 0x00000040
735
+ #}
736
+
737
+ attach_function :LoadImage, :LoadImageW, [
738
+ :pointer,
739
+ :buffer_in,
740
+ :uint,
741
+ :int,
742
+ :int,
743
+ :uint
744
+ ], :pointer
745
+
716
746
  #{ IDI_xxx
717
747
  IDI_WINLOGO = FFI::Pointer.new(32517)
718
748
  IDI_APPLICATION = FFI::Pointer.new(32512)
@@ -732,11 +762,16 @@ module WinGUI
732
762
  ], :pointer
733
763
 
734
764
  #{ IDC_xxx
735
- IDC_ARROW = FFI::Pointer.new(32512)
736
765
  IDC_WAIT = FFI::Pointer.new(32514)
737
766
  IDC_APPSTARTING = FFI::Pointer.new(32650)
767
+
768
+ IDC_ARROW = FFI::Pointer.new(32512)
738
769
  IDC_HAND = FFI::Pointer.new(32649)
770
+ IDC_IBEAM = FFI::Pointer.new(32513)
739
771
  IDC_CROSS = FFI::Pointer.new(32515)
772
+ IDC_HELP = FFI::Pointer.new(32651)
773
+ IDC_NO = FFI::Pointer.new(32648)
774
+
740
775
  IDC_SIZEALL = FFI::Pointer.new(32646)
741
776
  IDC_SIZENS = FFI::Pointer.new(32645)
742
777
  IDC_SIZEWE = FFI::Pointer.new(32644)
@@ -749,11 +784,23 @@ module WinGUI
749
784
  :buffer_in
750
785
  ], :pointer
751
786
 
752
- #{ COLOR/CTLCOLOR_xxx
787
+ attach_function :SetCursorPos, [
788
+ :int,
789
+ :int
790
+ ], :int
791
+
792
+ attach_function :GetCursorPos, [
793
+ POINT.by_ref(:out)
794
+ ], :int
795
+
796
+ #{ COLOR_xxx
753
797
  COLOR_DESKTOP = 1
754
798
  COLOR_APPWORKSPACE = 12
755
799
  COLOR_WINDOW = 5
756
- CTLCOLOR_DLG = 4
800
+ if WINVER >= WINXP
801
+ COLOR_MENUBAR = 30
802
+ end
803
+ COLOR_MENU = 4
757
804
  #}
758
805
 
759
806
  class WNDCLASSEX < FFI::Struct
@@ -789,6 +836,32 @@ module WinGUI
789
836
  WNDCLASSEX.by_ref(:out)
790
837
  ], :int
791
838
 
839
+ #{ WS_EX_xxx
840
+ WS_EX_WINDOWEDGE = 0x00000100
841
+ WS_EX_CLIENTEDGE = 0x00000200
842
+ WS_EX_STATICEDGE = 0x00020000
843
+ WS_EX_DLGMODALFRAME = 0x00000001
844
+ WS_EX_CONTEXTHELP = 0x00000400
845
+ WS_EX_ACCEPTFILES = 0x00000010
846
+
847
+ WS_EX_TOPMOST = 0x00000008
848
+ WS_EX_LAYERED = 0x00080000
849
+ if WINVER >= WINXP
850
+ WS_EX_COMPOSITED = 0x02000000
851
+ end
852
+ WS_EX_TRANSPARENT = 0x00000020
853
+
854
+ WS_EX_NOPARENTNOTIFY = 0x00000004
855
+
856
+ WS_EX_APPWINDOW = 0x00040000
857
+ WS_EX_OVERLAPPEDWINDOW = \
858
+ WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE
859
+ WS_EX_TOOLWINDOW = 0x00000080
860
+ WS_EX_PALETTEWINDOW = WS_EX_TOOLWINDOW |
861
+ WS_EX_WINDOWEDGE | WS_EX_TOPMOST
862
+ WS_EX_CONTROLPARENT = 0x00010000
863
+ #}
864
+
792
865
  #{ WS_xxx
793
866
  WS_BORDER = 0x00800000
794
867
  WS_DLGFRAME = 0x00400000
@@ -799,24 +872,24 @@ module WinGUI
799
872
  WS_MAXIMIZEBOX = 0x00010000
800
873
  WS_HSCROLL = 0x00100000
801
874
  WS_VSCROLL = 0x00200000
875
+
802
876
  WS_DISABLED = 0x08000000
803
877
  WS_VISIBLE = 0x10000000
804
878
  WS_MINIMIZE = 0x20000000
805
879
  WS_MAXIMIZE = 0x01000000
806
880
  WS_CLIPCHILDREN = 0x02000000
807
- WS_CLIPSIBLINGS = 0x04000000
881
+
808
882
  WS_GROUP = 0x00020000
809
883
  WS_TABSTOP = 0x00010000
884
+ WS_CLIPSIBLINGS = 0x04000000
810
885
 
811
886
  WS_OVERLAPPED = 0x00000000
812
887
  WS_OVERLAPPEDWINDOW = WS_OVERLAPPED |
813
888
  WS_CAPTION | WS_SYSMENU |
814
889
  WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
815
-
816
890
  WS_POPUP = 0x80000000
817
891
  WS_POPUPWINDOW = WS_POPUP |
818
892
  WS_BORDER | WS_SYSMENU
819
-
820
893
  WS_CHILD = 0x40000000
821
894
  WS_CHILDWINDOW = WS_CHILD
822
895
  #}
@@ -881,13 +954,13 @@ module WinGUI
881
954
  ], :int
882
955
 
883
956
  #{ GWL_xxx
957
+ GWL_WNDPROC = -4
884
958
  GWL_EXSTYLE = -20
885
959
  GWL_STYLE = -16
886
960
  GWL_HWNDPARENT = -8
887
961
  GWL_ID = -12
888
962
  GWL_HINSTANCE = -6
889
963
  GWL_USERDATA = -21
890
- GWL_WNDPROC = -4
891
964
  #}
892
965
 
893
966
  attach_function :SetWindowLong, :SetWindowLongW, [
@@ -917,11 +990,8 @@ module WinGUI
917
990
  #{ SW_xxx
918
991
  SW_HIDE = 0
919
992
  SW_SHOW = 5
920
- SW_SHOWNA = 8
921
993
  SW_SHOWNORMAL = 1
922
- SW_SHOWNOACTIVATE = 4
923
994
  SW_SHOWMINIMIZED = 2
924
- SW_SHOWMINNOACTIVE = 7
925
995
  SW_SHOWMAXIMIZED = 3
926
996
  SW_RESTORE = 9
927
997
  #}
@@ -939,21 +1009,11 @@ module WinGUI
939
1009
  #}
940
1010
 
941
1011
  #{ SWP_xxx
942
- SWP_NOSIZE = 0x0001
943
- SWP_NOMOVE = 0x0002
944
- SWP_NOZORDER = 0x0004
945
- SWP_NOREDRAW = 0x0008
946
- SWP_NOACTIVATE = 0x0010
947
1012
  SWP_FRAMECHANGED = 0x0020
948
- SWP_SHOWWINDOW = 0x0040
949
- SWP_HIDEWINDOW = 0x0080
950
- SWP_NOCOPYBITS = 0x0100
951
1013
  SWP_NOOWNERZORDER = 0x0200
952
- SWP_NOSENDCHANGING = 0x0400
953
- SWP_DRAWFRAME = SWP_FRAMECHANGED
954
- SWP_NOREPOSITION = SWP_NOOWNERZORDER
955
- SWP_DEFERERASE = 0x2000
956
- SWP_ASYNCWINDOWPOS = 0x4000
1014
+ SWP_NOZORDER = 0x0004
1015
+ SWP_NOMOVE = 0x0002
1016
+ SWP_NOSIZE = 0x0001
957
1017
  #}
958
1018
 
959
1019
  attach_function :SetWindowPos, [
@@ -995,10 +1055,6 @@ module WinGUI
995
1055
  RECT.by_ref(:out)
996
1056
  ], :int
997
1057
 
998
- attach_function :GetCursorPos, [
999
- POINT.by_ref(:out)
1000
- ], :int
1001
-
1002
1058
  attach_function :ScreenToClient, [
1003
1059
  :pointer,
1004
1060
  POINT.by_ref
@@ -1015,28 +1071,16 @@ module WinGUI
1015
1071
  :int
1016
1072
  ], :int
1017
1073
 
1018
- attach_function :UpdateWindow, [
1019
- :pointer
1020
- ], :int
1021
-
1022
- attach_function :SetCapture, [
1023
- :pointer
1024
- ], :pointer
1025
-
1026
- attach_function :ReleaseCapture, [
1027
-
1028
- ], :int
1029
-
1030
- attach_function :GetCapture, [
1031
-
1032
- ], :pointer
1033
-
1034
1074
  attach_function :GetUpdateRect, [
1035
1075
  :pointer,
1036
1076
  RECT.by_ref(:out),
1037
1077
  :int
1038
1078
  ], :int
1039
1079
 
1080
+ attach_function :UpdateWindow, [
1081
+ :pointer
1082
+ ], :int
1083
+
1040
1084
  class PAINTSTRUCT < FFI::Struct
1041
1085
  extend Util::ScopedStruct
1042
1086
 
@@ -1059,6 +1103,18 @@ module WinGUI
1059
1103
  PAINTSTRUCT.by_ref(:in)
1060
1104
  ], :int
1061
1105
 
1106
+ attach_function :SetCapture, [
1107
+ :pointer
1108
+ ], :pointer
1109
+
1110
+ attach_function :ReleaseCapture, [
1111
+
1112
+ ], :int
1113
+
1114
+ attach_function :GetCapture, [
1115
+
1116
+ ], :pointer
1117
+
1062
1118
  attach_function :SetMenu, [
1063
1119
  :pointer,
1064
1120
  :pointer
@@ -1077,6 +1133,18 @@ module WinGUI
1077
1133
  :int
1078
1134
  ], :pointer
1079
1135
 
1136
+ attach_function :GetDlgCtrlID, [
1137
+ :pointer
1138
+ ], :int
1139
+
1140
+ attach_function :SetFocus, [
1141
+ :pointer
1142
+ ], :pointer
1143
+
1144
+ attach_function :GetFocus, [
1145
+
1146
+ ], :pointer
1147
+
1080
1148
  #{ HWND_xxx
1081
1149
  HWND_BROADCAST = FFI::Pointer.new(0xffff)
1082
1150
  #}
@@ -1108,34 +1176,45 @@ module WinGUI
1108
1176
  WM_DESTROY = 0x0002
1109
1177
  WM_NCDESTROY = 0x0082
1110
1178
 
1179
+ #{ WA_xxx
1180
+ WA_INACTIVE = 0
1181
+ WA_ACTIVE = 1
1182
+ WA_CLICKACTIVE = 2
1183
+ #}
1184
+
1185
+ WM_ACTIVATE = 0x0006
1186
+
1111
1187
  WM_SETFONT = 0x0030
1112
1188
  WM_GETFONT = 0x0031
1113
1189
 
1114
1190
  WM_PAINT = 0x000F
1115
1191
 
1116
1192
  def GET_X_LPARAM(lParam)
1117
- ((x = LOWORD(lParam)) > 0x7fff) ?
1118
- x - 0x1_0000 :
1119
- x
1193
+ ((x = LOWORD(lParam)) > 0x7fff) ? x - 0x1_0000 : x
1120
1194
  end
1121
1195
 
1122
1196
  def GET_Y_LPARAM(lParam)
1123
- ((y = HIWORD(lParam)) > 0x7fff) ?
1124
- y - 0x1_0000 :
1125
- y
1197
+ ((y = HIWORD(lParam)) > 0x7fff) ? y - 0x1_0000 : y
1126
1198
  end
1127
1199
 
1200
+ module_function :GET_X_LPARAM, :GET_Y_LPARAM
1201
+
1128
1202
  WM_LBUTTONDOWN = 0x0201
1129
1203
  WM_LBUTTONUP = 0x0202
1130
1204
  WM_LBUTTONDBLCLK = 0x0203
1205
+
1131
1206
  WM_RBUTTONDOWN = 0x0204
1132
1207
  WM_RBUTTONUP = 0x0205
1133
1208
  WM_RBUTTONDBLCLK = 0x0206
1209
+
1134
1210
  WM_MBUTTONDOWN = 0x0207
1135
1211
  WM_MBUTTONUP = 0x0208
1136
1212
  WM_MBUTTONDBLCLK = 0x0209
1213
+
1137
1214
  WM_MOUSEMOVE = 0x0200
1138
1215
 
1216
+ WM_CONTEXTMENU = 0x007B
1217
+
1139
1218
  WM_COMMAND = 0x0111
1140
1219
 
1141
1220
  class NMHDR < FFI::Struct
@@ -1149,6 +1228,7 @@ module WinGUI
1149
1228
 
1150
1229
  WM_NOTIFY = 0x004E
1151
1230
 
1231
+ WM_USER = 0x0400
1152
1232
  WM_APP = 0x8000
1153
1233
  #}
1154
1234
 
@@ -1229,6 +1309,7 @@ module WinGUI
1229
1309
  MF_MENUBARBREAK = 0x00000020
1230
1310
  MF_MENUBREAK = 0x00000040
1231
1311
  MF_RIGHTJUSTIFY = 0x00004000
1312
+
1232
1313
  MF_ENABLED = 0x00000000
1233
1314
  MF_DISABLED = 0x00000002
1234
1315
  MF_GRAYED = 0x00000001
@@ -1246,6 +1327,23 @@ module WinGUI
1246
1327
  :buffer_in
1247
1328
  ], :int
1248
1329
 
1330
+ attach_function :SetMenuDefaultItem, [
1331
+ :pointer,
1332
+ :uint,
1333
+ :uint
1334
+ ], :int
1335
+
1336
+ #{ GMDI_xxx
1337
+ GMDI_USEDISABLED = 0x0001
1338
+ GMDI_GOINTOPOPUPS = 0x0002
1339
+ #}
1340
+
1341
+ attach_function :GetMenuDefaultItem, [
1342
+ :pointer,
1343
+ :uint,
1344
+ :uint
1345
+ ], :uint
1346
+
1249
1347
  #{ MF_xxx
1250
1348
  MF_BYCOMMAND = 0x00000000
1251
1349
  MF_BYPOSITION = 0x00000400
@@ -1284,6 +1382,79 @@ module WinGUI
1284
1382
  :uint
1285
1383
  ], :uint
1286
1384
 
1385
+ MIIM_STATE = 0x00000001
1386
+ MIIM_ID = 0x00000002
1387
+ MIIM_SUBMENU = 0x00000004
1388
+ MIIM_CHECKMARKS = 0x00000008
1389
+ MIIM_TYPE = 0x00000010
1390
+ MIIM_DATA = 0x00000020
1391
+ MIIM_STRING = 0x00000040
1392
+ MIIM_BITMAP = 0x00000080
1393
+ MIIM_FTYPE = 0x00000100
1394
+
1395
+ class MENUITEMINFO < FFI::Struct
1396
+ extend Util::ScopedStruct
1397
+
1398
+ layout \
1399
+ :cbSize, :uint,
1400
+ :fMask, :uint,
1401
+ :fType, :uint,
1402
+ :fState, :uint,
1403
+ :wID, :uint,
1404
+ :hSubMenu, :pointer,
1405
+ :hbmpChecked, :pointer,
1406
+ :hbmpUnchecked, :pointer,
1407
+ :dwItemData, :ulong,
1408
+ :dwTypeData, :pointer,
1409
+ :cch, :uint,
1410
+ :hbmpItem, :pointer
1411
+ end
1412
+
1413
+ attach_function :SetMenuItemInfo, :SetMenuItemInfoW, [
1414
+ :pointer,
1415
+ :uint,
1416
+ :int,
1417
+ MENUITEMINFO.by_ref(:in)
1418
+ ], :int
1419
+
1420
+ attach_function :GetMenuItemInfo, :GetMenuItemInfoW, [
1421
+ :pointer,
1422
+ :uint,
1423
+ :int,
1424
+ MENUITEMINFO.by_ref
1425
+ ], :int
1426
+
1427
+ #{ TPM_xxx
1428
+ TPM_LEFTBUTTON = 0x0000
1429
+ TPM_RIGHTBUTTON = 0x0002
1430
+
1431
+ TPM_LEFTALIGN = 0x0000
1432
+ TPM_CENTERALIGN = 0x0004
1433
+ TPM_RIGHTALIGN = 0x0008
1434
+
1435
+ TPM_TOPALIGN = 0x0000
1436
+ TPM_VCENTERALIGN = 0x0010
1437
+ TPM_BOTTOMALIGN = 0x0020
1438
+
1439
+ TPM_HORIZONTAL = 0x0000
1440
+ TPM_VERTICAL = 0x0040
1441
+
1442
+ TPM_NONOTIFY = 0x0080
1443
+ TPM_RETURNCMD = 0x0100
1444
+
1445
+ TPM_RECURSE = 0x0001
1446
+ #}
1447
+
1448
+ attach_function :TrackPopupMenu, [
1449
+ :pointer,
1450
+ :uint,
1451
+ :int,
1452
+ :int,
1453
+ :int,
1454
+ :pointer,
1455
+ RECT.by_ref(:in)
1456
+ ], :int
1457
+
1287
1458
  #{ Fxxx
1288
1459
  FVIRTKEY = 1
1289
1460
  FCONTROL = 0x08