wrb 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.
Files changed (271) hide show
  1. checksums.yaml +7 -0
  2. data/README +28 -0
  3. data/Rakefile +66 -0
  4. data/bin/wrb +41 -0
  5. data/bin/wrb.bat +6 -0
  6. data/ext/rwin/aatree.c +192 -0
  7. data/ext/rwin/aatree.h +55 -0
  8. data/ext/rwin/extconf.rb +47 -0
  9. data/ext/rwin/rw_api.c +2058 -0
  10. data/ext/rwin/rw_devices.c +215 -0
  11. data/ext/rwin/rw_gdiplus.h +278 -0
  12. data/ext/rwin/rw_graphics.c +1583 -0
  13. data/ext/rwin/rw_resources.c +1988 -0
  14. data/ext/rwin/rw_ubfuncs.c +281 -0
  15. data/ext/rwin/rw_windows.c +1936 -0
  16. data/ext/rwin/rwin.c +451 -0
  17. data/ext/rwin/rwin.h +442 -0
  18. data/lib/rwin.rb +820 -0
  19. data/lib/wrb.rb +20 -0
  20. data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
  21. data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
  22. data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
  23. data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
  24. data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
  25. data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
  26. data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
  27. data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
  28. data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
  29. data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
  30. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
  31. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
  32. data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
  33. data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
  34. data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
  35. data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
  36. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
  37. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
  38. data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
  39. data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
  40. data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
  41. data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
  42. data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
  43. data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
  44. data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
  45. data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
  46. data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
  47. data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
  48. data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
  49. data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
  50. data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
  51. data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
  52. data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
  53. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
  54. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
  55. data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
  56. data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
  57. data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
  58. data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
  59. data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
  60. data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
  61. data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
  62. data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
  63. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
  64. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
  65. data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
  66. data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
  67. data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
  68. data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
  69. data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
  70. data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
  71. data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
  72. data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
  73. data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
  74. data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
  75. data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
  76. data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
  77. data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
  78. data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
  79. data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
  80. data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
  81. data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
  82. data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
  83. data/lib/wrb/base.rb +1294 -0
  84. data/lib/wrb/combocommon.rb +77 -0
  85. data/lib/wrb/commctrlconst.rb +139 -0
  86. data/lib/wrb/commdlg.rb +77 -0
  87. data/lib/wrb/components/animate.rb +114 -0
  88. data/lib/wrb/components/bitmap.rb +116 -0
  89. data/lib/wrb/components/button.rb +134 -0
  90. data/lib/wrb/components/canvas.rb +266 -0
  91. data/lib/wrb/components/checkbox.rb +118 -0
  92. data/lib/wrb/components/choosecolordlg.rb +87 -0
  93. data/lib/wrb/components/choosefontdlg.rb +142 -0
  94. data/lib/wrb/components/clipboard.rb +174 -0
  95. data/lib/wrb/components/combobox.rb +282 -0
  96. data/lib/wrb/components/comboboxex.rb +574 -0
  97. data/lib/wrb/components/cursor.rb +91 -0
  98. data/lib/wrb/components/datetimepicker.rb +197 -0
  99. data/lib/wrb/components/ddeclient.rb +180 -0
  100. data/lib/wrb/components/ddeserver.rb +131 -0
  101. data/lib/wrb/components/dialog.rb +228 -0
  102. data/lib/wrb/components/edit.rb +412 -0
  103. data/lib/wrb/components/font.rb +35 -0
  104. data/lib/wrb/components/form.rb +65 -0
  105. data/lib/wrb/components/groupbox.rb +122 -0
  106. data/lib/wrb/components/header.rb +479 -0
  107. data/lib/wrb/components/hotkeyctrl.rb +72 -0
  108. data/lib/wrb/components/icon.rb +109 -0
  109. data/lib/wrb/components/imagelist.rb +396 -0
  110. data/lib/wrb/components/inifile.rb +97 -0
  111. data/lib/wrb/components/listbox.rb +149 -0
  112. data/lib/wrb/components/listview.rb +1467 -0
  113. data/lib/wrb/components/menu.rb +592 -0
  114. data/lib/wrb/components/menubar.rb +84 -0
  115. data/lib/wrb/components/monthcalender.rb +164 -0
  116. data/lib/wrb/components/openfilenamedlg.rb +147 -0
  117. data/lib/wrb/components/pager.rb +199 -0
  118. data/lib/wrb/components/panel.rb +103 -0
  119. data/lib/wrb/components/picture.rb +55 -0
  120. data/lib/wrb/components/printdlg.rb +148 -0
  121. data/lib/wrb/components/printdlgex.rb +117 -0
  122. data/lib/wrb/components/printer.rb +97 -0
  123. data/lib/wrb/components/progressbar.rb +140 -0
  124. data/lib/wrb/components/radiobutton.rb +49 -0
  125. data/lib/wrb/components/rebar.rb +830 -0
  126. data/lib/wrb/components/registry.rb +408 -0
  127. data/lib/wrb/components/richedit.rb +1181 -0
  128. data/lib/wrb/components/savefilenamedlg.rb +27 -0
  129. data/lib/wrb/components/scintilla.rb +1298 -0
  130. data/lib/wrb/components/scrollbar.rb +239 -0
  131. data/lib/wrb/components/splitter.rb +494 -0
  132. data/lib/wrb/components/static.rb +198 -0
  133. data/lib/wrb/components/statusbar.rb +490 -0
  134. data/lib/wrb/components/tabctrl.rb +686 -0
  135. data/lib/wrb/components/timer.rb +117 -0
  136. data/lib/wrb/components/toolbar.rb +1107 -0
  137. data/lib/wrb/components/tooltip.rb +651 -0
  138. data/lib/wrb/components/trackbar.rb +298 -0
  139. data/lib/wrb/components/treeview.rb +845 -0
  140. data/lib/wrb/components/updown.rb +198 -0
  141. data/lib/wrb/ddeml.rb +241 -0
  142. data/lib/wrb/documents/animate.html +46 -0
  143. data/lib/wrb/documents/bitmap.html +69 -0
  144. data/lib/wrb/documents/button.html +78 -0
  145. data/lib/wrb/documents/canvas.html +137 -0
  146. data/lib/wrb/documents/checkbox.html +77 -0
  147. data/lib/wrb/documents/choosecolordlg.html +29 -0
  148. data/lib/wrb/documents/choosefontdlg.html +31 -0
  149. data/lib/wrb/documents/clipboard.html +31 -0
  150. data/lib/wrb/documents/combobox.html +117 -0
  151. data/lib/wrb/documents/comboboxex.html +139 -0
  152. data/lib/wrb/documents/control.html +53 -0
  153. data/lib/wrb/documents/cursor.html +45 -0
  154. data/lib/wrb/documents/datetimepicker.html +70 -0
  155. data/lib/wrb/documents/ddeclient.html +33 -0
  156. data/lib/wrb/documents/ddeserver.html +26 -0
  157. data/lib/wrb/documents/dialog.html +78 -0
  158. data/lib/wrb/documents/edit.html +169 -0
  159. data/lib/wrb/documents/empty.html +11 -0
  160. data/lib/wrb/documents/favicon.png +0 -0
  161. data/lib/wrb/documents/font.html +38 -0
  162. data/lib/wrb/documents/form.html +63 -0
  163. data/lib/wrb/documents/groupbox.html +57 -0
  164. data/lib/wrb/documents/header.html +85 -0
  165. data/lib/wrb/documents/hotkeyctrl.html +42 -0
  166. data/lib/wrb/documents/icon.html +45 -0
  167. data/lib/wrb/documents/imagelist.html +101 -0
  168. data/lib/wrb/documents/images/button.png +0 -0
  169. data/lib/wrb/documents/images/checkbox.png +0 -0
  170. data/lib/wrb/documents/images/combobox.png +0 -0
  171. data/lib/wrb/documents/images/comboboxex.png +0 -0
  172. data/lib/wrb/documents/images/datetimepicker.png +0 -0
  173. data/lib/wrb/documents/images/edit.png +0 -0
  174. data/lib/wrb/documents/images/groupbox.png +0 -0
  175. data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
  176. data/lib/wrb/documents/images/listbox.png +0 -0
  177. data/lib/wrb/documents/images/listview.png +0 -0
  178. data/lib/wrb/documents/images/menu.png +0 -0
  179. data/lib/wrb/documents/images/menubar.png +0 -0
  180. data/lib/wrb/documents/images/monthcalender.png +0 -0
  181. data/lib/wrb/documents/images/progressbar.png +0 -0
  182. data/lib/wrb/documents/images/radiobutton.png +0 -0
  183. data/lib/wrb/documents/images/rebar.png +0 -0
  184. data/lib/wrb/documents/images/richedit.png +0 -0
  185. data/lib/wrb/documents/images/splitter.png +0 -0
  186. data/lib/wrb/documents/images/static.png +0 -0
  187. data/lib/wrb/documents/images/statusbar.png +0 -0
  188. data/lib/wrb/documents/images/tabctrl.png +0 -0
  189. data/lib/wrb/documents/images/toolbar.png +0 -0
  190. data/lib/wrb/documents/images/tooltip.png +0 -0
  191. data/lib/wrb/documents/images/trackbar.png +0 -0
  192. data/lib/wrb/documents/images/treeview.png +0 -0
  193. data/lib/wrb/documents/images/updown.png +0 -0
  194. data/lib/wrb/documents/index.html +155 -0
  195. data/lib/wrb/documents/inifile.html +36 -0
  196. data/lib/wrb/documents/license.txt +22 -0
  197. data/lib/wrb/documents/listbox.html +96 -0
  198. data/lib/wrb/documents/listview.html +277 -0
  199. data/lib/wrb/documents/make_doc.rb +596 -0
  200. data/lib/wrb/documents/menu.html +144 -0
  201. data/lib/wrb/documents/menubar.html +54 -0
  202. data/lib/wrb/documents/monthcalender.html +48 -0
  203. data/lib/wrb/documents/openfilenamedlg.html +36 -0
  204. data/lib/wrb/documents/pager.html +63 -0
  205. data/lib/wrb/documents/panel.html +32 -0
  206. data/lib/wrb/documents/picture.html +48 -0
  207. data/lib/wrb/documents/printdlg.html +35 -0
  208. data/lib/wrb/documents/printdlgex.html +35 -0
  209. data/lib/wrb/documents/printer.html +40 -0
  210. data/lib/wrb/documents/progressbar.html +69 -0
  211. data/lib/wrb/documents/radiobutton.html +51 -0
  212. data/lib/wrb/documents/rebar.html +143 -0
  213. data/lib/wrb/documents/registry.html +36 -0
  214. data/lib/wrb/documents/richedit.html +232 -0
  215. data/lib/wrb/documents/samples/editimg.bmp +0 -0
  216. data/lib/wrb/documents/samples/editimg.iml +0 -0
  217. data/lib/wrb/documents/samples/fileimg.bmp +0 -0
  218. data/lib/wrb/documents/samples/fileimg.iml +0 -0
  219. data/lib/wrb/documents/samples/sample_button.rb +21 -0
  220. data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
  221. data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
  222. data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
  223. data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
  224. data/lib/wrb/documents/samples/sample_edit.rb +25 -0
  225. data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
  226. data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
  227. data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
  228. data/lib/wrb/documents/samples/sample_listview.rb +32 -0
  229. data/lib/wrb/documents/samples/sample_menu.rb +21 -0
  230. data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
  231. data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
  232. data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
  233. data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
  234. data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
  235. data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
  236. data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
  237. data/lib/wrb/documents/samples/sample_static.rb +15 -0
  238. data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
  239. data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
  240. data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
  241. data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
  242. data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
  243. data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
  244. data/lib/wrb/documents/samples/sample_updown.rb +18 -0
  245. data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
  246. data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
  247. data/lib/wrb/documents/samples/samplemg16.png +0 -0
  248. data/lib/wrb/documents/samples/samplemg32.png +0 -0
  249. data/lib/wrb/documents/samples/wrb.ico +0 -0
  250. data/lib/wrb/documents/savefilenamedlg.html +19 -0
  251. data/lib/wrb/documents/scrollbar.html +60 -0
  252. data/lib/wrb/documents/splitter.html +96 -0
  253. data/lib/wrb/documents/static.html +84 -0
  254. data/lib/wrb/documents/statusbar.html +110 -0
  255. data/lib/wrb/documents/tabctrl.html +151 -0
  256. data/lib/wrb/documents/timer.html +43 -0
  257. data/lib/wrb/documents/toolbar.html +181 -0
  258. data/lib/wrb/documents/tooltip.html +131 -0
  259. data/lib/wrb/documents/trackbar.html +107 -0
  260. data/lib/wrb/documents/treeview.html +210 -0
  261. data/lib/wrb/documents/updown.html +85 -0
  262. data/lib/wrb/documents/wincontrol.html +258 -0
  263. data/lib/wrb/documents/window.html +499 -0
  264. data/lib/wrb/documents/wrb.css +228 -0
  265. data/lib/wrb/gmem.rb +26 -0
  266. data/lib/wrb/imecommon.rb +59 -0
  267. data/lib/wrb/listcommon.rb +185 -0
  268. data/lib/wrb/lzss.rb +126 -0
  269. data/lib/wrb/scrollinfo.rb +142 -0
  270. data/lib/wrb/toplevelcommon.rb +634 -0
  271. metadata +315 -0
@@ -0,0 +1,592 @@
1
+ require 'wrb'
2
+
3
+ module WR
4
+ module RC
5
+ MFT_STRING = 0x0000
6
+ #MFT_BITMAP = 0x0004
7
+ MFT_MENUBARBREAK = 0x0020
8
+ MFT_MENUBREAK = 0x0040
9
+ MFT_OWNERDRAW = 0x0100
10
+ MFT_RADIOCHECK = 0x0200
11
+ MFT_SEPARATOR = 0x0800
12
+ MFT_RIGHTORDER = 0x2000
13
+ MFT_RIGHTJUSTIFY = 0x4000
14
+
15
+ MFS_GRAYED = 0x0003
16
+ MFS_DISABLED = 0x0003
17
+ MFS_CHECKED = 0x0008
18
+ MFS_HILITE = 0x0080
19
+ MFS_ENABLED = 0x0000
20
+ MFS_UNCHECKED = 0x0000
21
+ MFS_UNHILITE = 0x0000
22
+ MFS_DEFAULT = 0x1000
23
+
24
+ MIIM_STATE = 0x0001
25
+ MIIM_ID = 0x0002
26
+ MIIM_SUBMENU = 0x0004
27
+ MIIM_CHECKMARKS = 0x0008
28
+ # MIIM_TYPE = 0x0010 # replaced by MIIM_BITMAP, MIIM_FTYPE, and MIIM_STRING.
29
+ MIIM_DATA = 0x0020
30
+ MIIM_STRING = 0x0040
31
+ MIIM_BITMAP = 0x0080
32
+ MIIM_FTYPE = 0x0100
33
+
34
+ HBMMENU_SYSTEM = 1
35
+ HBMMENU_MBAR_RESTORE = 2
36
+ HBMMENU_MBAR_MINIMIZE = 3
37
+ HBMMENU_MBAR_CLOSE = 5
38
+ HBMMENU_MBAR_CLOSE_D = 6
39
+ HBMMENU_MBAR_MINIMIZE_D = 7
40
+ HBMMENU_POPUP_CLOSE = 8
41
+ HBMMENU_POPUP_RESTORE = 9
42
+ HBMMENU_POPUP_MAXIMIZE = 10
43
+ HBMMENU_POPUP_MINIMIZE = 11
44
+ HBMMENU_CALLBACK = -1
45
+ end
46
+
47
+ # A list of items that specify options or groups of options (a submenu) for an application.<br>
48
+ # If you want to set main-menu, use Menubar.
49
+ # <br>See also <a href="https://docs.microsoft.com/en-us/windows/desktop/menurc/resources">
50
+ # Menus and Other Resources section of Microsft Docs</a>
51
+ class Menu < RWin::Menu
52
+
53
+ include RC
54
+ include ModAutoloading
55
+
56
+ # The wrapper of idcmd of menu.
57
+ class Item
58
+ include RC
59
+ attr_reader :_menu
60
+ MENUITEMINFO = API::MENUITEMINFO
61
+ def initialize(menu, id)
62
+ @_menu = menu
63
+ @_idcmd = id #; dpp self, menu, id
64
+ end
65
+
66
+ # def inspect()
67
+ # sprintf "#<%p: 0x%x idcmd=%p, caption=%p>", self.class, self.__id__, @_idcmd, caption
68
+ # end
69
+
70
+ def idcmd()
71
+ @_idcmd
72
+ end
73
+
74
+ def index()
75
+ @_menu._index(self)
76
+ end
77
+
78
+ def caption()
79
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STRING]
80
+ @_menu.GetMenuItemInfo(@_idcmd, nil, mii)
81
+ buff = TCHAR[mii.cch+=1]
82
+ mii.dwTypeData = buff
83
+ @_menu.GetMenuItemInfo(@_idcmd, nil, mii)
84
+ buff.to_s
85
+ end
86
+ def caption=(str)
87
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STRING]
88
+ mii.dwTypeData = str.to_s.dup
89
+ mii.cch = str.size
90
+ @_menu.SetMenuItemInfo(@_idcmd, nil, mii)
91
+ str
92
+ end
93
+
94
+ def bitmap=(bmp)
95
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_BITMAP]
96
+ mii.hbmpItem = bmp.is_a?(Integer) ? bmp : bmp._hbitmap
97
+ @_menu.SetMenuItemInfo(@_idcmd, nil, mii)
98
+ end
99
+
100
+ def image()
101
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_BITMAP | MIIM_DATA]
102
+ @_menu.GetMenuItemInfo(@_idcmd, nil, mii)
103
+ mii.dwItemData == API.int2uint(-1) ? nil : mii.dwItemData
104
+ end
105
+ def image=(idx)
106
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_BITMAP | MIIM_DATA]
107
+ if idx.nil?
108
+ mii.hbmpItem = 0
109
+ mii.dwItemData = -1
110
+ else
111
+ mii.hbmpItem = HBMMENU_CALLBACK
112
+ mii.dwItemData = idx
113
+ end
114
+ @_menu.SetMenuItemInfo(@_idcmd, nil, mii)
115
+ end
116
+
117
+ def menu() @_menu; end
118
+ alias parent menu
119
+
120
+ def delete()
121
+ @_menu._delete(index);
122
+ end
123
+
124
+ def grayed() (_get_state() & 0x0001) !=0; end
125
+ def grayed=(flag) _set_state(0x0001, flag); end
126
+
127
+ def disabled() (_get_state() & 0x0002) != 0; end
128
+ def disabled=(flag) _set_state(0x0002, flag); end
129
+
130
+ def checked() (_get_state() & 0x0008) != 0; end
131
+ def checked=(flag) _set_state(0x0008, flag); end
132
+
133
+ def gettype()
134
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_FTYPE]
135
+ @_menu.GetMenuItemInfo(@_idcmd, false, mii)
136
+ mii.fType
137
+ end
138
+ def settype(type)
139
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_FTYPE]
140
+ mii.fType = type
141
+ @_menu.SetMenuItemInfo(@_idcmd, false, mii)
142
+ end
143
+
144
+ private
145
+ def _get_state()
146
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STATE]
147
+ @_menu.GetMenuItemInfo(@_idcmd, false, mii)
148
+ mii.fState
149
+ end
150
+ def _set_state(state, flag)
151
+ # old_state = _get_state()
152
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STATE]
153
+ if flag == true
154
+ mii.fState |= state
155
+ elsif flag==false || flag.nil?
156
+ mii.fState &= ~state
157
+ else
158
+ raise ArgumentError, "flag must be true, false or nil", caller(2)
159
+ end
160
+ @_menu.SetMenuItemInfo(@_idcmd, false, mii)
161
+ end
162
+
163
+ alias text caption
164
+ alias text= caption=
165
+ end # Item
166
+
167
+ ################### Main ##################
168
+
169
+ =begin
170
+ following methods are defined in the super class.
171
+ :singleton_methods
172
+ self.new(name, caption, menu-item_or_sub-menu, ... )
173
+
174
+ :instance_methods
175
+ GetMenuItemCount()
176
+ A low-level API function.
177
+ GetMenuItemID()
178
+ A low-level API function.
179
+ GetMenuItemInfo()
180
+ A low-level API function.
181
+ GetSubMenu()
182
+ A low-level API function.
183
+ SetMenuItemInfo(index, flag, menuiteminfo)
184
+ A low-level API function.
185
+ _hmenu()
186
+ Retreives a handle of this menu.
187
+ alive?()
188
+ Retreives whether this maneu is created or not.
189
+
190
+ # createmenu()
191
+ # createpopup()
192
+ # delete()
193
+ destroy()
194
+ Destroys this menu and all items and submenu.
195
+
196
+ # insert()
197
+
198
+ =end
199
+
200
+ MENUITEMINFO = API::MENUITEMINFO
201
+ include ModAccessor
202
+ attr_reader :_owner, :_type, :_image
203
+ attr_accessor :name, :idcmd
204
+ alias :_name :name
205
+ alias :_idcmd :idcmd
206
+ alias _destroy destroy
207
+
208
+ # self.[](name, caption, imagelist=nil, menu-item_or_sub-menu, ... )
209
+ # Creates a menu but not alive with given arguments.<br>
210
+ # A <i>menu-item</i> must be a pair of name and caption, and <i>name</i> must be a symbol.
211
+ def self.[](*args)
212
+ self.new(*args)
213
+ end
214
+
215
+ def initialize(*args)
216
+ raise TypeError, "1st argument must be Symbol." unless args[0].is_a?(Symbol)
217
+ super()
218
+ @name = args.shift
219
+ @_caption = args.shift if args[0].is_a?(String) #; dpp args
220
+ @_imagelist = args.shift if args[0].is_a?(Imagelist)
221
+ n = args.shift if args[0].is_a?(Integer)
222
+ n > 31 ? @_type = n : @_image = n if n
223
+ n = args.shift if args[0].is_a?(Integer) # Check twise
224
+ n > 31 ? @_type = n : @_image = n if n
225
+ @_menus = []
226
+ self[0, 0] = *args# ; dpp name, @_menus
227
+ # @_menus = args
228
+ end
229
+ #
230
+ def inspect()
231
+ sprintf "#<%p: 0x%x, %p>", self.class, self.__id__, name
232
+ # sprintf "#<%p: 0x%x, %p>", self.class, self.__id__ , _caption
233
+ end
234
+
235
+ # Creates as child or popup menu.
236
+ def createpopup()
237
+ super
238
+ _create_substance
239
+ self.imagelist = @_imagelist if @_imagelist
240
+ self
241
+ end
242
+ alias _createpopup createpopup
243
+
244
+ # Retreives a text of this menu.
245
+ def caption()
246
+ if alive?
247
+ return @_caption unless parent && parent.is_a?(Menu) && parent.index(self)
248
+ idx = parent.index(self)
249
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STRING]
250
+ parent.GetMenuItemInfo(idx, true, mii)
251
+ buff = TCHAR[mii.cch+=1]
252
+ mii.dwTypeData = buff
253
+ parent.GetMenuItemInfo(idx, true, mii)
254
+ buff.to_s
255
+ else
256
+ @_caption
257
+ end
258
+ end
259
+ alias _caption caption
260
+
261
+ # Sets the text of this menu.
262
+ def caption=(s)
263
+ str = s.dup
264
+ if alive?
265
+ return unless parent
266
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STRING]
267
+ mii.dwTypeData = str.to_s
268
+ mii.cch = str.size
269
+ parent.SetMenuItemInfo(parent.index(self), true, mii)
270
+ else
271
+ @_caption = str.to_s
272
+ end
273
+ end
274
+
275
+ def image
276
+ if alive?
277
+ return nil unless parent && parent.is_a?(Menu)
278
+ idx = parent.index(self)
279
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_BITMAP | MIIM_DATA]
280
+ parent.GetMenuItemInfo(idx, true, mii)
281
+ mii.dwItemData == API.int2uint(-1) ? nil : mii.dwItemData
282
+ else
283
+ @_image
284
+ end
285
+ end
286
+ def image=(im)
287
+ if alive?
288
+ return nil unless parent && parent.is_a?(Menu)
289
+ idx = parent.index(self)
290
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_BITMAP | MIIM_DATA]
291
+ if im.nil?
292
+ mii.hbmpItem = 0
293
+ mii.dwItemData = -1
294
+ else
295
+ mii.hbmpItem = HBMMENU_CALLBACK
296
+ mii.dwItemData = im
297
+ end
298
+ parent.SetMenuItemInfo(idx, true, mii)
299
+ else
300
+ @_image = im
301
+ end
302
+ end
303
+
304
+ # Counts number of items of this menu.
305
+ def count()
306
+ alive? ? GetMenuItemCount() : (@_menus ? @_menus.size : 0)
307
+ end
308
+ alias _count count
309
+ #
310
+ def _set_owner(owner)
311
+ @_owner = owner
312
+ self
313
+ end
314
+
315
+ # Inserts an item or a menu into specified index.<br>
316
+ # Give an array of [name, caption, image=nil, type=nil] as <i>item</i>.
317
+ def insert(idx, *arg)
318
+ if arg.size==1
319
+ arg = arg[0]
320
+ if arg.is_a?(Menu) #; dpp self, arg, arg.caption, arg.alive?, @_owner, parent
321
+ name = arg._name
322
+ capt = arg.caption
323
+ # type = arg._type
324
+ arg._set_owner_and_parent(@_owner, self)
325
+ _add_accessor(arg, name) unless respond_to?(name)
326
+ if alive?
327
+ arg.createpopup unless arg.alive? #; dpp idx, true, capt, arg
328
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STRING|MIIM_SUBMENU|MIIM_DATA]
329
+ mii.dwTypeData = capt
330
+ mii.cch = capt.size
331
+ mii.hSubMenu = arg._hmenu
332
+ if arg._type
333
+ mii.fMask |= MIIM_FTYPE
334
+ mii.fType = arg._type
335
+ end
336
+ if arg._image
337
+ mii.fMask |= MIIM_BITMAP
338
+ mii.dwItemData = arg._image
339
+ mii.hbmpItem = HBMMENU_CALLBACK
340
+ else
341
+ mii.dwItemData = -1
342
+ end
343
+ super(idx, true, mii)
344
+ else #; dpp arg
345
+ @_menus.insert(idx, arg);
346
+ end
347
+ elsif arg.is_a?(Array)
348
+ if alive? #; dp "@%p, @_owner=%p", self, @_owner
349
+ image = type = nil
350
+ name, capt, n1, n2 = *arg # ; dpp arg; #name, capt, n1, n2, type
351
+ n1 > 31 ? type = n1 : image = n1 if n1
352
+ n2 > 31 ? type = n2 : image = n2 if n2
353
+ idcmd = @_owner.new_control_id #; dpp name, capt, idcmd, type
354
+ @_owner.set_msgtranslator(WM_COMMAND) if !@_owner.get_msgtranslator(WM_COMMAND)
355
+ @_owner.register_event(idcmd, WM_COMMAND, 0, "#{name}_clicked", "h")
356
+
357
+ mii = MENUITEMINFO[MENUITEMINFO::Size, MIIM_STRING | MIIM_ID | MIIM_DATA]
358
+
359
+ # buf = TCHAR[capt.size+1]
360
+ # buf[0,capt.size] = capt.encode(Encoding::UTF_16LE); dpp buf.to_s
361
+ mii.dwTypeData = capt.dup
362
+ mii.cch = capt.size+1; # dpp capt, mii.dwTypeData, mii.cch
363
+ mii.wID = idcmd
364
+ if type
365
+ mii.fMask |= MIIM_FTYPE
366
+ mii.fType = type
367
+ end
368
+ if image
369
+ mii.fMask |= MIIM_BITMAP
370
+ mii.dwItemData = image
371
+ mii.hbmpItem = HBMMENU_CALLBACK
372
+ else
373
+ mii.dwItemData = -1
374
+ end
375
+ super(idx, true, mii)
376
+ if accel=capt.split("\t")[1]
377
+ @_owner.register_keyaccel(accel, idcmd)
378
+ end
379
+ _add_accessor(idcmd, name) unless respond_to?(name)
380
+ else
381
+ @_menus.insert(idx, arg);
382
+ end
383
+ elsif arg==:sep
384
+ if alive?
385
+ idcmd = @_owner.new_control_id
386
+ super(idx, true, '_sep', idcmd, MFT_SEPARATOR)
387
+ else
388
+ @_menus.insert(idx, arg)
389
+ end
390
+ else
391
+ raise TypeError, "argument must be Menu or Array or :sep"
392
+ end
393
+ else
394
+ alive? ? super(idx, *arg) : @_menus.insert(idx, arg)
395
+ end
396
+ end
397
+ alias _insert insert
398
+
399
+ alias __delete__ delete
400
+
401
+ # Deletes specifired index of this menu, or deletes self when given no argument.
402
+ def delete(idx=nil)
403
+ raise ArgumentError, "Argument must be an Integer" if idx && !idx.is_a?(Integer)
404
+ unless alive?
405
+ if idx
406
+ @_menus.delete_at(idx)
407
+ else
408
+ @_parent._menus._delete(self)
409
+ end
410
+ return
411
+ end
412
+ if idx
413
+ raise ArgumentError, "Too large index: #{idx}" if idx > ModParent::ItemBaseID
414
+ obj = self[idx] #; dpp idx , obj
415
+ if obj.is_a?(Menu)
416
+ obj.count.times{|i| obj.delete(i)}
417
+ elsif accel=obj.caption.split("\t")[1]
418
+ @_owner.unregister_keyaccel(accel)
419
+ end
420
+ super(idx, true)
421
+ _delete_accessor_by_obj(obj)
422
+ else
423
+ if @_parent.is_a?(Menu)
424
+ @_parent._delete_accessor_by_obj(self)
425
+ @_parent._delete(@_parent.index(self))
426
+ else
427
+ self.destroy()
428
+ end
429
+ end
430
+ end
431
+ alias _delete delete
432
+
433
+ # []=(index, length, *arguments)<br>
434
+ # Inserts and replaces specified index and length of this menu with given arguments.
435
+ def []=(idx, *args)# dpp self, alive?, @_owner
436
+ len = args[0].is_a?(Integer) ? args.shift : 1
437
+ args = args[0] if args[0].is_a?(Array) #;dp "@%p, %p", alive?, args
438
+ n = 0
439
+ while i=args.shift
440
+ if i == :sep
441
+ _insert(idx + n, i)
442
+ elsif i.is_a?(Symbol)
443
+ ar = [i]
444
+ while args[0] &&
445
+ !args[0].is_a?(Symbol) && !args[0].is_a?(Menu) && !args[0].is_a?(Array)
446
+ ar << args.shift
447
+ end #; dpp ar
448
+ _insert(idx + n, ar)
449
+ elsif i.is_a?(Array) || i.is_a?(Menu) #; dpp self, name, alive?, @_owner, i
450
+ _insert(idx + n, i)
451
+ else
452
+ raise TypeError, "Unknown argument: #{i.inspect}"
453
+ end
454
+ n += 1
455
+ end
456
+ end
457
+
458
+ # Retreives an item or a menu specifiied <i>idx</i> in this menu.<br>
459
+ # The <i>idx</i> can be an index of items or an ID of menu-item.
460
+ def [](idx)
461
+ return @_menus[idx] unless alive?
462
+ if r=GetSubMenu(idx)
463
+ return r
464
+ elsif idx > ModParent::ItemBaseID
465
+ return Item.new(self, idx)
466
+ elsif id=GetMenuItemID(idx) #; dpp idx, id
467
+ return Item.new(self, id)
468
+ end
469
+ nil
470
+ end
471
+
472
+ # Appends the items or menus at last of this menu.
473
+ def <<(arg)
474
+ self[_count, 0] = arg
475
+ self
476
+ end
477
+
478
+ # Retreives an index of given object in this menu.<br>
479
+ # If no argument was given, retreives an index of this menu in the parent.
480
+ def index(obj=nil)
481
+ return parent._index(self) unless obj
482
+ if alive?
483
+ self.count.times{|i|
484
+ if obj.is_a?(Integer)
485
+ return i if GetMenuItemID(i) == obj
486
+ else
487
+ return i if GetSubMenu(i) == obj || GetMenuItemID(i) == obj.idcmd
488
+ end
489
+ }
490
+ nil
491
+ else
492
+ @_menus.index(obj)
493
+ end
494
+ end
495
+ alias _index index
496
+
497
+ # Retreives parent of this menu.
498
+ def parent()
499
+ @_parent
500
+ end
501
+ alias _parent parent
502
+
503
+ # Sets parent of this menu. Give a Menu as parent.
504
+ def parent=(prt) #;dpp self, prt, caller[0, 2]
505
+ _set_owner_and_parent(prt, prt)
506
+ end
507
+
508
+ # Gets an imagelist assigned to this menu.
509
+ def imagelist()
510
+ @_imagelist
511
+ end
512
+ alias _imagelist imagelist
513
+
514
+ # Assignes an imagelist to this menu.
515
+ def imagelist=(imglst)
516
+ @_imagelist ||= imglst #; dpp self, alive?, @_imagelist
517
+ if alive?
518
+ if @_imagelist
519
+ unless @_owner.respond_to?(:__drawitem__)
520
+ @_owner.register_event(WM_DRAWITEM, "__drawitem__", 'xs', DRAWITEMSTRUCT)
521
+ @_owner.instance_eval "
522
+ def __drawitem__(dis)
523
+ APP.hrsc2ref(dis.hwndItem).__send__(:__drawitem, dis)
524
+ end"
525
+ end
526
+ each{|i| i.imagelist ||= @_imagelist if i.is_a?(Menu)}
527
+ else
528
+ @_owner.unregister_event(WM_DRAWITEM, "__drawitem__")
529
+ end
530
+ end
531
+ end
532
+
533
+ # Creates as child or popup menu.
534
+ def create()
535
+ createpopup()
536
+ end
537
+ alias _create create
538
+
539
+ # Shows this menu at the specified coordiates on the owner window.
540
+ def popup(x, y)
541
+ @_owner.TrackPopupMenu(self, x, y)
542
+ end
543
+ alias _popup popup
544
+
545
+
546
+ # each(){|item| ... }
547
+ # Performs the block for each <i>item</i> in this menu as a block parameter.<br>
548
+ # An <i>item</i> may be a Menu or a Menu::Item.
549
+ def each()
550
+ _count.times{|i| yield self[i]}
551
+ end
552
+ alias _each each
553
+
554
+ # Clears all items and submenus.
555
+ def clear()
556
+ self.count.times{|i| self.delete(0)}
557
+ self
558
+ end
559
+ alias _clear clear
560
+
561
+ protected
562
+ def _set_owner_and_parent(onr, prt) #; dpp self, onr
563
+ onr.set_msgtranslator(WM_COMMAND) if onr && !onr.get_msgtranslator(WM_COMMAND)
564
+ @_owner = onr unless @_owner #; dp "@%p, @_owner=%p", self, onr
565
+ @_parent = prt
566
+ @_imagelist ||= prt.imagelist if prt.is_a?(Menu)
567
+ end
568
+
569
+ private
570
+ def __drawitem(dis)
571
+ return unless @_imagelist
572
+ cv = Canvas.new(dis.hDC)
573
+ cv.DrawImagelist(@_imagelist, dis.itemData, 1, 1)
574
+ end
575
+
576
+ def _create_substance() #; dpp name, @_menus
577
+ self[0, 0] = @_menus
578
+ @_menus = nil # recycle
579
+ self
580
+ end
581
+
582
+ def _define_access_method(name, obj)
583
+ if obj.is_a?(Integer)
584
+ instance_eval "def #{name}() Menu::Item.new(self, @_accessors[:#{name}]); end"
585
+ instance_eval "def _#{name}() Menu::Item.new(self, @_accessors[:#{name}]); end"
586
+ else
587
+ instance_eval "def #{name}() @_accessors[:#{name}]; end"
588
+ instance_eval "def _#{name}() @_accessors[:#{name}]; end"
589
+ end
590
+ end
591
+ end
592
+ end