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/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