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,117 @@
1
+ require 'wrb'
2
+ module WR
3
+
4
+ # Handles a timer of a Window.
5
+ # <br>See also <a href="https://docs.microsoft.com/en-us/windows/desktop/api/_winmsg/">
6
+ # Windows and Messages section of Microsft Docs</a>
7
+ class Timer
8
+ include RC
9
+
10
+ API.defun 'SetTimer(hwnd, idcmd, elapse, timerfunc)'
11
+ API.defun 'KillTimer(hwnd, idcmd)'
12
+ attr_accessor :name, :parent
13
+ attr_reader :idcmd
14
+
15
+ =begin
16
+ singleton methods
17
+ self.new(parent=nil, name=nil, elapse)
18
+ =end
19
+
20
+ # self.[](parent=nil, name=nil, elapse)
21
+ # Sets timer with specified arguments, but not starting.<br>
22
+ def self.[](*args)
23
+ self.new(*args)
24
+ end
25
+
26
+ def initialize(*args)
27
+ @parent = args.shift if args[0].is_a?(RWin::Window)
28
+ optionfuncs = args.pop if args.last.is_a?(Hash)
29
+ @name, @elapse = args
30
+ optionfuncs.each{|k, v| __send__(k.to_s + '=', v)} if optionfuncs
31
+ end
32
+
33
+ # Sets the idcmd value used when registers event of "???_elapsed" to parent of this timer.
34
+ def idcmd=(id)
35
+ @parent.set_msgtranslator(WM_TIMER) unless @parent.get_msgtranslator(WM_TIMER)
36
+ @idcmd = id
37
+ @parent.register_event(@idcmd, WM_TIMER, 0, "#{name}_elapsed")
38
+ end
39
+
40
+ # Starts this timer according to the parameters that was set at initializing.<br>
41
+ # If reached time-out, it will sends `???_elapsed' event to parent.<br>
42
+ # If `started' paremeter is not set, it does nothing.
43
+ def create()
44
+ API.SetTimer(@parent._hwnd, @idcmd, @elapse, 0) if @parent && @parent.alive? && @_start && @elapse>0
45
+ end
46
+
47
+ # Starts this timer forcely. <br>
48
+ # If reached time-out, it will sends `???_elapsed' event to parent.
49
+ def start()
50
+ @_start = true
51
+ API.SetTimer(@parent._hwnd, @idcmd, @elapse, 0) if @parent && @parent.alive? && @elapse>0
52
+ self
53
+ end
54
+
55
+ # Retreives whether this timer was started.
56
+ def started()
57
+ @_start
58
+ end
59
+
60
+ # Sets or resets whether this timer is started at the creation.
61
+ def started=(f)
62
+ @parent && @parent.alive? ? (f ? start : stop) : @_start=f
63
+ end
64
+
65
+ # Stops and resets elapsed time of this timer.
66
+ def stop()
67
+ @_start = nil
68
+ API.KillTimer(@parent._hwnd, @idcmd) if @parent && @parent.alive?
69
+ self
70
+ end
71
+
72
+ # Retreives the time-out value, in milliseconds of this timer.
73
+ def elapse()
74
+ @elapse
75
+ end
76
+ # Sets the time-out value, in milliseconds to this timer.
77
+ def elapse=(elps)
78
+ @elapse = elps
79
+ API.SetTimer(@parent._hwnd, @idcmd, elapse, 0) if @parent && @parent.alive?
80
+ end
81
+
82
+ #
83
+ def delete
84
+ if @parent && @parent.alive?
85
+ API.KillTimer(@parent._hwnd, @idcmd)
86
+ @parent.controls._delete(self)
87
+ end
88
+ end
89
+
90
+ end
91
+ end
92
+
93
+ module WR
94
+ class MyForm < Form
95
+ def initialize()
96
+ _<< Button[:bt1, 'Stop', 0, 0, 80, 24]
97
+ _<< Button[:bt2, 'Button1', 80, 0, 80, 24]
98
+ _<< Timer[:timer1, 500, :started=>true]
99
+ _<< Timer[:timer2, 1000, :started=>true]
100
+ self.events = :paint
101
+ end
102
+
103
+ def timer2_elapsed(); dpp 'timer2'
104
+ end
105
+ def timer1_elapsed(); dpp 'timer1'
106
+ self.caption = Time.now.to_s
107
+ end
108
+
109
+ def bt1_clicked(*)
110
+ dpp _.timer1.elapse
111
+ _.timer1.stop
112
+ dpp _.timer1.started
113
+ end
114
+
115
+ self.start
116
+ end
117
+ end if $0 == __FILE__
@@ -0,0 +1,1107 @@
1
+ require 'wrb'
2
+
3
+ module WR
4
+ module RC
5
+ TB_ENABLEBUTTON = WM_USER + 1
6
+ TB_CHECKBUTTON = WM_USER + 2
7
+ TB_PRESSBUTTON = WM_USER + 3
8
+ TB_HIDEBUTTON = WM_USER + 4
9
+ TB_INDETERMINATE = WM_USER + 5
10
+ TB_ISBUTTONENABLED = WM_USER + 9
11
+ TB_ISBUTTONCHECKED = WM_USER + 10
12
+ TB_ISBUTTONPRESSED = WM_USER + 11
13
+ TB_ISBUTTONHIDDEN = WM_USER + 12
14
+ TB_ISBUTTONINDETERMINATE= WM_USER + 13
15
+ TB_SETSTATE = WM_USER + 17
16
+ TB_GETSTATE = WM_USER + 18
17
+ TB_ADDBITMAP = WM_USER + 19
18
+ TB_DELETEBUTTON = WM_USER + 22
19
+ TB_GETBUTTON = WM_USER + 23
20
+ TB_BUTTONCOUNT = WM_USER + 24
21
+ TB_COMMANDTOINDEX = WM_USER + 25
22
+ TB_CUSTOMIZE = WM_USER + 27
23
+ TB_GETITEMRECT = WM_USER + 29
24
+ TB_BUTTONSTRUCTSIZE = WM_USER + 30
25
+ TB_SETBUTTONSIZE = WM_USER + 31
26
+ TB_SETBITMAPSIZE = WM_USER + 32
27
+ TB_AUTOSIZE = WM_USER + 33
28
+ TB_GETTOOLTIPS = WM_USER + 35
29
+ TB_SETTOOLTIPS = WM_USER + 36
30
+ TB_SETPARENT = WM_USER + 37
31
+ TB_SETROWS = WM_USER + 39
32
+ TB_GETROWS = WM_USER + 40
33
+ TB_GETBITMAPFLAGS = WM_USER + 41
34
+ TB_SETCMDID = WM_USER + 42
35
+ TB_CHANGEBITMAP = WM_USER + 43
36
+ TB_GETBITMAP = WM_USER + 44
37
+ TB_REPLACEBITMAP = WM_USER + 46
38
+ TB_SETINDENT = WM_USER + 47
39
+ TB_SETIMAGELIST = WM_USER + 48
40
+ TB_GETIMAGELIST = WM_USER + 49
41
+ TB_LOADIMAGES = WM_USER + 50
42
+ TB_GETRECT = WM_USER + 51
43
+ TB_SETHOTIMAGELIST = WM_USER + 52
44
+ TB_GETHOTIMAGELIST = WM_USER + 53
45
+ TB_SETDISABLEDIMAGELIST = WM_USER + 54
46
+ TB_GETDISABLEDIMAGELIST = WM_USER + 55
47
+ TB_SETSTYLE = WM_USER + 56
48
+ TB_GETSTYLE = WM_USER + 57
49
+ TB_GETBUTTONSIZE = WM_USER + 58
50
+ TB_SETBUTTONWIDTH = WM_USER + 59
51
+ TB_SETMAXTEXTROWS = WM_USER + 60
52
+ TB_GETTEXTROWS = WM_USER + 61
53
+ TB_GETOBJECT = WM_USER + 62
54
+ TB_HITTEST = WM_USER + 69
55
+ TB_SETDRAWTEXTFLAGS = WM_USER + 70
56
+ TB_GETHOTITEM = WM_USER + 71
57
+ TB_SETHOTITEM = WM_USER + 72
58
+ TB_SETANCHORHIGHLIGHT = WM_USER + 73
59
+ TB_GETANCHORHIGHLIGHT = WM_USER + 74
60
+ TB_GETINSERTMARK = WM_USER + 79
61
+ TB_SETINSERTMARK = WM_USER + 80
62
+ TB_INSERTMARKHITTEST = WM_USER + 81
63
+ TB_MOVEBUTTON = WM_USER + 82
64
+ TB_GETMAXSIZE = WM_USER + 83
65
+ TB_SETEXTENDEDSTYLE = WM_USER + 84
66
+ TB_GETEXTENDEDSTYLE = WM_USER + 85
67
+ TB_GETPADDING = WM_USER + 86
68
+ TB_SETPADDING = WM_USER + 87
69
+ TB_SETINSERTMARKCOLOR = WM_USER + 88
70
+ TB_GETINSERTMARKCOLOR = WM_USER + 89
71
+
72
+ TB_ADDBUTTONSA = WM_USER + 20
73
+ TB_INSERTBUTTONA = WM_USER + 21
74
+ TB_SAVERESTOREA = WM_USER + 26
75
+ TB_ADDSTRINGA = WM_USER + 28
76
+ TB_GETBUTTONTEXTA = WM_USER + 45
77
+ TB_GETBUTTONINFOA = WM_USER + 65
78
+ TB_SETBUTTONINFOA = WM_USER + 66
79
+ TB_MAPACCELERATORA = WM_USER + 78
80
+ TB_GETSTRINGA = WM_USER + 92
81
+
82
+ TB_ADDBUTTONSW = WM_USER + 68
83
+ TB_INSERTBUTTONW = WM_USER + 67
84
+ TB_SAVERESTOREW = WM_USER + 76
85
+ TB_ADDSTRINGW = WM_USER + 77
86
+ TB_GETBUTTONTEXTW = WM_USER + 75
87
+ TB_GETBUTTONINFOW = WM_USER + 63
88
+ TB_SETBUTTONINFOW = WM_USER + 64
89
+ TB_MAPACCELERATORW = WM_USER + 90
90
+ TB_GETSTRINGW = WM_USER + 91
91
+
92
+ if RWin::UNICODE
93
+ TB_ADDBUTTONS = TB_ADDBUTTONSW
94
+ TB_INSERTBUTTON = TB_INSERTBUTTONW
95
+ TB_SAVERESTORE = TB_SAVERESTOREW
96
+ TB_ADDSTRING = TB_ADDSTRINGW
97
+ TB_GETBUTTONTEXT = TB_GETBUTTONTEXTW
98
+ TB_GETBUTTONINFO = TB_GETBUTTONINFOW
99
+ TB_SETBUTTONINFO = TB_SETBUTTONINFOW
100
+ TB_MAPACCELERATOR = TB_MAPACCELERATORW
101
+ TB_GETSTRING = TB_GETSTRINGW
102
+ else
103
+ TB_ADDBUTTONS = TB_ADDBUTTONSA
104
+ TB_INSERTBUTTON = TB_INSERTBUTTONA
105
+ TB_SAVERESTORE = TB_SAVERESTOREA
106
+ TB_ADDSTRING = TB_ADDSTRINGA
107
+ TB_GETBUTTONTEXT = TB_GETBUTTONTEXTA
108
+ TB_GETBUTTONINFO = TB_GETBUTTONINFOA
109
+ TB_SETBUTTONINFO = TB_SETBUTTONINFOA
110
+ TB_MAPACCELERATOR = TB_MAPACCELERATORA
111
+ TB_GETSTRING = TB_GETSTRINGA
112
+ end
113
+
114
+ TBBF_LARGE = 1
115
+
116
+ TBN_FIRST = -700
117
+ TBN_GETBUTTONINFOA = TBN_FIRST - 0
118
+ TBN_BEGINDRAG = TBN_FIRST - 1
119
+ TBN_ENDDRAG = TBN_FIRST - 2
120
+ TBN_BEGINADJUST = TBN_FIRST - 3
121
+ TBN_ENDADJUST = TBN_FIRST - 4
122
+ TBN_RESET = TBN_FIRST - 5
123
+ TBN_QUERYINSERT = TBN_FIRST - 6
124
+ TBN_QUERYDELETE = TBN_FIRST - 7
125
+ TBN_TOOLBARCHANGE = TBN_FIRST - 8
126
+ TBN_CUSTHELP = TBN_FIRST - 9
127
+ TBN_DROPDOWN = TBN_FIRST - 10
128
+ TBN_GETOBJECT = TBN_FIRST - 12
129
+ TBN_HOTITEMCHANGE = TBN_FIRST - 13
130
+ TBN_DRAGOUT = TBN_FIRST - 14
131
+ TBN_DELETINGBUTTON = TBN_FIRST - 15
132
+ TBN_GETDISPINFOA = TBN_FIRST - 16
133
+ TBN_GETDISPINFOW = TBN_FIRST - 17
134
+ TBN_GETINFOTIPA = TBN_FIRST - 18
135
+ TBN_GETINFOTIPW = TBN_FIRST - 19
136
+ TBN_GETBUTTONINFOW = TBN_FIRST - 20
137
+ TBN_RESTORE = TBN_FIRST - 21
138
+ TBN_SAVE = TBN_FIRST - 22
139
+ TBN_INITCUSTOMIZE = TBN_FIRST - 23
140
+ TBN_WRAPHOTITEM = TBN_FIRST - 24
141
+ TBN_DUPACCELERATOR = TBN_FIRST - 25
142
+ TBN_WRAPACCELERATOR = TBN_FIRST - 26
143
+ TBN_DRAGOVER = TBN_FIRST - 27
144
+ TBN_MAPACCELERATOR = TBN_FIRST - 28
145
+
146
+ if RWin::UNICODE
147
+ TBN_GETDISPINFO = TBN_GETDISPINFOW
148
+ TBN_GETINFOTIP = TBN_GETINFOTIPW
149
+ TBN_GETBUTTONINFO = TBN_GETBUTTONINFOW
150
+ else
151
+ TBN_GETDISPINFO = TBN_GETDISPINFOA
152
+ TBN_GETINFOTIP = TBN_GETINFOTIPA
153
+ TBN_GETBUTTONINFO = TBN_GETBUTTONINFOA
154
+ end
155
+
156
+ TBNRF_HIDEHELP = 0x1
157
+ TBNRF_ENDCUSTOMIZE = 0x2
158
+
159
+ # 5.80 or later
160
+ CMB_MASKED = 0x2
161
+ TBSTATE_CHECKED = 0x1
162
+ TBSTATE_PRESSED = 0x2
163
+ TBSTATE_ENABLED = 0x4
164
+ TBSTATE_HIDDEN = 0x8
165
+ TBSTATE_INDETERMINATE = 0x10
166
+ TBSTATE_WRAP = 0x20
167
+ TBSTATE_ELLIPSES = 0x40
168
+ TBSTATE_MARKED = 0x80
169
+
170
+ TBSTYLE_BUTTON = 0x0
171
+ TBSTYLE_SEP = 0x1
172
+ TBSTYLE_CHECK = 0x2
173
+ TBSTYLE_GROUP = 0x4
174
+ TBSTYLE_CHECKGROUP = TBSTYLE_GROUP | TBSTYLE_CHECK
175
+ TBSTYLE_DROPDOWN = 0x8
176
+ TBSTYLE_AUTOSIZE = 0x10
177
+ TBSTYLE_NOPREFIX = 0x20
178
+ TBSTYLE_TOOLTIPS = 0x100
179
+ TBSTYLE_WRAPABLE = 0x200
180
+ TBSTYLE_ALTDRAG = 0x400
181
+ TBSTYLE_FLAT = 0x800
182
+ TBSTYLE_LIST = 0x1000
183
+ TBSTYLE_CUSTOMERASE = 0x2000
184
+ TBSTYLE_REGISTERDROP = 0x4000
185
+ TBSTYLE_TRANSPARENT = 0x8000
186
+
187
+ BTNS_BUTTON = TBSTYLE_BUTTON
188
+ BTNS_SEP = TBSTYLE_SEP
189
+ BTNS_CHECK = TBSTYLE_CHECK
190
+ BTNS_GROUP = TBSTYLE_GROUP
191
+ BTNS_CHECKGROUP = TBSTYLE_CHECKGROUP
192
+ BTNS_DROPDOWN = TBSTYLE_DROPDOWN
193
+ BTNS_AUTOSIZE = TBSTYLE_AUTOSIZE
194
+ BTNS_NOPREFIX = TBSTYLE_NOPREFIX
195
+ BTNS_SHOWTEXT = 0x40
196
+ BTNS_WHOLEDROPDOWN = 0x80
197
+
198
+ TBSTYLE_EX_DRAWDDARROWS = 0x1
199
+ TBSTYLE_EX_MIXEDBUTTONS = 0x08
200
+ TBSTYLE_EX_HIDECLIPPEDBUTTONS = 0x10
201
+ TBSTYLE_EX_DOUBLEBUFFER = 0x80
202
+
203
+ TBIF_IMAGE = 0x00000001
204
+ TBIF_TEXT = 0x00000002
205
+ TBIF_STATE = 0x00000004
206
+ TBIF_STYLE = 0x00000008
207
+ TBIF_LPARAM = 0x00000010
208
+ TBIF_COMMAND = 0x00000020
209
+ TBIF_SIZE = 0x00000040
210
+ TBIF_BYINDEX = 0x80000000
211
+ TBIF_DEFAULT = TBIF_IMAGE | TBIF_TEXT | TBIF_STATE | TBIF_STYLE | TBIF_LPARAM
212
+
213
+ HINST_COMMCTRL = -1
214
+ IDB_STD_SMALL_COLOR = 0
215
+ IDB_STD_LARGE_COLOR = 1
216
+ IDB_VIEW_SMALL_COLOR = 4
217
+ IDB_VIEW_LARGE_COLOR = 5
218
+ IDB_HIST_SMALL_COLOR = 8
219
+ IDB_HIST_LARGE_COLOR = 9
220
+
221
+ STD_CUT = 0
222
+ STD_COPY = 1
223
+ STD_PASTE = 2
224
+ STD_UNDO = 3
225
+ STD_REDOW = 4
226
+ STD_DELETE = 5
227
+ STD_FILENEW = 6
228
+ STD_FILEOPEN = 7
229
+ STD_FILESAVE = 8
230
+ STD_PRINTPRE = 9
231
+ STD_PROPERTIES = 10
232
+ STD_HELP = 11
233
+ STD_FIND = 12
234
+ STD_REPLACE = 13
235
+ STD_PRINT = 14
236
+
237
+ VIEW_LARGEICONS = 0
238
+ VIEW_SMALLICONS = 1
239
+ VIEW_LIST = 2
240
+ VIEW_DETAILS = 3
241
+ VIEW_SORTNAME = 4
242
+ VIEW_SORTSIZE = 5
243
+ VIEW_SORTDATE = 6
244
+ VIEW_SORTTYPE = 7
245
+ VIEW_PARENTFOLDER = 8
246
+ VIEW_NETCONNECT = 9
247
+ VIEW_NETDISCONNECT = 10
248
+ VIEW_NEWFOLDER = 11
249
+ VIEW_VIEWMENU = 12
250
+
251
+ HIST_BACK = 0
252
+ HIST_FORWARD = 1
253
+ HIST_FAVORITES = 2
254
+ HIST_ADDTOFAVORITES = 3
255
+ HIST_VIEWTREE = 4
256
+
257
+ CBM_INIT = 0x04
258
+
259
+ BN_CLICKED = 0 unless defined? BN_CLICKED # defined in button.rb
260
+ end
261
+
262
+ # A control that contains one or more buttons. Each button, when clicked by a user, sends a command message to the parent window.
263
+ # <br>See also <a href="https://docs.microsoft.com/en-us/windows/desktop/Controls/
264
+ # window-controls"> Windows Control section of Microsoft Docs.</a>
265
+ class Toolbar < WinControl #CommonControl
266
+ if RWin::X64
267
+ TBBUTTON = API.defstruct "
268
+ int iBitmap;
269
+ int idCommand;
270
+ BYTE fsState;
271
+ BYTE fsStyle;
272
+ BYTE bReserved[6];
273
+ ULONG_PTR dwData;
274
+ TCHAR *iString;"
275
+ else
276
+ TBBUTTON = API.defstruct "
277
+ int iBitmap;
278
+ int idCommand;
279
+ BYTE fsState;
280
+ BYTE fsStyle;
281
+ BYTE bReserved[2];
282
+ DWORD dwData;
283
+ TCHAR *iString;"
284
+ end
285
+
286
+ TBBUTTONINFO = API.defstruct "
287
+ UINT cbSize;
288
+ DWORD dwMask;
289
+ int idCommand;
290
+ int iImage;
291
+ BYTE fsState;
292
+ BYTE fsStyle;
293
+ WORD cx;
294
+ LPARAM lParam;
295
+ LPTSTR pszText;
296
+ int cchText;"
297
+
298
+ TBNOTIFY = API.defstruct "
299
+ NMHDR hdr;
300
+ int iItem;
301
+ TBBUTTON tbButton;
302
+ int cchText;
303
+ LPTSTR pszText;"
304
+
305
+ TBADDBITMAP = API.defstruct "
306
+ HANDLE hInst;
307
+ UINT nID;"
308
+
309
+ NMTBSAVE = API.defstruct "
310
+ NMHDR hdr;
311
+ DWORD *pData;
312
+ DWORD *pCurrent;
313
+ UINT cbData;
314
+ int iItem;
315
+ int cButtons;
316
+ TBBUTTON tbButton;"
317
+
318
+ NMTBRESTORE = API.defstruct "
319
+ NMHDR hdr;
320
+ DWORD *pData;
321
+ DWORD *pCurrent;
322
+ UINT cbData;
323
+ int iItem;
324
+ int cButtons;
325
+ int cbBytesPerRecord;
326
+ TBBUTTON tbButton;"
327
+
328
+ NMTBGETINFOTIP = API.defstruct "
329
+ NMHDR hdr;
330
+ LPTSTR pszText;
331
+ int cchTextMax;
332
+ int iItem;
333
+ LPARAM lParam;"
334
+
335
+ NMTBDISPINFO = API.defstruct "
336
+ NMHDR hdr;
337
+ DWORD dwMask;
338
+ int idCommand;
339
+ LPARAM lParam;
340
+ int iImage;
341
+ LPTSTR pszText;
342
+ int cchText;"
343
+
344
+ NMTOOLBAR = API.defstruct "
345
+ NMHDR hdr;
346
+ int iItem;
347
+ TBBUTTON tbButton;
348
+ int cchText;
349
+ LPSTR pszText;
350
+ RECT rcButton;"
351
+
352
+ NMTBHOTITEM = API.defstruct "
353
+ NMHDR hdr;
354
+ int idOld;
355
+ int idNew;
356
+ DWORD dwFlags;"
357
+
358
+ BtnStyles = {
359
+ :button => BTNS_BUTTON,
360
+ :sep => BTNS_SEP,
361
+ :check => BTNS_CHECK,
362
+ :group => BTNS_GROUP,
363
+ :checkgroup => BTNS_CHECKGROUP,
364
+ :dropdown => BTNS_DROPDOWN,
365
+ :autosize => BTNS_AUTOSIZE,
366
+ :noprefix => BTNS_NOPREFIX,
367
+ :showtext => BTNS_SHOWTEXT,
368
+ :wholedropdown => BTNS_WHOLEDROPDOWN
369
+ }
370
+
371
+ TbStates = {
372
+ :checked => TBSTATE_CHECKED,
373
+ :pressed => TBSTATE_PRESSED,
374
+ :enabled => TBSTATE_ENABLED,
375
+ :hidden => TBSTATE_HIDDEN,
376
+ :indeterminate => TBSTATE_INDETERMINATE,
377
+ :wrap => TBSTATE_WRAP,
378
+ :disabled => ~TBSTATE_ENABLED,
379
+ }
380
+
381
+ # icon indexes for standard bitmap
382
+ StdBitmapSymbols = {
383
+ :cut => STD_CUT,
384
+ :copy => STD_COPY,
385
+ :paste => STD_PASTE,
386
+ :undo => STD_UNDO,
387
+ :redow => STD_REDOW,
388
+ :delete => STD_DELETE,
389
+ :filenew => STD_FILENEW,
390
+ :fileopen => STD_FILEOPEN,
391
+ :filesave => STD_FILESAVE,
392
+ :printpre => STD_PRINTPRE,
393
+ :properties => STD_PROPERTIES,
394
+ :help => STD_HELP,
395
+ :find => STD_FIND,
396
+ :replace => STD_REPLACE,
397
+ :print => STD_PRINT
398
+ }
399
+
400
+ # icon indexes for standard view bitmap
401
+ ViewBitmapSymbols = {
402
+ :largeicons => VIEW_LARGEICONS,
403
+ :smallicons => VIEW_SMALLICONS,
404
+ :list => VIEW_LIST,
405
+ :details => VIEW_DETAILS,
406
+ :sortname => VIEW_SORTNAME,
407
+ :sortsize => VIEW_SORTSIZE,
408
+ :sortdate => VIEW_SORTDATE,
409
+ :sorttype => VIEW_SORTTYPE,
410
+ :parentfolder => VIEW_PARENTFOLDER,
411
+ :netconnect => VIEW_NETCONNECT,
412
+ :netdisconnect => VIEW_NETDISCONNECT,
413
+ :newfolder => VIEW_NEWFOLDER,
414
+ :viewmenu => VIEW_VIEWMENU
415
+ }
416
+
417
+ # icon indexes for standard history bitmap
418
+ HistBitmapSymbols = {
419
+ :back => HIST_BACK,
420
+ :forward => HIST_FORWARD,
421
+ :favorites => HIST_FAVORITES,
422
+ :addtofavorites => HIST_ADDTOFAVORITES,
423
+ :viewtree => HIST_VIEWTREE
424
+ }
425
+
426
+ # Wrapper of idcmd, and holder of name and data.<br>
427
+ # Usage: Toolbar::Button.new([owner], name, ibitmap, text=nil, style=0, state=0, options...)
428
+ class Button
429
+
430
+ include RC
431
+ # include ModUtil
432
+ attr_reader :idcmd
433
+
434
+ def self.[](*args) self.new(*args); end
435
+
436
+ def initialize(*args)
437
+ if args[0].is_a? Toolbar
438
+ @owner = args.shift
439
+ end
440
+ if args[0].is_a? Symbol
441
+ optionfuncs = args.pop if args.last.is_a?(Hash)
442
+
443
+ @name = args.shift #; dp "@%p, %p", args, SystemBitmaps
444
+ @ibitmap = args.shift
445
+ @style = BTNS_BUTTON
446
+ @state = TBSTATE_ENABLED
447
+ while args.last.is_a? Symbol
448
+ a = args.pop
449
+ if sty = BtnStyles[a]
450
+ @style |= sty
451
+ elsif sta = TbStates[a]
452
+ if sta < 0
453
+ @state &= sta
454
+ else
455
+ @state |= sta
456
+ end
457
+ end
458
+ end
459
+ raise ArgumentError, sprintf("Too many arguments: %p", args) if args.size > 4
460
+ txt, stl, stt, dat = args
461
+ @text = txt if txt
462
+ stl>0 ? @style|=stl : @style&=stl if stl
463
+ stt>0 ? @state|=stt : @state&=stt if stt
464
+ @data = dat if dat
465
+
466
+ # dp "@name=%p, @idcmd=%p, ibitmap=%p, @text=%p, style=%p, state=%p, data=%p", @name, @idcmd, @ibitmap, @text, @style, @state, @data
467
+ if optionfuncs
468
+ if @owner
469
+ optionfuncs.each{|k, v| __send__(k.to_s + '=', v)}
470
+ else
471
+ @__attrs = optionfuncs
472
+ end
473
+ end
474
+ else
475
+ @idcmd = args[0]
476
+ end
477
+ end
478
+
479
+ def owner=(onr)
480
+ @owner = onr
481
+ @__attrs.each{|k, v| __send__(k.to_s + '=', v)} if @__attrs
482
+ end
483
+
484
+ def idcmd=(id)
485
+ @idcmd = id
486
+ end
487
+
488
+ def inspect()
489
+ sprintf "#<#{self.class}:%x @name=%s, @idcmd=%p>", self.__id__, @name, @idcmd
490
+ end
491
+
492
+ def delete()
493
+ @owner.delete(self)
494
+ end
495
+
496
+ ### attributes ###
497
+
498
+ private
499
+ def _setsate_sep(st, f)
500
+ if @owner.alive?
501
+ @state = @owner.SendMessage(TB_GETSTATE, @idcmd, 0)
502
+ f ? @state | st : @state & ~st
503
+ @owner.SendMessage(TB_SETSTATE, @idcmd, @state)
504
+ else
505
+ f ? @state | st : @state & ~st
506
+ end
507
+ end
508
+
509
+ def _getstate_sep(st)
510
+ @state = @owner.SendMessage(TB_GETSTATE, @idcmd, 0) if @owner.alive?
511
+ (@state & st) > 0
512
+ end
513
+
514
+ public
515
+ def enabled() _getsate_sep(TBSTATE_ENABLED); end
516
+ def enabled=(f) _setsate_sep(TBSTATE_ENABLED, f); end
517
+
518
+ def checked() _getsate_sep(TBSTATE_CHECKED); end
519
+ def checked=(f) _setsate_sep(TBSTATE_CHECKED, f); end
520
+
521
+ def pressed() _getsate_sep(TBSTATE_PRESSED); end
522
+ def pressed=(f) _setsate_sep(TBSTATE_PRESSED, f); end
523
+
524
+ def hidden() _getsate_sep(TBSTATE_HIDDEN); end
525
+ def hidden=(f) _setsate_sep(TBSTATE_HIDDEN, f); end
526
+
527
+ def indeterminate() _getsate_sep(TBSTATE_INDETERMINATE); end
528
+ def indeterminate=(f) _setsate_sep(TBSTATE_INDETERMINATE, f); end
529
+
530
+ def name() @name; end
531
+ def name=(str)
532
+ @owner._delete_accessor(@name)
533
+ @name = str.intern
534
+ @owner._add_accessor(self, @name)
535
+ end
536
+
537
+ def state()
538
+ @owner.alive? ? @owner.SendMessage(TB_GETSTATE, @idcmd, 0) : @state
539
+ end
540
+ def state=(*args)
541
+ args.flatten!
542
+ st = self.state
543
+ while args.last.is_a? Symbol
544
+ if sta = TbStates[a=args.pop]
545
+ if sta < 0
546
+ st &= sta
547
+ else
548
+ st |= sta
549
+ end
550
+ end
551
+ end
552
+ unless args.empty?
553
+ if args[0] < 0
554
+ st &= args[0]
555
+ else
556
+ st |= args[0]
557
+ end
558
+ end
559
+ @state = st
560
+ @owner.SendMessage(TB_SETSTATE, @idcmd, st) if @owner.alive?
561
+ end
562
+
563
+ def style() # NG!!
564
+ if @owner.alive?
565
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_STYLE]
566
+ @owner.SendMessage(TB_GETBUTTONINFO, @idcmd, tbi)
567
+ # @owner.SendMessage(TB_GETSTYLE, @idcmd, 0)
568
+ tbi.fsStyle
569
+ else
570
+ @style
571
+ end
572
+ end
573
+ def style=(args) # NG!!
574
+ if args.is_a?(Array)
575
+ st = 0
576
+ while args.last.is_a? Symbol
577
+ if sty = BtnStyles[args.pop]
578
+ st |= sty
579
+ end
580
+ end
581
+ st |= args[0] unless args.empty?
582
+ else
583
+ st = args
584
+ end
585
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_STYLE, nil, nil, nil, st]
586
+ @owner.SendMessage(TB_SETBUTTONINFO, @idcmd, tbi)
587
+ end
588
+
589
+ def iimage()
590
+ @owner.alive? ? @owner.SendMessage(TB_GETBITMAP, @idcmd, 0) : @ibitmap
591
+ end
592
+ def iimage=(iimg)
593
+ @ibitmap = iimg
594
+ if @owner.alive?
595
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_IMAGE, nil, iimg]
596
+ @owner.SendMessage(TB_SETBUTTONINFO, @idcmd, tbi)
597
+ end
598
+ end
599
+ alias ibitmap iimage
600
+ alias ibitmap= iimage=
601
+
602
+ def text()
603
+ if @owner.alive?
604
+ @owner.SendMessage(TB_GETBUTTONTEXT, @idcmd, buff=TCHAR[32]) #; dpp buff.to_s
605
+ buff.to_s
606
+ else
607
+ @text
608
+ end
609
+ end
610
+ def text=(txt)
611
+ @text = txt
612
+ if @owner.alive?
613
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_TEXT]
614
+ tbi.pszText = txt || 0
615
+ tbi.cchText = txt ? txt.size : 0
616
+ @owner.SendMessage(TB_SETBUTTONINFO, @idcmd, tbi)
617
+ end
618
+ end
619
+
620
+ def data()
621
+ if @owner.alive?
622
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_LPARAM]
623
+ @owner.SendMessage(TB_GETBUTTONINFO, @idcmd, tbi)
624
+ ObjectSpace._id2ref(tbi.lParam)
625
+ else
626
+ @data
627
+ end
628
+ end
629
+ def data=(dt)
630
+ @data = dt
631
+ if @owner.alive?
632
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_LPARAM]
633
+ tbi.lParam = @data.__id__
634
+ SendMessage(TB_SETBUTTONINFO, @idcmd, tbi)
635
+ end
636
+ end
637
+
638
+ def index()
639
+ @owner.index(self)
640
+ end
641
+
642
+ def width()
643
+ if @owner.alive?
644
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_SIZE]
645
+ @owner.SendMessage(TB_GETBUTOONINFO, @idcmd, tbi)
646
+ tbi.cx
647
+ else
648
+ @_width
649
+ end
650
+ end
651
+ def width=(w)
652
+ if @owner.alive?
653
+ tbi = TBBUTTONINFO[TBBUTTONINFO::Size, TBIF_SIZE]
654
+ tbi.cx = w
655
+ @owner.SendMessage(TB_SETBUTTONINFO, @idcmd, tbi)
656
+ else
657
+ @_width = w
658
+ end
659
+ end
660
+
661
+ def rect()
662
+ @owner.SendMessage(TB_GETRECT, @idcmd, rc=RECT.new)
663
+ rc
664
+ end
665
+
666
+ def infotip()
667
+ _T(@owner._infotips[@idcmd])
668
+ end
669
+ def infotip=(tiptext)
670
+ @owner._infotips[@idcmd] = _I(tiptext)
671
+ end
672
+
673
+ def _tbbutton
674
+ # ibmp = @ibitmap.is_a?(Symbol) ? SystemBitmaps[@ibitmap] : @ibitmap
675
+ ibmp = @ibitmap.is_a?(Symbol) ? @owner._systembitmaps[@ibitmap] : @ibitmap
676
+ TBBUTTON[ibmp, @idcmd, @state, @style, nil, @data.__id__, @text]
677
+ end
678
+ end # Button
679
+
680
+ ###################### Main ######################
681
+ include ModCommCtrl
682
+ include ModParent
683
+ include ModAccessor
684
+
685
+ DefaultWindowStyle = CCS_TOP
686
+ SystemBitmaps = {:noimage=>I_IMAGENONE}
687
+
688
+ WinStyles = {
689
+ :tooltips => TBSTYLE_TOOLTIPS,
690
+ :wrapable => TBSTYLE_WRAPABLE,
691
+ :latdrag => TBSTYLE_ALTDRAG,
692
+ :flat => TBSTYLE_FLAT,
693
+ :list => TBSTYLE_LIST,
694
+ :customerase => TBSTYLE_CUSTOMERASE,
695
+ :registerdrop => TBSTYLE_REGISTERDROP,
696
+ :transparent => TBSTYLE_TRANSPARENT
697
+ }
698
+ WinStyles.update(CCStyles)
699
+ # def self.sym2style(*args) _sym2style(WinStyles, args); end
700
+
701
+ WinExStyles = {
702
+ }
703
+ # def self.sym2exstyle(*args) _sym2style(WinExStyles, args); end
704
+
705
+ TbExtendedStyles = {
706
+ :drawddarrows => TBSTYLE_EX_DRAWDDARROWS,
707
+ :mixedbuttons => TBSTYLE_EX_MIXEDBUTTONS,
708
+ :hideclippedbuttons => TBSTYLE_EX_HIDECLIPPEDBUTTONS,
709
+ :doublebuffer => TBSTYLE_EX_DOUBLEBUFFER
710
+ }
711
+ # def self.sym2style(*args) _sym2style(WinStyles, args); end
712
+
713
+ PreDefinedEvents = {
714
+ :char => [WM_NOTIFY, NM_CHAR, 'xs', NMCHAR],
715
+ :click => [WM_NOTIFY, NM_CLICK, 'xs', NMMOUSE],
716
+ :customdraw => [WM_NOTIFY, NM_CUSTOMDRAW , 'xs', NMCUSTOMDRAW],
717
+ :dblclk => [WM_NOTIFY, NM_DBLCLK, 'xs', NMMOUSE],
718
+ :keydown => [WM_NOTIFY, NM_KEYDOWN, 'xs', NMKEY],
719
+ :ldown => [WM_NOTIFY, NM_LDOWN, 'xs', NMMOUSE],
720
+ :rclick => [WM_NOTIFY, NM_RCLICK, 'xs', NMMOUSE],
721
+ :rdblclk => [WM_NOTIFY, NM_RDBLCLK, 'xs', NMMOUSE],
722
+ :releasedcapture => [WM_NOTIFY, NM_RELEASEDCAPTURE, 'xs', NMHDR],
723
+ :tooltipscreated => [WM_NOTIFY, NM_TOOLTIPSCREATED, 'xs', NMTOOLTIPSCREATED],
724
+ :begindrag => [WM_NOTIFY, TBN_BEGINDRAG, 'xs', NMTOOLBAR],
725
+ :enddrag => [WM_NOTIFY, TBN_ENDDRAG, 'xs', NMTOOLBAR],
726
+ :beginadjust => [WM_NOTIFY, TBN_BEGINADJUST, 'xs', NMHDR],
727
+ :endadjust => [WM_NOTIFY, TBN_ENDADJUST, 'xs', NMHDR],
728
+ :reset => [WM_NOTIFY, TBN_RESET, 'xs', NMHDR],
729
+ :queryinsert => [WM_NOTIFY, TBN_QUERYINSERT, 'xs', NMTOOLBAR],
730
+ :querydelete => [WM_NOTIFY, TBN_QUERYDELETE, 'xs', NMTOOLBAR],
731
+ :toolbarchange => [WM_NOTIFY, TBN_TOOLBARCHANGE, 'xs', NMHDR],
732
+ :custhelp => [WM_NOTIFY, TBN_CUSTHELP, 'xs', NMHDR],
733
+ :dropdown => [WM_NOTIFY, TBN_DROPDOWN, 'xs', NMTOOLBAR],
734
+ :hotitemchange => [WM_NOTIFY, TBN_HOTITEMCHANGE, 'xs', NMTBHOTITEM],
735
+ :draguot => [WM_NOTIFY, TBN_DRAGOUT, 'xs', NMTOOLBAR],
736
+ :deletingbutton => [WM_NOTIFY, TBN_DELETINGBUTTON, 'xs', NMTOOLBAR],
737
+ :getdispinfo => [WM_NOTIFY, TBN_GETDISPINFO, 'xs', NMTBDISPINFO],
738
+ :getinfotip => [WM_NOTIFY, TBN_GETINFOTIP, 'xs', NMTBDISPINFO],
739
+ :getbuttoninfo => [WM_NOTIFY, TBN_GETBUTTONINFO, 'xs', NMTOOLBAR],
740
+ :restore => [WM_NOTIFY, TBN_RESTORE, 'xs', NMTBRESTORE],
741
+ :save => [WM_NOTIFY, TBN_SAVE, 'xs', NMTBSAVE],
742
+ :initcustomize => [WM_NOTIFY, TBN_INITCUSTOMIZE, 'xs', NMHDR],
743
+ :dragover => [WM_NOTIFY, TBN_DRAGOVER, 'xs', NMTBHOTITEM],
744
+ :mapaccelerator => [WM_NOTIFY, TBN_MAPACCELERATOR, 'xs', NMCHAR]
745
+
746
+ # :wraphotitem => [WM_NOTIFY, TBN_WRAPHOTITEM, 'xs', NMTBWRAPHOTITEM],
747
+ # :dupaccelerator => [WM_NOTIFY, TBN_DUPACCELERATOR, 'xs',],
748
+ # :wrapaccelerator=> [WM_NOTIFY, TBN_WRAPACCELERATOR, ],
749
+ }
750
+ DefaultEvents = []
751
+
752
+ attr_reader :_infotips, :_systembitmaps
753
+
754
+ def initialize(*args)
755
+ super
756
+ @_classname = "ToolbarWindow32"
757
+ @_buttons = [] #Collection.new
758
+ @_infotips = {}
759
+ @_acceptable_events = PreDefinedEvents.dup
760
+ @_systembitmaps = {:noimage=>I_IMAGENONE}
761
+ end
762
+ #
763
+ def idcmd=(id)
764
+ parent.set_msgtranslator(WM_NOTIFY) unless parent.get_msgtranslator(WM_NOTIFY)
765
+ parent.register_event(WM_SIZE, '__toolbar_resize__', 'ii', self)
766
+ parent.register_event(id, WM_NOTIFY, TBN_GETINFOTIP, "__getinfotip__", 'xi',
767
+ self) if (self.style & TBSTYLE_TOOLTIPS) != 0
768
+ super
769
+ end
770
+ #
771
+ def create()
772
+ if @controls
773
+ def @controls.receiver=(r)
774
+ @receiver = r
775
+ end
776
+ @controls.receiver = parent
777
+ end
778
+ super
779
+ SendMessage(TB_BUTTONSTRUCTSIZE, TBBUTTON::Size, 0)
780
+ self.imagelist = @__imagelist if @__imagelist
781
+ self.extendedstyle = @__extendedstyle if @__extendedstyle
782
+ @_buttons.each_with_index{|btn, idx|
783
+ SendMessage(TB_INSERTBUTTON, idx, btn._tbbutton)
784
+ if @controls && (ctl=@controls.find{|i| i.__associated_toolbar_id == btn.idcmd})
785
+ ctl.move(btn.rect.left, 0)
786
+ end
787
+ } if @_buttons
788
+ autosize
789
+ self.tooltips = @__tooltips if @__tooltips
790
+ @__imagelist = @__extendedstyle = @_buttons = @__tooltips = nil
791
+ end
792
+
793
+ # Inserts a toolbar button or control at the specified index and argument.<br>
794
+ # If an array of [name, ibitmap, text=nil, style=0, state=0, options...] given, inserts a toolbar button.<br>
795
+ # If a symbol of :sep geven, inserts separator.<br>
796
+ # And if a WinControl given, inserts a control in this toolbar control.
797
+ def insert(idx, arg) #; dpp idx, arg
798
+ if arg.is_a?(Array) && arg[0].is_a?(Symbol)
799
+ tbb = Toolbar::Button[*arg]
800
+ elsif arg.is_a?(Toolbar::Button)
801
+ tbb = arg
802
+ elsif arg.is_a?(Symbol)
803
+ raise ArgumentError, "Symbol must be `:sep'", caller(1) if arg != :sep
804
+ tbb = Toolbar::Button[:separator, -1, nil, BTNS_SEP]
805
+ elsif arg.is_a?(WinControl)
806
+ @controls ||= Controls.new(self, parent)
807
+ tbb = Toolbar::Button[arg.name, arg.w, nil, BTNS_SEP]
808
+ @controls << arg
809
+ class << arg
810
+ attr_accessor :__associated_toolbar_id
811
+ end
812
+ self._add_accessor(arg, arg.name)
813
+ else
814
+ raise ArgumentError, sprintf("Unknown argument: %p", arg)
815
+ end
816
+ tbb.idcmd = parent.new_control_id
817
+ tbb.owner = self
818
+ arg.__associated_toolbar_id = tbb.idcmd if arg.respond_to?(:__associated_toolbar_id)
819
+ topwin = get_toplevel_win()
820
+ topwin.set_msgtranslator(WM_COMMAND) unless topwin.get_msgtranslator(WM_COMMAND)
821
+ # parent.set_msgtranslator(WM_COMMAND) unless parent.get_msgtranslator(WM_COMMAND)
822
+ if tbb.style!=BTNS_SEP;
823
+ topwin.register_event(tbb.idcmd, WM_COMMAND, BN_CLICKED, "#{tbb.name}_clicked", "h")
824
+ # parent.register_event(tbb.idcmd, WM_COMMAND, BN_CLICKED, "#{tbb.name}_clicked", "h")
825
+ end
826
+ _add_accessor(tbb, tbb.name)
827
+ if alive?
828
+ SendMessage(TB_INSERTBUTTON, idx, tbb._tbbutton)
829
+ if @controls
830
+ @controls.each{|i|
831
+ SendMessage(TB_GETRECT, i.__associated_toolbar_id, rc=RECT.new)
832
+ i.x = rc.left
833
+ }
834
+ end
835
+ autosize
836
+ else
837
+ @_buttons.insert(idx, tbb)
838
+ end
839
+ tbb
840
+ end
841
+
842
+ # Retreives index of a specified object in this toolbar control. <br>
843
+ # An object can be a Toolbar::Button or a WinControl.
844
+ def index(obj)
845
+ if alive?
846
+ SendMessage(TB_COMMANDTOINDEX, obj.idcmd, 0)
847
+ else
848
+ @_buttons.index(obj)
849
+ end
850
+ end
851
+
852
+ # Deletes a specified object in this toolbar control.<br>
853
+ # An object can be a Toolbar::Button or a WinControl.
854
+ # If no argument given, deletes this toolbar control.
855
+ def delete(obj=nil)
856
+ return super() unless obj
857
+ if alive?
858
+ idx = self.index(obj)
859
+ SendMessage(TB_DELETEBUTTON, idx, 0)
860
+ _delete_accessor(obj.name, obj)
861
+ if @controls
862
+ ctl = @controls[obj.name]
863
+ @controls.delete(ctl) if ctl
864
+ @controls.each{|i|
865
+ SendMessage(TB_GETRECT, i.__associated_toolbar_id, rc=RECT.new)
866
+ i.x = rc.left
867
+ }
868
+ end
869
+ else
870
+ @_buttons.delete(obj) if @_buttons
871
+ end
872
+ end
873
+
874
+ # Adds the multiple arguments at last of this toolbar contol.
875
+ # Each of arguments can be an argument when inserting in this toolbar control.
876
+ def <<(*arg)
877
+ arg = arg[0] if arg[0].is_a?(Array) || arg.size==1
878
+ if arg.is_a?(Array) && !arg[0].is_a?(Symbol)
879
+ arg.each{|i| insert(self.buttoncount, i)}
880
+ else
881
+ insert(self.buttoncount, arg)
882
+ end
883
+ end
884
+
885
+ # Retreives a specified index of object in this toolbar.
886
+ # Return value may be a Toolbar::Button or a WinControl.
887
+ def [](idx)
888
+ if alive?
889
+ tbb = TBBUTTON.new
890
+ SendMessage(TB_GETBUTTON, idx, tbb)
891
+ idcmd2ref(tbb.idCommand)
892
+ else
893
+ @_buttons[idx]
894
+ end
895
+ end
896
+
897
+ # []=(index, count=1, *args)
898
+ # Inserts and replaces the multiple arguments at last of this toolbar contol.
899
+ # Each of arguments can be an argument when inserting in this toolbar control.
900
+ def []=(idx, *args)
901
+ num = args[0].is_a?(Integer) ? args.shift : 1
902
+ num.times{self._delete(self[idx])}
903
+ if args[0].is_a? Array
904
+ args[0].each_with_index{|v, i| self.insert(idx+i, v)}
905
+ else
906
+ args.each_with_index{|v, i| self.insert(idx+i, v)}
907
+ end
908
+ end
909
+
910
+ # each(){|objct| ... }
911
+ # Performs the block for each <i>object</i> in this toolbar control as a block parameter.<br>
912
+ # The given parameter will be a Toolbar::Button or a WinControl.
913
+ def each()
914
+ self.buttoncount.times{|i|
915
+ yield self[i]
916
+ }
917
+ end
918
+
919
+ # Retreives an object in this toolbar control from specified <i>id</i>.
920
+ def idcmd2ref(id)
921
+ if alive?
922
+ @_accessors.each{|k, v|
923
+ if v.is_a?(Array)
924
+ v.each{|i| return i if i.idcmd==id}
925
+ else
926
+ return v if v.idcmd==id
927
+ end
928
+ }
929
+ nil
930
+ else
931
+ @_buttons.find{|i| i.idcmd == id}
932
+ end
933
+ end
934
+
935
+ # Retreives extended styles for this toolbar control.
936
+ def extendedstyle()
937
+ alive? ? SendMessage(TB_GETEXTENDEDSTYLE, 0, 0) : @__extendedstyle.to_i
938
+ end
939
+ # Sets the extended styles for this toolbar control.
940
+ def extendedstyle=(xstyle)
941
+ alive? ? SendMessage(TB_SETEXTENDEDSTYLE, 0, xstyle) : @__extendedstyle = xstyle
942
+ end
943
+
944
+ # Determines where a point lies in this toolbar control.
945
+ def hittest(x, y)
946
+ SendMessage(TB_HITTEST, 0, POINT[x, y])
947
+ end
948
+
949
+ # Retrieves the current width and height of toolbar buttons, in pixels.
950
+ def buttonsize()
951
+ SPLITPARAM(SendMessage(TB_GETBUTTONSIZE, 0, 0))
952
+ end
953
+ # Sets the size of buttons on a toolbar.
954
+ def buttonsize=(arg)
955
+ w, h = arg
956
+ SendMessage(TB_SETBUTTONSIZE, 0, MAKELPARAM(w, h))
957
+ autosize
958
+ end
959
+
960
+ # Retrieves a count of the buttons currently in this toolbar.
961
+ def buttoncount()
962
+ alive? ? SendMessage(TB_BUTTONCOUNT, 0, 0) : @_buttons.size
963
+ end
964
+
965
+ # Causes this toolbar to be resized.
966
+ def autosize()
967
+ SendMessage(TB_AUTOSIZE, 0, 0)
968
+ end
969
+
970
+ # each_buttons(){|button| ... }
971
+ # Performs the block for each <i>button</i> in this toolbar control as a block parameter.<br>
972
+ # The given parameter will be a Toolbar::Button.
973
+ def each_buttons()
974
+ self.buttoncount.times{|i| yield self[i]} if block_given?
975
+ end
976
+
977
+ # Adds one or more images to the list of button images available for this toolbar.
978
+ def addbitmap(bmp, n=0)
979
+ if SendMessage(TB_GETIMAGELIST, 0, 0) != 0
980
+ raise RuntimeError, "Imagelist was already set, so cannot run this method.", caller(2)
981
+ end
982
+ if bmp.is_a? TBADDBITMAP
983
+ hbitmap = bmp
984
+ elsif bmp.is_a? Integer
985
+ hbitmap = TBADDBITMAP[nil, bmp]
986
+ elsif bmp.is_a? RWin::Imagelist
987
+ h = bmp.getimageinfo(0)[2][3]
988
+ n = bmp.count
989
+ cv = RWin::Canvas.new(h * n, h, RWin::API.getSysColor(30))
990
+ n.times{|i| cv.drawImagelist(bmp, i, i*h, 0)}
991
+ hbitmap = TBADDBITMAP[nil, cv.hbitmap(self)]
992
+ elsif bmp.is_a? RWin::Canvas
993
+ n = bmp.width / bmp.height
994
+ hbitmap = TBADDBITMAP[nil, bmp.hbitmap(self)]
995
+ else
996
+ raise ArgumentError, "argument must be Integer, Imagelist or Canvas", caller(2)
997
+ end
998
+ SendMessage(TB_ADDBITMAP, n, hbitmap)
999
+ end
1000
+
1001
+ API.loadlib "Comctl32.dll"
1002
+ API.defun "ImageList_GetIconSize(himl, pcx, pcy)"
1003
+ API.defun "ImageList_Destroy(HIMAGELIST himl)"
1004
+
1005
+ # Retrieves the image list that the toolbar uses to display buttons in their default state.
1006
+ def imagelist()
1007
+ if alive?
1008
+ himl = SendMessage(TB_GETIMAGELIST, 0, 0)
1009
+ if ret=APP.hrsc2ref(himl)
1010
+ ret
1011
+ elsif himl!=0
1012
+ pcx = API::DWORD[1]
1013
+ pcy = API::DWORD[1]
1014
+ API.ImageList_GetIconSize(himl, pcx, pcy)
1015
+ case pcy[0]
1016
+ when 24
1017
+ :systemlarge
1018
+ when 16
1019
+ :systemsmall
1020
+ else
1021
+ nil
1022
+ end
1023
+ else
1024
+ nil
1025
+ end
1026
+ else
1027
+ @__imagelist
1028
+ end
1029
+ end
1030
+
1031
+ # Sets the image list that the toolbar uses to display buttons in their default state.
1032
+ def imagelist=(il)
1033
+ if self.alive?
1034
+ if il==:systemsmall
1035
+ return if imagelist==:systemsmall
1036
+ raise "System image must be set initially." if imagelist || @__systemimagelist
1037
+ @_systembitmaps = {:noimage=>I_IMAGENONE}
1038
+ offset = SendMessage(TB_ADDBITMAP, 0, TBADDBITMAP[HINST_COMMCTRL, IDB_STD_SMALL_COLOR])
1039
+ StdBitmapSymbols.each{|k, v| @_systembitmaps[k] = offset + v}
1040
+ offset = SendMessage(TB_ADDBITMAP, 0, TBADDBITMAP[HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR])
1041
+ ViewBitmapSymbols.each{|k, v| @_systembitmaps[k] = offset + v}
1042
+ offset = SendMessage(TB_ADDBITMAP, 0, TBADDBITMAP[HINST_COMMCTRL, IDB_HIST_SMALL_COLOR])
1043
+ HistBitmapSymbols.each{|k, v| @_systembitmaps[k] = offset + v}
1044
+ @__systemimagelist = [:systemsmall, SendMessage(TB_GETIMAGELIST, 0, 0)]
1045
+ elsif il==:systemlarge
1046
+ return if imagelist==:systemlarge
1047
+ raise "System image must be set initially." if imagelist || @__systemimagelist
1048
+ @_systembitmaps = {:noimage=>I_IMAGENONE}
1049
+ offset = SendMessage(TB_ADDBITMAP, 0, TBADDBITMAP[HINST_COMMCTRL, IDB_STD_LARGE_COLOR])
1050
+ StdBitmapSymbols.each{|k, v| @_systembitmaps[k] = offset + v}
1051
+ offset = SendMessage(TB_ADDBITMAP, 0, TBADDBITMAP[HINST_COMMCTRL, IDB_VIEW_LARGE_COLOR])
1052
+ ViewBitmapSymbols.each{|k, v| @_systembitmaps[k] = offset + v}
1053
+ offset = SendMessage(TB_ADDBITMAP, 0, TBADDBITMAP[HINST_COMMCTRL, IDB_HIST_LARGE_COLOR])
1054
+ HistBitmapSymbols.each{|k, v| @_systembitmaps[k] = offset + v}
1055
+ @__systemimagelist = [:systemlarge, SendMessage(TB_GETIMAGELIST, 0, 0)]
1056
+ elsif il.is_a? RWin::Imagelist
1057
+ hi = il._himagelist
1058
+ SendMessage(TB_SETIMAGELIST, 0, hi)
1059
+ elsif il.nil?
1060
+ SendMessage(TB_SETIMAGELIST, 0, 0)
1061
+ else
1062
+ raise ArgumentError, "Argument must be Imagelist or :systemsmall or :systemlarge"
1063
+ end
1064
+ else
1065
+ @__imagelist = il
1066
+ end
1067
+ end
1068
+
1069
+ # Associates a tooltip control with a toolbar.<br>
1070
+ # Deprecated. Use `TBSTYLE_TOOLTIPS' style and `Tip#infotip=' method instead.
1071
+ def tooltips=(ttp)
1072
+ if alive?
1073
+ SendMessage(TB_SETTOOLTIPS, ttp ? ttp._hwnd : 0, 0)
1074
+ else
1075
+ @__tooltips = ttp
1076
+ end
1077
+ end
1078
+
1079
+ protected
1080
+ def _apply_options(arg)
1081
+ if st = WinStyles[arg]
1082
+ self.style |= st
1083
+ end
1084
+ if xst = WinExStyles[arg]
1085
+ self.extendedstyle |= xst
1086
+ end
1087
+ if tbxst=TbExtendedStyles[arg]
1088
+ self.extendedstyle |= tbxst
1089
+ end
1090
+ super
1091
+ end
1092
+
1093
+ private
1094
+ def __toolbar_resize__(wp, lp)
1095
+ SendMessage(WM_SIZE, wp, lp) if alive?
1096
+ end
1097
+ def __getinfotip__(lparam)
1098
+ infotip = NMTBGETINFOTIP.wrap_pointer(lparam)
1099
+ return unless infotip.hdr.idFrom==idcmd
1100
+ txt = @_infotips[infotip.iItem]
1101
+ if txt
1102
+ infotip.pszText = txt
1103
+ infotip.cchTextMax = txt.size
1104
+ end
1105
+ end
1106
+ end
1107
+ end