wrb 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README +28 -0
- data/Rakefile +66 -0
- data/bin/wrb +41 -0
- data/bin/wrb.bat +6 -0
- data/ext/rwin/aatree.c +192 -0
- data/ext/rwin/aatree.h +55 -0
- data/ext/rwin/extconf.rb +47 -0
- data/ext/rwin/rw_api.c +2058 -0
- data/ext/rwin/rw_devices.c +215 -0
- data/ext/rwin/rw_gdiplus.h +278 -0
- data/ext/rwin/rw_graphics.c +1583 -0
- data/ext/rwin/rw_resources.c +1988 -0
- data/ext/rwin/rw_ubfuncs.c +281 -0
- data/ext/rwin/rw_windows.c +1936 -0
- data/ext/rwin/rwin.c +451 -0
- data/ext/rwin/rwin.h +442 -0
- data/lib/rwin.rb +820 -0
- data/lib/wrb.rb +20 -0
- data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
- data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
- data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
- data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
- data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
- data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
- data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
- data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
- data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
- data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
- data/lib/wrb/base.rb +1294 -0
- data/lib/wrb/combocommon.rb +77 -0
- data/lib/wrb/commctrlconst.rb +139 -0
- data/lib/wrb/commdlg.rb +77 -0
- data/lib/wrb/components/animate.rb +114 -0
- data/lib/wrb/components/bitmap.rb +116 -0
- data/lib/wrb/components/button.rb +134 -0
- data/lib/wrb/components/canvas.rb +266 -0
- data/lib/wrb/components/checkbox.rb +118 -0
- data/lib/wrb/components/choosecolordlg.rb +87 -0
- data/lib/wrb/components/choosefontdlg.rb +142 -0
- data/lib/wrb/components/clipboard.rb +174 -0
- data/lib/wrb/components/combobox.rb +282 -0
- data/lib/wrb/components/comboboxex.rb +574 -0
- data/lib/wrb/components/cursor.rb +91 -0
- data/lib/wrb/components/datetimepicker.rb +197 -0
- data/lib/wrb/components/ddeclient.rb +180 -0
- data/lib/wrb/components/ddeserver.rb +131 -0
- data/lib/wrb/components/dialog.rb +228 -0
- data/lib/wrb/components/edit.rb +412 -0
- data/lib/wrb/components/font.rb +35 -0
- data/lib/wrb/components/form.rb +65 -0
- data/lib/wrb/components/groupbox.rb +122 -0
- data/lib/wrb/components/header.rb +479 -0
- data/lib/wrb/components/hotkeyctrl.rb +72 -0
- data/lib/wrb/components/icon.rb +109 -0
- data/lib/wrb/components/imagelist.rb +396 -0
- data/lib/wrb/components/inifile.rb +97 -0
- data/lib/wrb/components/listbox.rb +149 -0
- data/lib/wrb/components/listview.rb +1467 -0
- data/lib/wrb/components/menu.rb +592 -0
- data/lib/wrb/components/menubar.rb +84 -0
- data/lib/wrb/components/monthcalender.rb +164 -0
- data/lib/wrb/components/openfilenamedlg.rb +147 -0
- data/lib/wrb/components/pager.rb +199 -0
- data/lib/wrb/components/panel.rb +103 -0
- data/lib/wrb/components/picture.rb +55 -0
- data/lib/wrb/components/printdlg.rb +148 -0
- data/lib/wrb/components/printdlgex.rb +117 -0
- data/lib/wrb/components/printer.rb +97 -0
- data/lib/wrb/components/progressbar.rb +140 -0
- data/lib/wrb/components/radiobutton.rb +49 -0
- data/lib/wrb/components/rebar.rb +830 -0
- data/lib/wrb/components/registry.rb +408 -0
- data/lib/wrb/components/richedit.rb +1181 -0
- data/lib/wrb/components/savefilenamedlg.rb +27 -0
- data/lib/wrb/components/scintilla.rb +1298 -0
- data/lib/wrb/components/scrollbar.rb +239 -0
- data/lib/wrb/components/splitter.rb +494 -0
- data/lib/wrb/components/static.rb +198 -0
- data/lib/wrb/components/statusbar.rb +490 -0
- data/lib/wrb/components/tabctrl.rb +686 -0
- data/lib/wrb/components/timer.rb +117 -0
- data/lib/wrb/components/toolbar.rb +1107 -0
- data/lib/wrb/components/tooltip.rb +651 -0
- data/lib/wrb/components/trackbar.rb +298 -0
- data/lib/wrb/components/treeview.rb +845 -0
- data/lib/wrb/components/updown.rb +198 -0
- data/lib/wrb/ddeml.rb +241 -0
- data/lib/wrb/documents/animate.html +46 -0
- data/lib/wrb/documents/bitmap.html +69 -0
- data/lib/wrb/documents/button.html +78 -0
- data/lib/wrb/documents/canvas.html +137 -0
- data/lib/wrb/documents/checkbox.html +77 -0
- data/lib/wrb/documents/choosecolordlg.html +29 -0
- data/lib/wrb/documents/choosefontdlg.html +31 -0
- data/lib/wrb/documents/clipboard.html +31 -0
- data/lib/wrb/documents/combobox.html +117 -0
- data/lib/wrb/documents/comboboxex.html +139 -0
- data/lib/wrb/documents/control.html +53 -0
- data/lib/wrb/documents/cursor.html +45 -0
- data/lib/wrb/documents/datetimepicker.html +70 -0
- data/lib/wrb/documents/ddeclient.html +33 -0
- data/lib/wrb/documents/ddeserver.html +26 -0
- data/lib/wrb/documents/dialog.html +78 -0
- data/lib/wrb/documents/edit.html +169 -0
- data/lib/wrb/documents/empty.html +11 -0
- data/lib/wrb/documents/favicon.png +0 -0
- data/lib/wrb/documents/font.html +38 -0
- data/lib/wrb/documents/form.html +63 -0
- data/lib/wrb/documents/groupbox.html +57 -0
- data/lib/wrb/documents/header.html +85 -0
- data/lib/wrb/documents/hotkeyctrl.html +42 -0
- data/lib/wrb/documents/icon.html +45 -0
- data/lib/wrb/documents/imagelist.html +101 -0
- data/lib/wrb/documents/images/button.png +0 -0
- data/lib/wrb/documents/images/checkbox.png +0 -0
- data/lib/wrb/documents/images/combobox.png +0 -0
- data/lib/wrb/documents/images/comboboxex.png +0 -0
- data/lib/wrb/documents/images/datetimepicker.png +0 -0
- data/lib/wrb/documents/images/edit.png +0 -0
- data/lib/wrb/documents/images/groupbox.png +0 -0
- data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
- data/lib/wrb/documents/images/listbox.png +0 -0
- data/lib/wrb/documents/images/listview.png +0 -0
- data/lib/wrb/documents/images/menu.png +0 -0
- data/lib/wrb/documents/images/menubar.png +0 -0
- data/lib/wrb/documents/images/monthcalender.png +0 -0
- data/lib/wrb/documents/images/progressbar.png +0 -0
- data/lib/wrb/documents/images/radiobutton.png +0 -0
- data/lib/wrb/documents/images/rebar.png +0 -0
- data/lib/wrb/documents/images/richedit.png +0 -0
- data/lib/wrb/documents/images/splitter.png +0 -0
- data/lib/wrb/documents/images/static.png +0 -0
- data/lib/wrb/documents/images/statusbar.png +0 -0
- data/lib/wrb/documents/images/tabctrl.png +0 -0
- data/lib/wrb/documents/images/toolbar.png +0 -0
- data/lib/wrb/documents/images/tooltip.png +0 -0
- data/lib/wrb/documents/images/trackbar.png +0 -0
- data/lib/wrb/documents/images/treeview.png +0 -0
- data/lib/wrb/documents/images/updown.png +0 -0
- data/lib/wrb/documents/index.html +155 -0
- data/lib/wrb/documents/inifile.html +36 -0
- data/lib/wrb/documents/license.txt +22 -0
- data/lib/wrb/documents/listbox.html +96 -0
- data/lib/wrb/documents/listview.html +277 -0
- data/lib/wrb/documents/make_doc.rb +596 -0
- data/lib/wrb/documents/menu.html +144 -0
- data/lib/wrb/documents/menubar.html +54 -0
- data/lib/wrb/documents/monthcalender.html +48 -0
- data/lib/wrb/documents/openfilenamedlg.html +36 -0
- data/lib/wrb/documents/pager.html +63 -0
- data/lib/wrb/documents/panel.html +32 -0
- data/lib/wrb/documents/picture.html +48 -0
- data/lib/wrb/documents/printdlg.html +35 -0
- data/lib/wrb/documents/printdlgex.html +35 -0
- data/lib/wrb/documents/printer.html +40 -0
- data/lib/wrb/documents/progressbar.html +69 -0
- data/lib/wrb/documents/radiobutton.html +51 -0
- data/lib/wrb/documents/rebar.html +143 -0
- data/lib/wrb/documents/registry.html +36 -0
- data/lib/wrb/documents/richedit.html +232 -0
- data/lib/wrb/documents/samples/editimg.bmp +0 -0
- data/lib/wrb/documents/samples/editimg.iml +0 -0
- data/lib/wrb/documents/samples/fileimg.bmp +0 -0
- data/lib/wrb/documents/samples/fileimg.iml +0 -0
- data/lib/wrb/documents/samples/sample_button.rb +21 -0
- data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
- data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
- data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
- data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
- data/lib/wrb/documents/samples/sample_edit.rb +25 -0
- data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
- data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
- data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
- data/lib/wrb/documents/samples/sample_listview.rb +32 -0
- data/lib/wrb/documents/samples/sample_menu.rb +21 -0
- data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
- data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
- data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
- data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
- data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
- data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
- data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
- data/lib/wrb/documents/samples/sample_static.rb +15 -0
- data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
- data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
- data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
- data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
- data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
- data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
- data/lib/wrb/documents/samples/sample_updown.rb +18 -0
- data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
- data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
- data/lib/wrb/documents/samples/samplemg16.png +0 -0
- data/lib/wrb/documents/samples/samplemg32.png +0 -0
- data/lib/wrb/documents/samples/wrb.ico +0 -0
- data/lib/wrb/documents/savefilenamedlg.html +19 -0
- data/lib/wrb/documents/scrollbar.html +60 -0
- data/lib/wrb/documents/splitter.html +96 -0
- data/lib/wrb/documents/static.html +84 -0
- data/lib/wrb/documents/statusbar.html +110 -0
- data/lib/wrb/documents/tabctrl.html +151 -0
- data/lib/wrb/documents/timer.html +43 -0
- data/lib/wrb/documents/toolbar.html +181 -0
- data/lib/wrb/documents/tooltip.html +131 -0
- data/lib/wrb/documents/trackbar.html +107 -0
- data/lib/wrb/documents/treeview.html +210 -0
- data/lib/wrb/documents/updown.html +85 -0
- data/lib/wrb/documents/wincontrol.html +258 -0
- data/lib/wrb/documents/window.html +499 -0
- data/lib/wrb/documents/wrb.css +228 -0
- data/lib/wrb/gmem.rb +26 -0
- data/lib/wrb/imecommon.rb +59 -0
- data/lib/wrb/listcommon.rb +185 -0
- data/lib/wrb/lzss.rb +126 -0
- data/lib/wrb/scrollinfo.rb +142 -0
- data/lib/wrb/toplevelcommon.rb +634 -0
- metadata +315 -0
@@ -0,0 +1,131 @@
|
|
1
|
+
#ddemlserver
|
2
|
+
require 'wrb/ddeml'
|
3
|
+
|
4
|
+
module WR
|
5
|
+
|
6
|
+
# Provides Dynamic Data Exchange server.
|
7
|
+
class DdeServer < DDEML
|
8
|
+
def self.[](*args) self.new(*args); end
|
9
|
+
|
10
|
+
def initialize(*args)
|
11
|
+
@_owner = args.shift if args[0].is_a?(Window)
|
12
|
+
appname, topic, codepage, timeout = args
|
13
|
+
@_appname = appname || raise(ArgumentError, "appname needed")
|
14
|
+
@_topic = topic || raise(ArgumentError, "topic needed")
|
15
|
+
@_codepage = codepage || CP_WINUNICODE
|
16
|
+
@__adv_value__ = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def name
|
20
|
+
@_appname
|
21
|
+
end
|
22
|
+
|
23
|
+
def parent()
|
24
|
+
@_owner
|
25
|
+
end
|
26
|
+
def parent=(win)
|
27
|
+
@_owner = win
|
28
|
+
create if @_owner.alive?
|
29
|
+
end
|
30
|
+
|
31
|
+
def create() # will be called from owner window.
|
32
|
+
@sescallback = lambda{|uType, uFmt, hconv, htopic, hservice, hdata, dwData1, dwData2|
|
33
|
+
dispatchXTYP(uType, uFmt, hconv, htopic, hservice, hdata, dwData1, dwData2)
|
34
|
+
}
|
35
|
+
idinst = IDINST.new
|
36
|
+
API.DdeInitialize(idinst, @sescallback, APPCLASS_STANDARD | CBF_SKIP_ALLNOTIFICATIONS, 0)
|
37
|
+
@_idinst = idinst.value
|
38
|
+
@_hservice = str2h(@_appname.to_s)
|
39
|
+
@_htopic = str2h(@_topic)
|
40
|
+
API.DdeNameService(@_idinst, @_hservice, 0, DNS_REGISTER)
|
41
|
+
ObjectSpace.define_finalizer(self,
|
42
|
+
self.class.callback_finalizer(@_idinst, @_hservice, @_htopic))
|
43
|
+
end
|
44
|
+
|
45
|
+
def post_advise(topic, item)
|
46
|
+
API.DdePostAdvise(@_idinst, str2h(topic), str2h(item));
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def dispatchXTYP(uType, uFmt, hconv, htopic, hitem, hdata, dwData1, dwData2)
|
51
|
+
case uType
|
52
|
+
when XTYP_CONNECT
|
53
|
+
return hitem==@_hservice && htopic==@_htopic ? 1 : 0
|
54
|
+
when XTYP_REQUEST
|
55
|
+
if @_owner.respond_to?("#{@_appname}_request")
|
56
|
+
s = @_owner.__send__("#{@_appname}_request", h2str(htopic), h2str(hitem))
|
57
|
+
return data2h(hitem, s)
|
58
|
+
end
|
59
|
+
when XTYP_POKE
|
60
|
+
if @_owner.respond_to?("#{@_appname}_poke")
|
61
|
+
@_owner.__send__("#{@_appname}_poke", h2str(htopic), h2str(hitem), h2data(hdata))
|
62
|
+
return DDE_FACK
|
63
|
+
end
|
64
|
+
when XTYP_EXECUTE
|
65
|
+
if @_owner.respond_to?("#{@_appname}_execute")
|
66
|
+
@_owner.__send__("#{@_appname}_execute", h2str(htopic), h2str(hitem), h2data(hdata))
|
67
|
+
return DDE_FACK
|
68
|
+
end
|
69
|
+
when XTYP_ADVSTART
|
70
|
+
if @_owner.respond_to?("#{@_appname}_advstart")
|
71
|
+
@_owner.__send__("#{@_appname}_advstart", h2str(htopic), h2str(hitem))
|
72
|
+
return DDE_FACK
|
73
|
+
end
|
74
|
+
when XTYP_ADVREQ
|
75
|
+
if @_owner.respond_to?("#{@_appname}_advreq")
|
76
|
+
data = @_owner.__send__("#{@_appname}_advreq", h2str(htopic), h2str(hitem))
|
77
|
+
return data2h(hitem, data) # Data will be automatically free when returned.
|
78
|
+
end
|
79
|
+
when XTYP_ADVSTOP
|
80
|
+
if @_owner.respond_to?("#{@_appname}_advstop")
|
81
|
+
@_owner.__send__("#{@_appname}_advstop", h2str(htopic), h2str(hitem))
|
82
|
+
return DDE_FACK
|
83
|
+
end
|
84
|
+
else
|
85
|
+
# dp "@%#x", uType
|
86
|
+
end
|
87
|
+
return 0
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
module WR
|
94
|
+
class MyForm < Form
|
95
|
+
def initialize()
|
96
|
+
resize 280, 210
|
97
|
+
self.caption = "DDEServer"
|
98
|
+
_<< Button[:bt1, "Advise", 0, 0, 100, 24]
|
99
|
+
_<< DdeServer[:mytest, "Mytopic"]
|
100
|
+
_<< DdeServer[:mytest, "Mytopic1"]
|
101
|
+
end
|
102
|
+
|
103
|
+
def mytest_advstart(topic, item)
|
104
|
+
_.bt1.caption = "Advise start"
|
105
|
+
end
|
106
|
+
|
107
|
+
def mytest_advstop(topic, item)
|
108
|
+
_.bt1.caption = "Advise stop"
|
109
|
+
end
|
110
|
+
|
111
|
+
def bt1_clicked(*)
|
112
|
+
_.mytest[1].post_advise('Mytopic1', 'R1C1')
|
113
|
+
end
|
114
|
+
|
115
|
+
def mytest_advreq(topic, item)#; dpp topic, item
|
116
|
+
'ABC123'
|
117
|
+
end
|
118
|
+
|
119
|
+
def mytest_request(topic, item) #; dpp topic, item
|
120
|
+
"request: #{topic}, #{item}"
|
121
|
+
end
|
122
|
+
|
123
|
+
def mytest_poke(topic, item, data)
|
124
|
+
dpp topic, item, data
|
125
|
+
end
|
126
|
+
|
127
|
+
self.start
|
128
|
+
end
|
129
|
+
|
130
|
+
end if $0 == __FILE__
|
131
|
+
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require 'wrb/toplevelcommon'
|
2
|
+
|
3
|
+
module WR
|
4
|
+
module RC
|
5
|
+
# DS_ABSALIGN = 0x01
|
6
|
+
DS_SYSMODAL = 0x02
|
7
|
+
# DS_LOCALEDIT = 0x20
|
8
|
+
# DS_SETFONT = 0x40
|
9
|
+
# DS_MODALFRAME = 0x80
|
10
|
+
DS_NOIDLEMSG = 0x100
|
11
|
+
DS_SETFOREGROUND = 0x200
|
12
|
+
|
13
|
+
# DS_3DLOOK = 0x0004
|
14
|
+
# DS_FIXEDSYS = 0x0008
|
15
|
+
# DS_NOFAILCREATE = 0x0010
|
16
|
+
DS_CONTROL = 0x0400
|
17
|
+
DS_CENTER = 0x0800
|
18
|
+
DS_CENTERMOUSE = 0x1000
|
19
|
+
DS_CONTEXTHELP = 0x2000
|
20
|
+
# DS_SHELLFONT = (DS_SETFONT | DS_FIXEDSYS)
|
21
|
+
DS_USEPIXELS = 0x8000
|
22
|
+
|
23
|
+
WM_INITDIALOG = 0x0110 unless defined? WM_INITDIALOG
|
24
|
+
|
25
|
+
IDOK = 1
|
26
|
+
IDCANCEL = 2
|
27
|
+
IDABORT = 3
|
28
|
+
IDRETRY = 4
|
29
|
+
IDIGNORE = 5
|
30
|
+
IDYES = 6
|
31
|
+
IDNO = 7
|
32
|
+
IDCLOSE = 8
|
33
|
+
IDHELP = DLGMAX_ID = 9
|
34
|
+
end
|
35
|
+
|
36
|
+
# The dialog box that is also a container of controls.
|
37
|
+
# <br>See also <a href="https://docs.microsoft.com/en-us/windows/desktop/api/
|
38
|
+
# _dlgbox/index"> Dialog Boxes section of Microsoft Docs.</a>
|
39
|
+
class Dialog < RWin::Dialog
|
40
|
+
include RC
|
41
|
+
|
42
|
+
WinStyles = {
|
43
|
+
:sysmodal => DS_SYSMODAL,
|
44
|
+
:contexthelp => DS_CONTEXTHELP
|
45
|
+
}.update ModToplevelWin::WinStyles
|
46
|
+
|
47
|
+
module ModDlgButton
|
48
|
+
include RC
|
49
|
+
def self.extended(obj)
|
50
|
+
obj.set_as_button
|
51
|
+
end
|
52
|
+
|
53
|
+
def set_as_button()
|
54
|
+
@__unplocessed.each{|i|
|
55
|
+
id = nil
|
56
|
+
case i
|
57
|
+
when :idok
|
58
|
+
id = IDOK
|
59
|
+
when :idcancel
|
60
|
+
id = IDCANCEL
|
61
|
+
end
|
62
|
+
if id
|
63
|
+
parent.unregister_event(id, WM_COMMAND, BN_CLICKED)
|
64
|
+
self.idcmd = id
|
65
|
+
parent.register_event(id, WM_COMMAND, BN_CLICKED, "#{name}_clicked")
|
66
|
+
end
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
alias __create__ create
|
72
|
+
|
73
|
+
include ModToplevelWin, ModBaseWin, ModAutoloading
|
74
|
+
|
75
|
+
DefaultDlgSize = [400, 300]
|
76
|
+
DefaultWindowStyle = WS_POPUP | WS_BORDER | WS_SYSMENU | WS_CAPTION
|
77
|
+
|
78
|
+
API.defun "GetWindowRect(hWnd, pRect)"
|
79
|
+
API.defun "GetDesktopWindow()"
|
80
|
+
|
81
|
+
# Creates and show as modal dialog box.<br>
|
82
|
+
# If given nil as <i>parent</i>, creates as top level dialog box.
|
83
|
+
def self.open_modal(parent, arg=nil)
|
84
|
+
self.new.create(parent, true, arg)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Creates and show as modeless dialog box.<br>
|
88
|
+
# If given nil as <i>parent</i>, creates as top level dialog box.
|
89
|
+
def self.open_modeless(parent, arg=nil)
|
90
|
+
self.new.create(parent, false, arg)
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
def create(owner=nil, modal=nil, arg=nil)
|
95
|
+
register_event(WM_INITDIALOG, "__initdialog__")
|
96
|
+
register_event(WM_GETFONT, "__getfont__")
|
97
|
+
register_event(WM_SIZE, "__resize__", "xh")
|
98
|
+
class << self.controls
|
99
|
+
def <<(args)
|
100
|
+
obj = super
|
101
|
+
obj.extend ModDlgButton if obj.is_a? Button
|
102
|
+
obj
|
103
|
+
end
|
104
|
+
end
|
105
|
+
self.controls.each{|i|
|
106
|
+
i.extend ModDlgButton if i.is_a? Button
|
107
|
+
}
|
108
|
+
@owner = owner
|
109
|
+
__create__(owner, modal, @_style, @_exstyle, arg)
|
110
|
+
end
|
111
|
+
|
112
|
+
# move_center([target=nil[, x, y])
|
113
|
+
# Moves this dialog to center of specified arguments.
|
114
|
+
def move_center(*args)
|
115
|
+
case args.size
|
116
|
+
when 0
|
117
|
+
target = @owner
|
118
|
+
w0, h0 = self.windowsize
|
119
|
+
when 1
|
120
|
+
target = args[0]
|
121
|
+
w0, h0 = self.windowsize
|
122
|
+
when 2
|
123
|
+
target = @owner
|
124
|
+
w0, h0 = args
|
125
|
+
when 3
|
126
|
+
target, w0, h0 = args
|
127
|
+
else
|
128
|
+
raise ArgumentError, "num of arguments must be 0..3", caller(1)
|
129
|
+
end
|
130
|
+
target = RWin::Application.getDesktop unless target
|
131
|
+
x1, y1, w1, h1 = target.windowrect
|
132
|
+
x = x1 + w1 / 2 - w0 / 2
|
133
|
+
y = y1 + h1 / 2 - h0 / 2
|
134
|
+
self.move(x, y, w0, h0)
|
135
|
+
end
|
136
|
+
|
137
|
+
#
|
138
|
+
def inspect()
|
139
|
+
"#<#{self.class}:#{self.__id__}>"
|
140
|
+
end
|
141
|
+
|
142
|
+
#
|
143
|
+
def style=(st)
|
144
|
+
st&DS_CONTEXTHELP > 0 ? self.exstyle|=WS_EX_CONTEXTHELP : self.exstyle&=~WS_EX_CONTEXTHELP
|
145
|
+
super
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
def __initdialog__()
|
150
|
+
self.icon = @_icon if @_icon
|
151
|
+
self.transparency = @_transparency if @_transparency
|
152
|
+
self.transparentcolor = @_transparentcolor if @_transparentcolor
|
153
|
+
self.caption = @_caption.to_s
|
154
|
+
w, h = @_w && @_h ? [@_w, @_h] : DefaultDlgSize
|
155
|
+
if @_x && @_y
|
156
|
+
x, y = @_x, @_y
|
157
|
+
elsif @owner
|
158
|
+
ox, oy = @owner.screenpos
|
159
|
+
ow, oh = @owner.windowsize
|
160
|
+
x, y = ox + (ow - w)/2, oy + (oh - h)/2
|
161
|
+
else
|
162
|
+
rc = RECT.new
|
163
|
+
API.GetWindowRect(API.GetDesktopWindow(), rc)
|
164
|
+
x1, y1, w1, h1 = rc.to_a
|
165
|
+
x = x1 + w1 / 2 - w / 2
|
166
|
+
y = y1 + h1 / 2 - h / 2
|
167
|
+
end
|
168
|
+
self.move(x, y, w, h)
|
169
|
+
controls._create
|
170
|
+
self.inheritfont = @_inheritfont if @_inheritfont
|
171
|
+
__send__(:opened, self.param) if respond_to?(:opened)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
module WR
|
177
|
+
class MyDialog < Dialog
|
178
|
+
def initialize()
|
179
|
+
self.style |= WS_THICKFRAME | DS_SYSMODAL
|
180
|
+
self.inheritfont = 'Meiryo', -12, 'i'
|
181
|
+
resize 240, 180
|
182
|
+
controls << Button[:dlgbtn1, "OK", 10,0,100,24, :tabstop, :idcmd=>IDOK, :margin=>[nil,nil,0,10]]
|
183
|
+
controls << Button[:dlgbtn2, "Cancel", 110,0,100, 24, :tabstop, :idcancel]
|
184
|
+
end
|
185
|
+
|
186
|
+
def opened(arg)
|
187
|
+
self.style |= DS_CONTEXTHELP
|
188
|
+
self.caption = arg
|
189
|
+
end
|
190
|
+
|
191
|
+
def dlgbtn1_clicked(*)
|
192
|
+
close 100
|
193
|
+
end
|
194
|
+
def dlgbtn2_clicked(*)
|
195
|
+
close nil
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
class MyForm < Dialog
|
200
|
+
# class MyForm < Form
|
201
|
+
def initialize()
|
202
|
+
self.inheritfont = 'Meiryo', -12, 'b', :force
|
203
|
+
self.style |= WS_THICKFRAME
|
204
|
+
_<< Button[:bt1, "Modal", 0, 0, 100, 30, :idok]
|
205
|
+
_<< Button[:bt2, "Modeless", 100, 0, 100, 30, :idcmd=>IDCANCEL]
|
206
|
+
#_<< Button[:bt3, "Exit", 0, 50, 100, 30]
|
207
|
+
end
|
208
|
+
|
209
|
+
def opened(arg) # for dialog
|
210
|
+
_<< Button[:bt3, "Exit", 0, 50, 100, 30]
|
211
|
+
end
|
212
|
+
def created() # for form
|
213
|
+
_<< Button[:bt3, "Exit", 0, 50, 100, 30]
|
214
|
+
end
|
215
|
+
|
216
|
+
def bt1_clicked(*)
|
217
|
+
dpp MyDialog.open_modal(self, 'Modal dialog')
|
218
|
+
end
|
219
|
+
def bt2_clicked(*)
|
220
|
+
MyDialog.open_modeless(self, 'Modeless dialog')
|
221
|
+
end
|
222
|
+
def bt3_clicked(*)
|
223
|
+
APP.quit!
|
224
|
+
end
|
225
|
+
|
226
|
+
self.start # Wrapper of RW::Windows.automsgloop
|
227
|
+
end
|
228
|
+
end if __FILE__ == $0
|
@@ -0,0 +1,412 @@
|
|
1
|
+
require 'wrb'
|
2
|
+
require 'wrb/imecommon'
|
3
|
+
|
4
|
+
module WR
|
5
|
+
module RC
|
6
|
+
ES_LEFT = 0x0000
|
7
|
+
ES_CENTER = 0x0001
|
8
|
+
ES_RIGHT = 0x0002
|
9
|
+
ES_MULTILINE = 0x0004
|
10
|
+
ES_UPPERCASE = 0x0008
|
11
|
+
ES_LOWERCASE = 0x0010
|
12
|
+
ES_PASSWORD = 0x0020
|
13
|
+
ES_AUTOVSCROLL = 0x0040
|
14
|
+
ES_AUTOHSCROLL = 0x0080
|
15
|
+
ES_NOHIDESEL = 0x0100
|
16
|
+
ES_OEMCONVERT = 0x0400
|
17
|
+
ES_READONLY = 0x0800
|
18
|
+
ES_WANTRETURN = 0x1000
|
19
|
+
ES_NUMBER = 0x2000
|
20
|
+
|
21
|
+
EM_GETSEL = 0x00B0
|
22
|
+
EM_SETSEL = 0x00B1
|
23
|
+
EM_GETRECT = 0x00B2
|
24
|
+
EM_SETRECT = 0x00B3
|
25
|
+
EM_SETRECTNP = 0x00B4
|
26
|
+
EM_SCROLL = 0x00B5
|
27
|
+
EM_LINESCROLL = 0x00B6
|
28
|
+
EM_SCROLLCARET = 0x00B7
|
29
|
+
EM_GETMODIFY = 0x00B8
|
30
|
+
EM_SETMODIFY = 0x00B9
|
31
|
+
EM_GETLINECOUNT = 0x00BA
|
32
|
+
EM_LINEINDEX = 0x00BB
|
33
|
+
EM_SETHANDLE = 0x00BC
|
34
|
+
EM_GETHANDLE = 0x00BD
|
35
|
+
EM_GETTHUMB = 0x00BE
|
36
|
+
EM_LINELENGTH = 0x00C1
|
37
|
+
EM_REPLACESEL = 0x00C2
|
38
|
+
EM_GETLINE = 0x00C4
|
39
|
+
EM_LIMITTEXT = 0x00C5
|
40
|
+
EM_CANUNDO = 0x00C6
|
41
|
+
EM_UNDO = 0x00C7
|
42
|
+
EM_FMTLINES = 0x00C8
|
43
|
+
EM_LINEFROMCHAR = 0x00C9
|
44
|
+
EM_SETTABSTOPS = 0x00CB
|
45
|
+
EM_SETPASSWORDCHAR = 0x00CC
|
46
|
+
EM_EMPTYUNDOBUFFER = 0x00CD
|
47
|
+
EM_GETFIRSTVISIBLELINE = 0x00CE
|
48
|
+
EM_SETREADONLY = 0x00CF
|
49
|
+
EM_SETWORDBREAKPROC = 0x00D0
|
50
|
+
EM_GETWORDBREAKPROC = 0x00D1
|
51
|
+
EM_GETPASSWORDCHAR = 0x00D2
|
52
|
+
EM_SETMARGINS = 0x00D3
|
53
|
+
EM_GETMARGINS = 0x00D4
|
54
|
+
EM_SETLIMITTEXT = EM_LIMITTEXT
|
55
|
+
EM_GETLIMITTEXT = 0x00D5
|
56
|
+
EM_POSFROMCHAR = 0x00D6
|
57
|
+
EM_CHARFROMPOS = 0x00D7
|
58
|
+
EM_SETIMESTATUS = 0x00D8
|
59
|
+
EM_GETIMESTATUS = 0x00D9
|
60
|
+
|
61
|
+
EN_SETFOCUS = 0x0100
|
62
|
+
EN_KILLFOCUS = 0x0200
|
63
|
+
EN_CHANGE = 0x0300
|
64
|
+
EN_UPDATE = 0x0400
|
65
|
+
EN_ERRSPACE = 0x0500
|
66
|
+
EN_MAXTEXT = 0x0501
|
67
|
+
EN_HSCROLL = 0x0601
|
68
|
+
EN_VSCROLL = 0x0602
|
69
|
+
EN_ALIGN_LTR_EC = 0x0700
|
70
|
+
EN_ALIGN_RTL_EC = 0x0701
|
71
|
+
|
72
|
+
WM_CTLCOLOREDIT = 0x0133
|
73
|
+
end
|
74
|
+
# A rectangular control which enable the user to enter and edit text.
|
75
|
+
# <br>See also <a href="https://docs.microsoft.com/en-us/windows/desktop/Controls/
|
76
|
+
#window-controls"> Windows Control section of Microsoft Docs.</a>
|
77
|
+
class Edit < WinControl #< StandardControl
|
78
|
+
include ModStdCtrl
|
79
|
+
|
80
|
+
class Selection
|
81
|
+
include RC
|
82
|
+
def initialize(owner, selstart, selend)
|
83
|
+
@owner = owner
|
84
|
+
@selstart = selstart
|
85
|
+
@selend = selend
|
86
|
+
end
|
87
|
+
|
88
|
+
def text()
|
89
|
+
@owner.text[@selstart, @selend-@selstart]
|
90
|
+
end
|
91
|
+
def text=(txt)
|
92
|
+
@owner.SendMessage(EM_SETSEL, @selstart, @selend)
|
93
|
+
@owner.SendMessage(EM_REPLACESEL, 1, API.adjust_internal_lf_code(txt))
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
include ModIME
|
98
|
+
|
99
|
+
PreDefinedEvents = {
|
100
|
+
:setfocus => [WM_COMMAND, EN_SETFOCUS, 'hi'], # ???_setfocus(idcmd, code, hwnd)
|
101
|
+
:killfocus => [WM_COMMAND, EN_KILLFOCUS, 'hi'], # ???_killfocus(idcmd, code, hwnd)
|
102
|
+
:change => [WM_COMMAND, EN_CHANGE, 'hi'], # ???_change(idcmd, code, hwnd)
|
103
|
+
:update => [WM_COMMAND, EN_UPDATE, 'hi'], # ???_update(idcmd, code, hwnd)
|
104
|
+
:errspace => [WM_COMMAND, EN_ERRSPACE, 'hi'], # ???_errspace(idcmd, code, hwnd)
|
105
|
+
:maxtext => [WM_COMMAND, EN_MAXTEXT, 'hi'], # ???_maxtext(idcmd, code, hwnd)
|
106
|
+
:hscroll => [WM_COMMAND, EN_HSCROLL, 'hi'], # ???_hscroll(idcmd, code, hwnd)
|
107
|
+
:vscroll => [WM_COMMAND, EN_VSCROLL, 'hi'], # ???_vscroll(idcmd, code, hwnd)
|
108
|
+
:align_ltr_ec => [WM_COMMAND, EN_ALIGN_LTR_EC, 'hi'], # ???_align_ltr_ec(idcmd, code, hwnd)
|
109
|
+
:align_rtl_ec => [WM_COMMAND, EN_ALIGN_RTL_EC, 'hi'], # ???_align_rtl_ec(idcmd, code, hwnd)
|
110
|
+
}
|
111
|
+
|
112
|
+
DefaultEvents = [
|
113
|
+
:change, # ???_change(idcmd, code, hwnd)
|
114
|
+
:update # ???_update(idcmd, code, hwnd)
|
115
|
+
]
|
116
|
+
|
117
|
+
def initialize(*args)
|
118
|
+
super
|
119
|
+
@_classname = "EDIT"
|
120
|
+
# self.style |= WS_BORDER
|
121
|
+
@_exstyle = WS_EX_CLIENTEDGE
|
122
|
+
@_acceptable_events = PreDefinedEvents.dup
|
123
|
+
end
|
124
|
+
|
125
|
+
#
|
126
|
+
def idcmd=(id) # for IME
|
127
|
+
parent.set_msgtranslator(WM_COMMAND) unless parent.get_msgtranslator(WM_COMMAND)
|
128
|
+
parent.register_event(id, WM_COMMAND, EN_SETFOCUS, "__gotfocus", 'hi', self)
|
129
|
+
parent.register_event(id, WM_COMMAND, EN_KILLFOCUS, "__lostfocus", 'hi', self)
|
130
|
+
super
|
131
|
+
end
|
132
|
+
|
133
|
+
#
|
134
|
+
def create()
|
135
|
+
super
|
136
|
+
self.limittext = @_limittext if @_limittext
|
137
|
+
self.passwordchar = @_passwordchar if @_passwordchar
|
138
|
+
end
|
139
|
+
|
140
|
+
#### write only attributes ####
|
141
|
+
|
142
|
+
# Sets edit style of this to ES_AUTOVSCROLL or not.
|
143
|
+
def autovscroll=(state)
|
144
|
+
set_style(state ? ES_AUTOVSCROLL : ~ES_AUTOVSCROLL)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Sets edit style of this to ES_AUTOHSCROLL or not.
|
148
|
+
def autohscroll=(state)
|
149
|
+
set_style(state ? ES_AUTOHSCROLL : ~ES_AUTOHSCROLL)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Sets edit style of this to ES_MULTILINE or not.
|
153
|
+
def muitiline=(state)
|
154
|
+
set_style(state ? ES_MULTILINE : ~ES_MULTILINE)
|
155
|
+
end
|
156
|
+
|
157
|
+
# Sets edit style of this to ES_PASSWORD or not.
|
158
|
+
def password=(state)
|
159
|
+
set_style(state ? ES_PASSWORD : ~ES_PASSWORD)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Sets edit style of this to EM_SETREADONLY or not.
|
163
|
+
def readonly=(state)
|
164
|
+
if state != true && state !=false && state != nil
|
165
|
+
raise ArgumentError, "argument must be ture, false or nil", caller(2)
|
166
|
+
end
|
167
|
+
SendMessage(EM_SETREADONLY, state ? 1 : 0, 0)
|
168
|
+
end
|
169
|
+
|
170
|
+
# Sets edit style of this to ES_WANTRETRURN or not.
|
171
|
+
def wantreturn=(state)
|
172
|
+
set_style(sate ? ES_WANTRETRURN : ~ES_WANTRETRURN, true)
|
173
|
+
end
|
174
|
+
|
175
|
+
# Sets th back ground color of this. Give a RGB integer as <i>clr</i>.
|
176
|
+
def bkcolor=(clr)
|
177
|
+
parent.register_event WM_CTLCOLOREDIT, "__ctlcoloredit__", 'ii', self
|
178
|
+
@_bkcolor = clr
|
179
|
+
end
|
180
|
+
|
181
|
+
#### read-write attributes ####
|
182
|
+
|
183
|
+
# Gets the current text limit for this edit control.
|
184
|
+
def limittext()
|
185
|
+
alive? ? SendMessage(EM_GETLIMITTEXT, 0, 0) : @_limittext
|
186
|
+
end
|
187
|
+
# Sets the text limit of this edit control.
|
188
|
+
def limittext=(lim)
|
189
|
+
alive? ? SendMessage(EM_LIMITTEXT, lim.to_i, 0) : @_limittext = lim
|
190
|
+
end
|
191
|
+
|
192
|
+
# Gets the password character that this edit control displays when the user enters text.<br>
|
193
|
+
# Returns a single charactor of String or nil. If nil was given, this edit control is used system default password charactor.
|
194
|
+
def passwordchar()
|
195
|
+
alive? ? SendMessage(EM_GETPASSWORDCHAR , 0, 0).chr : @_passwordchar
|
196
|
+
end
|
197
|
+
# Sets or removes the password character for this edit control. <br>
|
198
|
+
# Give a single charactor of String, or nil.
|
199
|
+
def passwordchar=(ch)
|
200
|
+
alive? ? SendMessage(EM_SETPASSWORDCHAR , ch.ord, 0) : @_passwordchar = ch
|
201
|
+
end
|
202
|
+
|
203
|
+
#### only for after created ####
|
204
|
+
|
205
|
+
# Retreives wheter this edit control was modified.
|
206
|
+
def modified()
|
207
|
+
SendMessage(EM_GETMODIFY, 0, 0) == 0 ? false : true
|
208
|
+
end
|
209
|
+
# Sets modified flag to true or false.
|
210
|
+
def modified=(f)
|
211
|
+
SendMessage(EM_SETMODIFY, f ? 1 : 0, 0)
|
212
|
+
end
|
213
|
+
|
214
|
+
# Gets the starting and ending character positions of the current selection.
|
215
|
+
def selection() # returns [start_pos, end_pos]
|
216
|
+
Selection.new(self, *SPLITPARAM(SendMessage(EM_GETSEL, 0, 0)))
|
217
|
+
end
|
218
|
+
|
219
|
+
# selection=(starting[, ending])
|
220
|
+
# Selects a range of characters in an edit control.
|
221
|
+
def selection=(arg)
|
222
|
+
if arg.is_a?(Integer) || arg.is_a?(Array)
|
223
|
+
start_pos, end_pos = arg
|
224
|
+
end_pos ||= start_pos
|
225
|
+
else
|
226
|
+
raise ArgumentError, "#{arg.class} is not allowed", caller(1)
|
227
|
+
end
|
228
|
+
SendMessage(EM_SETSEL, start_pos.to_i, end_pos.to_i)
|
229
|
+
end
|
230
|
+
|
231
|
+
# Sets a text into this edit contlol. Same as caption().
|
232
|
+
def text()
|
233
|
+
self.caption
|
234
|
+
end
|
235
|
+
|
236
|
+
# Gets a text of this edit contlol. Same as caption=(str).
|
237
|
+
def text=(txt)
|
238
|
+
self.caption = API.adjust_internal_lf_code(txt)
|
239
|
+
end
|
240
|
+
|
241
|
+
# Gets a text length of this edit control.
|
242
|
+
def length()
|
243
|
+
self.text.size
|
244
|
+
end
|
245
|
+
|
246
|
+
# []=(position, length=1, text)
|
247
|
+
# Inserts and replaces at the specified <i>position</i> and <i>length</i> by the <i>text</i> in this edit control.
|
248
|
+
def []=(*args)
|
249
|
+
case args.size
|
250
|
+
when 2
|
251
|
+
start_pos, txt = args
|
252
|
+
len = 0
|
253
|
+
when 3
|
254
|
+
start_pos, len, txt = args
|
255
|
+
end
|
256
|
+
SendMessage(EM_SETSEL, start_pos, start_pos + len)
|
257
|
+
SendMessage(EM_REPLACESEL, 0, API.adjust_internal_lf_code(txt))
|
258
|
+
end
|
259
|
+
|
260
|
+
#### clip board operations etc.. ####
|
261
|
+
|
262
|
+
# Performs cut operation.
|
263
|
+
def cut() SendMessage(WM_CUT, 0, 0); end
|
264
|
+
# Performs copy operation.
|
265
|
+
def copy() SendMessage(WM_COPY, 0, 0); end
|
266
|
+
# Performs paste operation.
|
267
|
+
def paste() SendMessage(WM_PASTE, 0, 0); end
|
268
|
+
# Performs undo operation.
|
269
|
+
def undo() SendMessage(WM_UNDO, 0, 0); end
|
270
|
+
|
271
|
+
# Clears all text in this edit control.
|
272
|
+
def clear() SendMessage(WM_CLEAR, 0, 0); end
|
273
|
+
|
274
|
+
|
275
|
+
#### methods for multi line ####
|
276
|
+
|
277
|
+
# Gets a text of specified line index.
|
278
|
+
def [](idx) # line manipulation
|
279
|
+
n = SendMessage(EM_LINELENGTH, idx.to_i, 0)
|
280
|
+
n = RWin::UNICODE ? n : n*2
|
281
|
+
buff = TCHAR[n]
|
282
|
+
buff.subst(0, 2, n)
|
283
|
+
SendMessage(EM_GETLINE, idx.to_i, buff)
|
284
|
+
class << str = buff.to_s
|
285
|
+
def owner=(owner)
|
286
|
+
@owner = owner
|
287
|
+
self
|
288
|
+
end
|
289
|
+
def []=(*args)
|
290
|
+
txt = args.pop
|
291
|
+
@owner[*args] = txt
|
292
|
+
end
|
293
|
+
end
|
294
|
+
str.owner = self
|
295
|
+
str
|
296
|
+
end
|
297
|
+
|
298
|
+
# Counts num of lines in this edit control.
|
299
|
+
def countlines()
|
300
|
+
SendMessage(EM_GETLINECOUNT, 0, 0)
|
301
|
+
end
|
302
|
+
|
303
|
+
# Retreives an array of lines separated by CRLF code.
|
304
|
+
def lines()
|
305
|
+
Collection.new(self.caption.split())
|
306
|
+
end
|
307
|
+
|
308
|
+
# Gets first visible line of this edit control.<br> Retruns an Integer.
|
309
|
+
def firstvisibleline()
|
310
|
+
SendMessage(EM_GETFIRSTVISIBLELINE, 0, 0)
|
311
|
+
end
|
312
|
+
|
313
|
+
# Scrolls the text to specified line and column.
|
314
|
+
def scrollto(line, col)
|
315
|
+
SendMessage(EM_LINESCROLL, 0, MAKELPARAM(line, col))
|
316
|
+
end
|
317
|
+
|
318
|
+
def _scroll(op)
|
319
|
+
SendMessage(EM_SCROLL, op.to_i, 0)
|
320
|
+
end
|
321
|
+
private :_scroll
|
322
|
+
|
323
|
+
# Scrolls up to one line.
|
324
|
+
def scrollup() _scroll(0); end
|
325
|
+
|
326
|
+
# Scrolls down to one line.
|
327
|
+
def scrolldown() _scroll(1); end
|
328
|
+
|
329
|
+
# Scrolls up to one page.
|
330
|
+
def scrolluppage() _scroll(2); end
|
331
|
+
|
332
|
+
# Scrolls down to one page.
|
333
|
+
def scrolldnpage() _scroll(3); end
|
334
|
+
|
335
|
+
# Scrolls the caret into view in this edit control.
|
336
|
+
def scrollcaret()
|
337
|
+
SendMessage(EM_SCROLLCARET, 0, 0)
|
338
|
+
end
|
339
|
+
|
340
|
+
# Retreives a line number of specified position in this edit control.
|
341
|
+
def pos2line(pos) SendMessage(EM_LINEFROMCHAR, pos.to_i, 0); end
|
342
|
+
|
343
|
+
# Retreives a first position of specified line number in this edit control.
|
344
|
+
def line2pos(line) SendMessage(EM_LINEINDEX, line.to_i, 0); end
|
345
|
+
|
346
|
+
# Retreives a current line number of this edit control.
|
347
|
+
def currentline() SendMessage(EM_LINEFROMCHAR, -1, 0); end
|
348
|
+
|
349
|
+
# Retreives a position of specified coordinate(x, y) in this edit control.
|
350
|
+
def point2pos(x, y) LOWORD(SendMessage(EM_CHARFROMPOS, 0, MAKELPARAM(x, y))); end
|
351
|
+
|
352
|
+
# Retreives a line number of specified coordinate(x, y) in this edit control.
|
353
|
+
def point2line(x, y) HIWORD(SendMessage(EM_CHARFROMPOS, 0, MAKELPARAM(x, y))); end
|
354
|
+
|
355
|
+
WinStyles = {
|
356
|
+
:center => ES_CENTER,
|
357
|
+
:right => ES_RIGHT,
|
358
|
+
:multiline => ES_MULTILINE,
|
359
|
+
:uppercase => ES_UPPERCASE,
|
360
|
+
:lowercase => ES_LOWERCASE,
|
361
|
+
:password => ES_PASSWORD,
|
362
|
+
:autovscroll => ES_AUTOVSCROLL,
|
363
|
+
:autohscroll => ES_AUTOHSCROLL,
|
364
|
+
:nohidesell => ES_NOHIDESEL,
|
365
|
+
:oemconvert => ES_OEMCONVERT,
|
366
|
+
:readonly => ES_READONLY,
|
367
|
+
:wantreturn => ES_WANTRETURN,
|
368
|
+
:number => ES_NUMBER
|
369
|
+
}
|
370
|
+
|
371
|
+
protected
|
372
|
+
def _apply_options(arg)
|
373
|
+
if st=WinStyles[arg]
|
374
|
+
self.style |= st
|
375
|
+
return nil
|
376
|
+
end
|
377
|
+
super
|
378
|
+
end
|
379
|
+
|
380
|
+
def __ctlcoloredit__(hdc, hwnd)
|
381
|
+
return nil unless self._hwnd == hwnd
|
382
|
+
Canvas.new(hdc).Transparent
|
383
|
+
APP::CancelDefWindowProc(RWin::Brush.new(@_bkcolor)._hbrush)
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
module WR
|
389
|
+
class MyForm < Form
|
390
|
+
def initialize()
|
391
|
+
_<< Edit[:ed1, "Edit me", 0, 0, 100, 30, :disabled]
|
392
|
+
_<< Edit[:ed2, "Edit me", 0, 30, 100, 30]
|
393
|
+
# _ed1.each{|i| i.bkcolor=0xe0e0e0}
|
394
|
+
# @ed1.events = :change
|
395
|
+
# @ed1.accept_events :update , :change
|
396
|
+
# @ed1.set_subclass.register_event WM_KEYDOWN, 'key_down', 'ih'
|
397
|
+
# def @ed1.key_down(*args)
|
398
|
+
# dpp args
|
399
|
+
# end
|
400
|
+
end
|
401
|
+
|
402
|
+
def ed2_change(*args)
|
403
|
+
dpp args
|
404
|
+
end
|
405
|
+
def ed2_update(*args)
|
406
|
+
dpp args
|
407
|
+
end
|
408
|
+
|
409
|
+
self.start
|
410
|
+
end
|
411
|
+
end if $0 == __FILE__
|
412
|
+
|