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,820 @@
1
+ # Project WRB was forked from Project VisualuRuby(temp-name).
2
+ # Author of this project: BANJO Koyu <banjokoyu at gmail.com>
3
+ # The URL of this project: https://bitbucket.org/wrb/
4
+ #
5
+ # This is a script part of WRB.
6
+ #
7
+ # Original wrapper for Windows API between Ruby 2.3 or later
8
+ # This is script side of RWin::API.
9
+ #
10
+
11
+ # Uncomment follows or write it on top level before require this file,
12
+ # if you want to use UTF-16LE encoding. (But NOT recommended.)
13
+ #
14
+ # RWin::Application.output_encoding = Encoding::UTF_16LE
15
+
16
+ require 'rwin.so'
17
+
18
+ def dp(*args) # debug print
19
+ if /^(.+?):(\d+)(?::in `.*')?/ =~ caller.first
20
+ file = File.basename($1)
21
+ line = $2.to_i
22
+ end
23
+ dir = args.shift
24
+ dir.sub!(/^\@( *)/, "\\1#{file}@#{line}: ")
25
+ STDERR.puts sprintf(dir, *args)
26
+ end
27
+
28
+ def dpp(*args) # debug print with line number and inspected arguments
29
+ if /^(.+?):(\d+)(?::in `.*')?/ =~ caller.first
30
+ file = File.basename($1)
31
+ line = $2.to_i
32
+ end
33
+ STDERR.puts "#{file}@#{line}: " + sprintf("%p", args).sub(/^\[(.*)\]$/, '\1')
34
+ end
35
+
36
+ module RWin::API
37
+
38
+ =begin
39
+ == RWin::API
40
+ This module containes following singleton methods and useful wrapper functions.
41
+
42
+ === Singleton methods
43
+ --- loadlib
44
+ Loads multiple dlls into application. Once dlls are loaded, it skips to
45
+ load next time.
46
+
47
+ RWin::API.loadlib 'user32.dll', 'kernel32'
48
+
49
+ --- defun(prototypes)
50
+ Defines the Windows API function, which is stocked into RWin::API module as
51
+ module function. Once function is defined, it skips to define next time.
52
+ The arguments which passed to an API function are automatically changed
53
+ according to these type: Integer, String and Proc as callback function.
54
+ Prototypes of arguments are ignored, only number of arguments is checked.
55
+ The return value is always an integer as LONG.
56
+
57
+ RWin::API.defun 'EnumWindows(CALLBACK)'
58
+ RWin::API.defun 'GetLastError()'
59
+ RWin::API.defun 'FormatMessage','LLLLPLP'
60
+
61
+ Usage to call is bellow.
62
+
63
+ enum_wnd_proc = Proc.new{|hwnd| p hwnd}
64
+ RWin::API.EnumWindows(enum_wnd_proc)
65
+ buff = TCHAR[256]
66
+ RWin::API.FormatMessage(0x1000,0,RWin::API.getLastError,0,buff,buff.size,0)
67
+ puts RWin::API.encode_output(buff)
68
+
69
+ --- callback_address(*proc, &block)
70
+ Registers Proc object as a callback function, and returns its pointer
71
+ address as Integer. But usualy you may pass Proc object to the function
72
+ directly. See above.
73
+
74
+ enum_wnd_proc_address = RWin::API.callbackadress{|hwnd| p hwnd}
75
+
76
+ --- defstruct(prototypes)
77
+ Defines a API Structure class in current context.
78
+
79
+ POINT = RWin::API.defstruct 'int x, int y'
80
+ RECT = RWin::API.defstruct 'int left, int top, int right, int bottom'
81
+
82
+ --- typealias(newtype, oldtype)
83
+ Defines a alias ((<newtype>)) as ((<oldtype>))
84
+
85
+ === Typical module functions
86
+ --- encode_output(string)
87
+ Encodes string to RWin::Application.output_encoding. Use it output to
88
+ $stdout. '_T()' is alias of it.
89
+
90
+ --- encode_default(str)
91
+ Encodes string to Encoding.default_external. Use it when join with literal.
92
+ '_X()' is alias of it.
93
+
94
+ =end
95
+
96
+ def self.set_dlls(*args)
97
+ args.each{|i|
98
+ i = RbConfig::CONFIG["LIBRUBY_SO"] if i.nil?
99
+ RWin::API::CFunc.loadLibrary(i)
100
+ }
101
+ end
102
+
103
+ if RWin::UNICODE
104
+ def self.get_proc(fname, template, rettype, ubf=nil)
105
+ narg = template.size
106
+ cfunc = RWin::API::CFunc.getfunc(fname+'W', narg) || RWin::API::CFunc.new(fname, narg)
107
+ ubfstr = ubf ? "_ubf" : ""
108
+ module_eval( <<-EODEF,__FILE__,__LINE__+1)
109
+ @@__#{fname}__ = cfunc
110
+ def #{fname}(*args) @@__#{fname}__.call#{ubfstr}(*args); end
111
+ EODEF
112
+ cfunc
113
+ end
114
+ else
115
+ def self.get_proc(fname, template, rettype, ubf=nil)
116
+ narg = template.size
117
+ cfunc = RWin::API::CFunc.getfunc(fname+'A', narg) || RWin::API::CFunc.new(fname, narg)
118
+ ubfstr = ubf ? "_ubf" : ""
119
+ module_eval( <<-EODEF,__FILE__,__LINE__+1)
120
+ @@__#{fname}__ = cfunc
121
+ def #{fname}(*args) @@__#{fname}__.call#{ubfstr}(*args); end
122
+ EODEF
123
+ cfunc
124
+ end
125
+ end
126
+
127
+ def self.loadlib(*args)
128
+ set_dlls(*args)
129
+ end
130
+
131
+ def self.callbackadress(arg=nil, &block)
132
+ if block_given?
133
+ RWin::API.bindCallbackProc(Proc.new(&block))
134
+ elsif arg.is_a?(Proc)
135
+ RWin::API.bindCallbackProc(arg)
136
+ else
137
+ raise ArgumentError, "Neither Proc nor Block", caller(1)
138
+ end
139
+ end
140
+
141
+ def self.defun_core(args, ubf)
142
+ n = args.size
143
+ if n == 0
144
+ raise ArgumentError, 'No function name', caller(1)
145
+ elsif n == 1 # DL style
146
+ if /^([\w\*\s]+\s)?([\w\.]+\!)?(\w+)\(([\w\*\s\,\[\]]*)\)$/.match(args[0])
147
+ rettype, dllname, fname, args = $1, $2, $3, $4
148
+ rettype ? rettype.strip! : rettype = 'L'
149
+ dllname.chop! if dllname
150
+ template = args.strip.split(/\s*,\s*/)
151
+ else
152
+ raise RuntimeError,"can't parse the function prototype: #{args[0]}", caller(1)
153
+ end
154
+ template = template.map{|i|
155
+ if TypeAliases[i]
156
+ TypeAliases[i]
157
+ else
158
+ warn "WARNING: `#{i}' is not defined on the top level" if $DEBUG||$VERBOSE
159
+ 'P'
160
+ end
161
+ }.join('').tr('*p','P')
162
+ else # Win32API style
163
+ dllname = nil
164
+ fname = args[0]
165
+ template = args[1].is_a?(Array) ? args[1] : args[1].strip.split(/\s*,\s*/)
166
+ rettype = args[2] || 'L'
167
+ template = template.size == 1 ? template[0] : template.join('')
168
+ end
169
+ ret = TypeAliases[rettype] ||{'VOID'=>'V'}[rettype] || rettype
170
+ raise AegumentError, "Unrecognized return type `#{rettype}'", caller(1) if !ret||ret.size>1
171
+ dncase_name = fname[0, 1].downcase + fname[1,fname.size-1]
172
+ return if module_eval("defined?(#{dncase_name})")
173
+ RWin::API::CFunc.loadLibrary(dllname) if dllname
174
+ prc = get_proc(fname, template, ret, ubf);
175
+ self.module_eval("alias #{dncase_name} #{fname}")
176
+ self.module_eval("module_function :#{dncase_name},:#{fname}")
177
+ prc
178
+ end
179
+ private_class_method(:get_proc, :set_dlls, :defun_core)
180
+
181
+ def self.defun(*args) defun_core(args, nil); end
182
+ def self.defun_ubf(*args) defun_core(args, true); end
183
+
184
+ TypeAliases = {
185
+ # Base
186
+ 'B' => 'B',
187
+ 'C' => 'C',
188
+ 'H' => 'H',
189
+ 'W' => 'W',
190
+ 'L' => 'L',
191
+ 'P' => 'P',
192
+ 'S' => 'S',
193
+ 'U' => 'U',
194
+ 'T' => RWin::UNICODE ? 'W' : 'C',
195
+ 'c' => 'c', # Not encoded string for char*
196
+ 'Q' => 'Q', # X64 ? ULONGLONG : ULONG
197
+ 'I' => 'I', # X64 ? LONGLONG : LONG
198
+
199
+ # Common
200
+ 'byte' => 'B',
201
+ 'char' => 'c', # Not encoded string for char*
202
+ 'wchar_t' => 'W',
203
+ 'unsignedchar' => 'B',
204
+ 'short' => 'H',
205
+ 'int' => 'L',
206
+ 'uint' => 'U',
207
+ 'unsigned' => 'U',
208
+ 'unsignedint' => 'U',
209
+ 'long' => 'L',
210
+ 'unsignedlong' => 'U',
211
+ 'void' => 'L',
212
+
213
+ # Windows
214
+ 'CHAR' => 'C', # Encoded string for CHAR*
215
+ 'UCHAR' => 'B',
216
+ 'BYTE' => 'B',
217
+ 'WCHAR' => 'W',
218
+ 'SHORT' => 'H',
219
+ 'WORD' => 'H',
220
+ 'ATOM' => 'L',
221
+ 'INT' => 'L',
222
+ 'UINT' => 'U',
223
+ 'BOOL' => 'L',
224
+ 'LONG' => 'L',
225
+ 'ULONG' => 'U',
226
+ 'DWORD' => 'U',
227
+ 'HICON' => 'U',
228
+ 'COLORREF' => 'U',
229
+ 'LPARAM' => 'Q',
230
+ 'WPARAM' => 'Q',
231
+ 'VOID*' => 'P',
232
+ 'LPSTR' => 'S',
233
+ 'LPWSTR' => 'S',
234
+ 'LPTSTR' => 'S',
235
+ 'LPCSTR' => 'S',
236
+ 'LPCWSTR' => 'S',
237
+ 'LPCTSTR' => 'S',
238
+ 'TCHAR' => RWin::UNICODE ? 'W' : 'C',
239
+ 'HANDLE' => 'Q',
240
+ 'HINSTANCE' => 'Q',
241
+ 'HWND' => 'Q',
242
+ 'HDC' => 'Q',
243
+ 'HBITMAP' => 'Q',
244
+ 'ULONG_PTR' => 'Q', # for X64
245
+ 'UINT_PTR' => 'Q', # for X64
246
+ 'DWORD_PTR' => 'Q', # for X64
247
+ 'LONG_PTR' => 'I', # for X64
248
+ 'INT_PTR' => 'I' # for X64
249
+ }
250
+
251
+ TypeLength = {
252
+ 'B' => 1,
253
+ 'C' => 1,
254
+ 'H' => 2,
255
+ 'W' => 2,
256
+ 'L' => 4,
257
+ 'U' => 4,
258
+ 'P' => RWin::X64 ? 8 : 4,
259
+ 'S' => RWin::X64 ? 8 : 4,
260
+ 'Q' => RWin::X64 ? 8 : 4,
261
+ 'I' => RWin::X64 ? 8 : 4
262
+ }
263
+
264
+ # Pre-defined functions
265
+ loadlib 'kernel32'
266
+ defun "GetLastError()"
267
+ defun "DWORD FormatMessage(DWORD, LONG, DWORD, DWORD, LPTSTR, DWORD, void*)"
268
+ defun "GlobalLock(HANDLE)"
269
+ defun "GlobalUnlock(HANDLE)"
270
+
271
+ loadlib 'user32'
272
+ defun "GetClassName(hWnd, lpClassname, nMaxcount)"
273
+ defun "MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaptioon, UINT uType )"
274
+ defun "GetActiveWindow()"
275
+ defun "GetFocus()"
276
+ defun 'GetDlgItem(HWND iDlg, int nIDDlgitem)'
277
+ defun 'GetSystemMetrics(int nIndex)'
278
+ defun 'SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)'
279
+
280
+ # loadlib 'gdi32'
281
+ defun "gdi32.dll!GetStockObject(int fnObject)"
282
+
283
+ def self.lasterror()
284
+ buff = TCHAR[256]
285
+ len = FormatMessage(0x1000, 0, RWin::API.GetLastError, 0, buff, buff.size, nil)
286
+ buff.to_s
287
+ end
288
+
289
+ @@__nullchar_w_ = "\0\0".force_encoding(Encoding::UTF_16LE)
290
+ @@__nullregexp_w_ = Regexp.new("\0*$".encode!(Encoding::UTF_16LE))
291
+ @@__crregexp_w_ = Regexp.new("\r".encode!(Encoding::UTF_16LE))
292
+ @@__lfregexp_w_ = Regexp.new("\n".encode!(Encoding::UTF_16LE))
293
+ @@__crlfchar_w_ = "\r\n".encode!(Encoding::UTF_16LE)
294
+
295
+ def adjust_internal_lf_code(s)
296
+ str = s.to_s
297
+ if str.encoding==Encoding::UTF_16LE
298
+ str.gsub(@@__crregexp_w_ , '').gsub(@@__lfregexp_w_, @@__crlfchar_w_)
299
+ else
300
+ str.gsub(/\r/, '').gsub(/\n/, "\r\n")
301
+ end
302
+ end
303
+
304
+ def adjust_output_lf_code(s)
305
+ str = s.to_s
306
+ if str.encoding==Encoding::UTF_16LE
307
+ str.gsub(@@__crregexp_w_, '')
308
+ else
309
+ str.gsub(/\r/, '')
310
+ end
311
+ end
312
+
313
+ def encode_internal(s)
314
+ str = s.to_s
315
+ str.encode(Encoding::UTF_16LE).gsub(@@__nullregexp_w_, '').concat(@@__nullchar_w_)
316
+ end
317
+
318
+ def encode_output(s)
319
+ str = s.to_s
320
+ enc = RWin::Application.external_encoding
321
+ if str.encoding == Encoding::ASCII_8BIT
322
+ str.force_encoding(Encoding::UTF_16LE)
323
+ end
324
+ r = str.encode(enc)
325
+ if enc == Encoding::UTF_16LE
326
+ r.gsub(@@__nullregexp_w_, '')
327
+ else
328
+ r.gsub(/\0*$/, '')
329
+ end
330
+ end
331
+
332
+ def encode_default(s)
333
+ str = s.to_s
334
+ if str.encoding == Encoding::ASCII_8BIT
335
+ str.force_encoding(Encoding::UTF_16LE)
336
+ end
337
+ str.encode(Encoding.default_external).gsub(/\0*$/, '')
338
+ end
339
+
340
+ def encode_wide(str) encode_internal(str); end
341
+
342
+ def encoding2bin(str) str.force_encoding(Encoding::ASCII_8BIT); end
343
+
344
+ def encoding2default(str)
345
+ str.force_encoding(Encoding.default_external)
346
+ end
347
+
348
+ alias _T encode_output
349
+ alias _X encode_default
350
+
351
+ def typealias(newtype, oldtype)
352
+ if btypes = TypeAliases[oldtype]
353
+ raise TypeError,"template `P' not allowed, change type directly", caller(1) if btypes=='P'
354
+ TypeAliases[newtype] = btypes
355
+ else
356
+ raise ArgumentError, "#{oldtype} is not registered", caller(1)
357
+ end
358
+ end
359
+
360
+ module_function :typealias, :adjust_output_lf_code, :adjust_internal_lf_code,
361
+ :encode_output, :encode_default, :encode_internal,
362
+ :encode_wide, :encoding2bin, :encoding2default, :_T, :_X
363
+
364
+ if RWin::X64
365
+ def uint2int(u)
366
+ u = u & 0xffffffff_ffffffff
367
+ u > 0x7fffffff_ffffffff ? u - 0x100000000_00000000 : u
368
+ end
369
+ def int2uint(i)
370
+ i = i & 0xffffffff_ffffffff
371
+ end
372
+ else
373
+ def uint2int(u)
374
+ u = u & 0xffffffff
375
+ u > 0x7fffffff ? u - 0x100000000 : u
376
+ end
377
+ def int2uint(i)
378
+ i = i & 0xffffffff
379
+ end
380
+ end
381
+ module_function :uint2int, :int2uint
382
+
383
+ class CStruct # additional methods on Ruby side
384
+ Classes = nil
385
+ ArgCount = 1
386
+ Offsets = nil
387
+ References = nil
388
+ include Enumerable
389
+ # def each()
390
+ # self.class::Members.each{|name|# dpp name.to_s
391
+ # yield(name ? name.intern : nil, eval(name.to_s))
392
+ # }
393
+ # end
394
+ # def to_a()
395
+ # if !self.class::Members || self.class::Members == [nil]
396
+ # self[0, -1].inject([]){|ar, i| ar << (i.is_a?(CStruct) ? i.to_a : i)}
397
+ # else
398
+ # self.inject([]){|ar, i| ar << (i[1].is_a?(CStruct) ? i[1].to_a : i[1])}
399
+ # end
400
+ # end
401
+ # def to_hsh()
402
+ # hs = {}
403
+ # self.each{|nm, v| hs[nm] = (v.is_a?(CStruct) ? v.to_hsh : v)}
404
+ # hs
405
+ # end
406
+ # alias to_ary to_a
407
+
408
+ def to_a(rflag=true)
409
+ to_ary(rflag)
410
+ end
411
+
412
+ def self.defmembers(*args)
413
+ #get num of membuers
414
+ cmembers = self::SOffsets.unpack("SSS")[2]
415
+ # get first member
416
+ offset, ifunc, mblen, nth, klsidx = self::SOffsets[8, 8].unpack("SCCSS")
417
+ if args[0] && cmembers==1 && nth>0
418
+ alias_method(args[0], :value)
419
+ alias_method(args[0]+'=', :value=)
420
+ elsif args.size==1 && nth>0
421
+ define_method(args[0]){ self[0] }
422
+ define_method(args[0]+"=") {|x|
423
+ return self[0] = x if ifunc==2 || ifunc==4
424
+ raise TypeError, "Argument must be an Array at variable length." unless x.is_a? Array
425
+ x.each_with_index{|v, i| self[i] = v }
426
+ }
427
+ else
428
+ args.each_with_index{|s, i|
429
+ define_method(s){ self[i] }
430
+ define_method(s+"="){|x| self[i] = x }
431
+ }
432
+ end
433
+ end
434
+
435
+ def self.[](*args);
436
+ if (cmembers = self::SOffsets.unpack("SSS")[2]) == 1
437
+ offset, ifunc, mblen, nth, klsidx = self::SOffsets[8, 8].unpack("SCCSS")
438
+ if nth==0
439
+ __new_and_set_args__(*args)
440
+ else
441
+ if args[0].is_a?(String) || args[0].is_a?(Array)
442
+ obj = alloc(mblen*args[0].size)
443
+ obj.value = args[0]
444
+ obj
445
+ else
446
+ alloc(mblen*args[0])
447
+ end
448
+ end
449
+ else
450
+ __new_and_set_args__(*args)
451
+ end
452
+ end
453
+
454
+ def self.+(arg)
455
+ offset, ifunc, mblen, nth, klsidx = self::SOffsets[-8, 8].unpack("SCCSS")
456
+ # dpp offset, ifunc, mblen, nth, klsidx
457
+ if nth==0
458
+ raise ArgumentError, "Not a variable length Array."
459
+ else
460
+ alloc(self::Size + mblen*arg)
461
+ end
462
+ end
463
+
464
+ def to_hsh()
465
+ members = self.class.instance_methods - RWin::API::CStruct.instance_methods
466
+ members.select{|i| !(i.to_s=~/.*=$/)}.sort.inject({}){|h, m|
467
+ v = __send__(m)
468
+ h[m] = (v.is_a?(RWin::API::CStruct) ? v.to_hsh : v)
469
+ h
470
+ }
471
+ end
472
+ alias :to_h :to_hsh
473
+
474
+ def dump()
475
+ q, r = self.bytesize.divmod(16)
476
+ s = ""
477
+ q.times{|i|
478
+ b = self.slice(i*16, 16).to_b.unpack("C*")
479
+ p b
480
+ s += sprintf("%02X "*8+ " "+"%02X "*8, *b) +
481
+ b.inject(""){|a,b| a+(b>64 ? b.chr : '.')} + "\n"
482
+ }
483
+ b = self.slice(q*16, r).to_b.unpack("C*")
484
+ p b
485
+ if r > 8
486
+ s += sprintf("%02X "*8 + " ", *b[0, 8])
487
+ rr = r - 8
488
+ offset = 8
489
+ offset2 = 0
490
+ else
491
+ offset = 0
492
+ offset2 = 1
493
+ rr = r
494
+ end
495
+ s += sprintf("%02X "*rr, *b[offset, rr])
496
+ s += " "*((16-r)*3+offset2)+b.inject(""){|a,b| a+(b>64 ? b.chr : '.')}
497
+ end
498
+
499
+ private
500
+ def self._get_defined_type(modules, tstr)
501
+ if RWin::API.const_defined?(tstr)
502
+ RWin::API.const_get(tstr)
503
+ elsif modules
504
+ modules.each{|mod| #; dpp mod, tstr, mod.const_defined?(tstr)
505
+ if mod.const_defined?(tstr) #
506
+ c = mod.module_eval(tstr) #; dpp mod, c, caller[0, 3]
507
+ return c
508
+ end
509
+ }
510
+ nil
511
+ else
512
+ nil
513
+ end
514
+ end
515
+
516
+ protected
517
+ def self.parse_arg(s, mod)
518
+ if s.match(/(\w+)\s*(\*?)\s*(\w*)(?:(\[\d*\]))?/)
519
+ tstr, ptr, name, ar = $1, $2, $3, $4
520
+ if ptr == "*" # member is pointer
521
+ at = TypeAliases[tstr]
522
+ case at
523
+ when 'c'
524
+ b_type = 's'
525
+ when 'C', 'W'
526
+ b_type = 'S'
527
+ when 'L'
528
+ b_type = 'l'
529
+ when 'U'
530
+ b_type = 'u'
531
+ when 'I'
532
+ b_type = 'i'
533
+ when 'Q'
534
+ b_type = 'q'
535
+ else
536
+ if klass = _get_defined_type(mod, tstr)
537
+ unless klass < RWin::API::CStruct
538
+ raise ArgumentError, "#{tstr} is not discendant of RWin::API::CStruct", caller(1)
539
+ end
540
+ else
541
+ raise ArgumentError, "Unknown type '#{tstr}' for CStruct"#, caller(1)
542
+ end
543
+ b_type = 'P'
544
+ end
545
+ len = TypeLength['P']
546
+ elsif b_type = TypeAliases[tstr]
547
+ b_type.upcase! # upcase is for 'c'
548
+ len = TypeLength[b_type]
549
+ elsif (klass=_get_defined_type(mod, tstr)) #; dpp klass #, caller[0]
550
+ unless klass < RWin::API::CStruct
551
+ raise ArgumentError, "#{tstr} is not discendant of RWin::API::CStruct", caller(1)
552
+ end
553
+ # b_type = klass::Template
554
+ b_type = 'K'
555
+ len = klass::Size
556
+ else
557
+ raise ArgumentError, "Unknown type '#{tstr}' for CStruct"#, caller(1)
558
+ end
559
+ else
560
+ raise ArgumentError, "unexpected element #{s}", caller(1)
561
+ end
562
+ if ar
563
+ nth = ar.tr('\[\]', '').to_i
564
+ nth = nth==0 ? 1 : nth
565
+ end
566
+ [klass, b_type, name, len, nth.to_i]
567
+ end
568
+
569
+ def self.adjust_byte_align(offset, b_size) # Faster than bit operation!
570
+ return 0 if b_size != 4 && b_size != 2
571
+ mod = offset % b_size
572
+ mod==0 ? 0 : b_size - mod
573
+ end
574
+ def self.adjust_byte_align(offset, b_size) # dpp offset, b_size!
575
+ return 0 if b_size!=8 && b_size!=4 && b_size!=2
576
+ mod = offset % b_size
577
+ mod==0 ? 0 : b_size - mod
578
+ end
579
+ end # class CStruct
580
+
581
+ ################# CStruct inherited class definition ##################
582
+
583
+ =begin
584
+ ==RWin::API.defstruct([current_module,] definittions...)
585
+ =end
586
+
587
+ @@_klasses_ = []
588
+ def self.defstruct(*args)
589
+ if args[0]==true || args[0]==nil || args[0]==false || args[0]==:pack
590
+ need_pack = args.shift
591
+ need_pack = true if need_pack
592
+ else
593
+ need_pack = nil;
594
+ end
595
+ # dpp need_pack
596
+ if args[0].class == Class || args[0].class == Module || args[0].class == Object
597
+ mname = args.shift.name + '::DUMMY'
598
+ elsif (kls = @@_klasses_.pop) &&
599
+ mname = kls.to_s
600
+ end
601
+ if mname && !mname.empty?
602
+ ar = mname.split('::')
603
+ ar.pop
604
+ modules = ar.inject([]){|ar, s| ar << ar.last.to_s + '::' + s}.map{|i| eval(i)}
605
+ modules.reverse!
606
+ end
607
+ args = args[0].split(/\s*[,;]\s*/) if args.size == 1
608
+
609
+ if args.size == 1 && args[0].match(/^([A-Z]?\w*)\s*\[\s*\]/) # variable length array
610
+ newclass = Class.new(CStruct){
611
+ klass, b_type, name, len, a_size = parse_arg(args[0], modules)
612
+ # self.def_members b_type+'1', nil, klass ? [klass] : nil
613
+ deftemplate(b_type+'1', klass ? [klass] : nil)
614
+ }
615
+ else
616
+ newclass = Class.new(CStruct){
617
+ members = []
618
+ classes = []
619
+ offset = 0
620
+ template = ""
621
+ btypes = ""
622
+ maxbytes = 1
623
+ args.each do |arg|
624
+ klass, b_type, name, len, a_size = parse_arg(arg, modules)
625
+ # dpp klass, b_type, name, len, a_size
626
+ b_size = TypeLength[b_type] #;dpp [maxbytes, b_size]
627
+ maxbytes = b_size if b_size && maxbytes < b_size
628
+ if a_size == 0 # member except array
629
+ btypes = b_type
630
+ offset += len
631
+ elsif a_size >= 1 # Array
632
+ btypes = b_type + a_size.to_s
633
+ offset += len * a_size
634
+ else
635
+ raise ArgumentError, "illegal data size: #{a_size}", caller(1)
636
+ end
637
+ members << name.to_s
638
+ classes << klass
639
+ klass = nil
640
+ template.concat btypes
641
+ end # each
642
+ members = members==[""] ? nil : members
643
+ classes = classes==[nil] ? nil : classes
644
+ # self.def_members(template, members, classes, need_pack)
645
+ deftemplate(template, classes && classes.compact, need_pack)
646
+ defmembers(*members)
647
+ } # Class.new
648
+ end
649
+ @@_klasses_ << newclass
650
+ newclass
651
+ end
652
+
653
+ # set members into pre-defined class
654
+
655
+ class POINT
656
+ defmembers("x", "y")
657
+ end
658
+ class SIZE
659
+ defmembers("cx", "cy")
660
+ end
661
+ class RECT
662
+ defmembers("left", "top", "right", "bottom")
663
+ end
664
+ class LOGBRUSH
665
+ defmembers("lbStyle", "lbColor", "lbHatch")
666
+ end
667
+ class LOGFONT
668
+ defmembers("lfHeight", "lfWidth", "lfEscapement", "lfOrientation", "lfWeight",
669
+ "lfItalic", "lfUnderline", "lfStrikeOut", "lfCharSet", "lfOutPrecision",
670
+ "lfClipPrecision", "lfQuality", "lfPitchAndFamily", "lfFaceName")
671
+ end
672
+ class LOGPEN
673
+ defmembers("lopnStyle", "lopnWidth", "lopnColor")
674
+ end
675
+ class BITMAPINFO
676
+ defmembers("biSize", "biWidth","biHeight", "biPlanes", "biBitCount",
677
+ "biCompression", "biSizeImage", "biXPelsPerMeter", "biYPelsPerMeter",
678
+ "biClrUsed", "biClrImportant", "bmiColors")
679
+ end
680
+ class IMAGEINFO
681
+ defmembers("hbmImage", "hbmMask", "left", "top", "right", "bottom")
682
+ end
683
+
684
+ class MENUITEMINFO
685
+ defmembers("cbSize", "fMask",
686
+ "fType", "fState", "wID", "hSubMenu", "hbmpChecked", "hbmpUnchecked",
687
+ "dwItemData", "dwTypeData", "cch", "hbmpItem")
688
+ end
689
+ class DEVMODE
690
+ defmembers("dmDeviceName", "dmSpecVersion", "dmDriverVersion", "dmSize", "dmDriverExtra",
691
+ "dmFields", "dmOrientation", "dmPaperSize", "dmPaperLength", "dmPaperWidth", "dmScale",
692
+ "dmCopies", "dmDefaultSource", "dmPrintQuality", "dmColor", "dmDuplex", "dmYResolution", "dmTTOption", "dmCollate", "dmFormName", "dmLogPixels", "dmBitsPerPel", "dmPelsWidth",
693
+ "dmPelsHeight", "dmDisplayFlags", "dmDisplayFrequency", "dmICMMethod", "dmICMIntent",
694
+ "dmMediaType", "dmDitherType", "dmReserved1", "dmReserved2", "dmPanningWidth",
695
+ "dmPanningHeight")
696
+ end
697
+ end # RWin::API
698
+
699
+ class Object::String
700
+ # Monkey patch of numeric conversion in an incompatible encoing.
701
+ # This extension must be use the refinements.
702
+ alias :__hex__ :hex
703
+ alias :__to_c__ :to_c
704
+ alias :__to_f__ :to_f
705
+ alias :__to_i__ :to_i
706
+
707
+ def hex()
708
+ encoding.ascii_compatible? ? __hex__ : encode(Encoding::UTF_8).__hex__
709
+ end
710
+ def to_c()
711
+ encoding.ascii_compatible? ? __to_c__ : encode(Encoding::UTF_8).__to_c__
712
+ end
713
+ def to_f()
714
+ encoding.ascii_compatible? ? __to_f__ : encode(Encoding::UTF_8).__to_f__
715
+ end
716
+ def to_i(base = 10)
717
+ encoding.ascii_compatible? ? __to_i__(base) : encode(Encoding::UTF_8).__to_i__(base)
718
+ end
719
+ end
720
+
721
+ if $0 == __FILE__ # Testing
722
+ # p RWin::X64
723
+ #end
724
+ #__END__
725
+
726
+ include RWin
727
+ include API
728
+ API.loadlib nil
729
+
730
+ STDERR.puts "ruby #{RUBY_VERSION} p#{RUBY_PATCHLEVEL} #{RUBY_PLATFORM}"
731
+ struct1 = API::TCHAR[11]
732
+ struct1.value = 'mytest12345'
733
+ if RWin::UNICODE
734
+ p RWin::UNICODE
735
+ p struct1.to_s.force_encoding(Encoding::ASCII_8BIT)
736
+ else
737
+ p RWin::UNICODE
738
+ p struct1.to_s
739
+ end
740
+
741
+ IMAGE_RELOCATION = RWin::API.defstruct "
742
+ DWORD VirtualAddress;
743
+ DWORD SymbolTableIndex;
744
+ WORD Type;"
745
+
746
+ p IMAGE_RELOCATION.new.size
747
+
748
+ POINTARRAY = API.defstruct "POINT pt[2]"; p POINTARRAY::Template, POINTARRAY::Classes
749
+
750
+ pary = POINTARRAY.new
751
+ pary.pt[1].x = 10
752
+ pary.pt[1].y = 20
753
+ p pary.pt[1].to_a
754
+
755
+
756
+ Mytest10 = API.defstruct 'short x[4], int y[2]'
757
+ Mytest14 = API.defstruct 'int a[3], Mytest10 b, POINT* c'
758
+ p Mytest14::Template
759
+ # p Mytest14::Members
760
+ t10 = Mytest10[[5, 6, 7, 8], [9, 10]]
761
+ p t10.to_a
762
+ p Mytest14::Template
763
+ t = Mytest14[[0, 1, 2], t10, POINT[11, 12]]
764
+
765
+ p t.b.x[3]
766
+ p t.to_a
767
+
768
+ puts t.dump
769
+
770
+ API.loadlib 'user32.dll', 'kernel32'
771
+ API.defun 'GetWindowText(hwnd, lpString, nMaxc)'
772
+ API.defun 'EnumWindows(CALLBACK, LPARAM)'
773
+ API.defun 'EnumChildWindows(HWND, CALLBACK, LPARAM)'
774
+ # prc = lambda {|hwnd| puts hwnd; -1}
775
+ #enum_windows_proc_address = API.callbackadress(prc)
776
+ enum_windows_proc_address = API.callbackadress{|hwnd, lparam|
777
+ str = TCHAR[128]
778
+ l = API.GetWindowText(hwnd, str, 128)
779
+ STDERR.printf("%#x, %p\n", hwnd, (str.to_s rescue str[0, 16]))
780
+ # STDERR.printf("%#x, %p, %p\n", hwnd, l, (str.to_s rescue str[0, l*2].pack('C*')))
781
+ -1
782
+ }
783
+ dpp enum_windows_proc_address
784
+ EnumChildWindows(0, enum_windows_proc_address, 0)
785
+ # EnumWindows(enum_windows_proc_address, 0)
786
+ # EnumWindows(prc, 0)
787
+
788
+ # puts RWin::Application.unicode? ? 'UNICODE' : 'not UNICODE'
789
+
790
+ API.defun 'LONG GetCursorPos(POINT)'
791
+ API.defun 'long SetCursorPos(INT, INT)'
792
+ API.defun 'SetLastError(L)'
793
+ API.defun 'GetLastError()'
794
+ API.defun 'DWORD FormatMessage(DWORD, LONG, DWORD, DWORD, LPTSTR, DWORD, void*)'
795
+
796
+ # POINT = API.defstruct 'LONG x', 'LONG y'
797
+ TEST = API.defstruct 'int a[3], POINT b, POINT* c'
798
+ p TEST::Template
799
+ p TEST::Classes
800
+ pt = POINT.new
801
+ pt.x = 5; pt.y = 6
802
+ v = TEST[[0,1,2], POINT[3,4], pt]
803
+ p v.to_s
804
+ # v.a[0] = 1
805
+ # v.a[2] = 4
806
+ # v.b = POINT[5,6]
807
+ # v.b.y = 8
808
+ # p v.b.to_a
809
+ # p v.c
810
+ # p v.to_a
811
+ puts v.dump
812
+
813
+ v = POINT.new
814
+ SetLastError(0)
815
+ getCursorPos(v)
816
+ #p v.to_a
817
+
818
+ SetCursorPos(500, 500)
819
+ puts API.lasterror()
820
+ end