fzeet 0.5.3 → 0.6.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.
- data/examples/Command.rbw +2 -2
- data/examples/Control/Button.rbw +33 -11
- data/examples/Control/ComboBox.rbw +30 -0
- data/examples/Control/ComboBoxEx.rbw +30 -0
- data/examples/Control/DateTimePicker.rbw +9 -0
- data/examples/Control/Edit.rbw +18 -0
- data/examples/Control/Header.rbw +9 -0
- data/examples/Control/ListBox.rbw +30 -0
- data/examples/Control/ListView.rbw +11 -0
- data/examples/Control/MonthCalendar.rbw +9 -0
- data/examples/Control/ProgressBar.rbw +22 -0
- data/examples/Control/PropertySheet.rbw +50 -0
- data/examples/Control/Static.rbw +14 -0
- data/examples/Control/SysLink.rbw +9 -0
- data/examples/Control/TreeView.rbw +28 -0
- data/examples/Control/UpDown.rbw +12 -0
- data/examples/Dialog/Dialog.rbw +9 -9
- data/examples/Dialog/DialogApplication.rbw +1 -1
- data/examples/Menu/ContextMenu.rbw +3 -1
- data/examples/Menu/MenuPARGB32.rbw +6 -6
- data/examples/Paint.rbw +9 -0
- data/examples/UIRibbon/ContextPopup.rbw +7 -4
- data/examples/UIRibbon/Control/Button.dll +0 -0
- data/examples/UIRibbon/Control/Button.rb +91 -0
- data/examples/UIRibbon/Control/Button.rbw +20 -0
- data/examples/UIRibbon/Control/Button.xml +247 -0
- data/examples/UIRibbon/Size.rbw +13 -0
- data/examples/res/audio-volume-muted-big.bmp +0 -0
- data/examples/res/audio-volume-muted-small.bmp +0 -0
- data/examples/res/audio-volume-muted.bmp +0 -0
- data/examples/res/go-down-big.bmp +0 -0
- data/examples/res/go-down-small.bmp +0 -0
- data/examples/res/go-down.bmp +0 -0
- data/examples/res/go-jump-big.bmp +0 -0
- data/examples/res/go-jump-small.bmp +0 -0
- data/examples/res/go-jump.bmp +0 -0
- data/examples/res/media-playback-pause-big.bmp +0 -0
- data/examples/res/media-playback-pause-small.bmp +0 -0
- data/examples/res/media-playback-pause.bmp +0 -0
- data/lib/fzeet/Application.rb +4 -2
- data/lib/fzeet/Common.rb +44 -2
- data/lib/fzeet/Control/Button.rb +17 -0
- data/lib/fzeet/Control/ComboBox.rb +46 -0
- data/lib/fzeet/Control/ComboBoxEx.rb +35 -0
- data/lib/fzeet/Control/Common.rb +2 -0
- data/lib/fzeet/Control/DateTimePicker.rb +38 -0
- data/lib/fzeet/Control/Edit.rb +53 -0
- data/lib/fzeet/Control/Header.rb +46 -0
- data/lib/fzeet/Control/ListBox.rb +72 -0
- data/lib/fzeet/Control/ListView.rb +90 -0
- data/lib/fzeet/Control/MonthCalendar.rb +38 -0
- data/lib/fzeet/Control/ProgressBar.rb +40 -0
- data/lib/fzeet/Control/Static.rb +34 -0
- data/lib/fzeet/Control/SysLink.rb +40 -0
- data/lib/fzeet/Control/TreeView.rb +32 -0
- data/lib/fzeet/Control/UpDown.rb +36 -0
- data/lib/fzeet/Control.rb +13 -0
- data/lib/fzeet/UIRibbon.rb +91 -31
- data/lib/fzeet/Window/Common.rb +22 -1
- data/lib/fzeet/Window/View.rb +15 -0
- data/lib/fzeet/Window/WindowMethods.rb +26 -1
- data/lib/fzeet/Window.rb +1 -0
- data/lib/fzeet/windows/comctl/Button.rb +3 -0
- data/lib/fzeet/windows/comctl/ComboBox.rb +12 -0
- data/lib/fzeet/windows/comctl/ComboBoxEx.rb +65 -0
- data/lib/fzeet/windows/comctl/Common.rb +52 -1
- data/lib/fzeet/windows/comctl/DateTimePicker.rb +54 -0
- data/lib/fzeet/windows/comctl/Edit.rb +20 -0
- data/lib/fzeet/windows/comctl/Header.rb +128 -0
- data/lib/fzeet/windows/comctl/ListView.rb +317 -0
- data/lib/fzeet/windows/comctl/MonthCalendar.rb +62 -0
- data/lib/fzeet/windows/comctl/ProgressBar.rb +31 -0
- data/lib/fzeet/windows/comctl/PropertySheet.rb +205 -0
- data/lib/fzeet/windows/comctl/SysLink.rb +34 -0
- data/lib/fzeet/windows/comctl/TreeView.rb +198 -0
- data/lib/fzeet/windows/comctl/UpDown.rb +43 -0
- data/lib/fzeet/windows/comctl.rb +12 -0
- data/lib/fzeet/windows/common.rb +74 -2
- data/lib/fzeet/windows/gdi.rb +2 -0
- data/lib/fzeet/windows/libc.rb +4 -0
- data/lib/fzeet/windows/ole.rb +0 -22
- data/lib/fzeet/windows/shell/Common.rb +2 -0
- data/lib/fzeet/windows/user/Control/Button.rb +6 -0
- data/lib/fzeet/windows/user/Control/ComboBox.rb +72 -0
- data/lib/fzeet/windows/user/Control/Common.rb +1 -1
- data/lib/fzeet/windows/user/Control/Edit.rb +71 -0
- data/lib/fzeet/windows/user/Control/ListBox.rb +78 -0
- data/lib/fzeet/windows/user/Control/Static.rb +49 -0
- data/lib/fzeet/windows/user/Control.rb +4 -0
- data/lib/fzeet/windows/user/Window.rb +47 -0
- metadata +66 -4
@@ -0,0 +1,247 @@
|
|
1
|
+
<?xml version='1.0' encoding='utf-8' ?>
|
2
|
+
<Application xmlns='http://schemas.microsoft.com/windows/2009/Ribbon'>
|
3
|
+
<Application.Commands>
|
4
|
+
<Command Name='cmdAppMenu' />
|
5
|
+
|
6
|
+
<Command Name='cmdQAT' />
|
7
|
+
|
8
|
+
<Command Name='cmdTab1' LabelTitle='Button' />
|
9
|
+
<Command Name='cmdTab1Group1' LabelTitle='&Button' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
10
|
+
<Command.SmallImages>
|
11
|
+
<Image>../../res/go-next-small.bmp</Image>
|
12
|
+
<Image MinDPI='120'>../../res/go-next.bmp</Image>
|
13
|
+
</Command.SmallImages>
|
14
|
+
<Command.LargeImages>
|
15
|
+
<Image>../../res/go-next.bmp</Image>
|
16
|
+
<Image MinDPI='120'>../../res/go-next-big.bmp</Image>
|
17
|
+
</Command.LargeImages>
|
18
|
+
</Command>
|
19
|
+
<Command Name='cmdTab1Group2' LabelTitle='&DropDownButton' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
20
|
+
<Command.SmallImages>
|
21
|
+
<Image>../../res/go-down-small.bmp</Image>
|
22
|
+
<Image MinDPI='120'>../../res/go-down.bmp</Image>
|
23
|
+
</Command.SmallImages>
|
24
|
+
<Command.LargeImages>
|
25
|
+
<Image>../../res/go-down.bmp</Image>
|
26
|
+
<Image MinDPI='120'>../../res/go-down-big.bmp</Image>
|
27
|
+
</Command.LargeImages>
|
28
|
+
</Command>
|
29
|
+
<Command Name='cmdTab1Group3' LabelTitle='&SplitButton' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
30
|
+
<Command.SmallImages>
|
31
|
+
<Image>../../res/go-jump-small.bmp</Image>
|
32
|
+
<Image MinDPI='120'>../../res/go-jump.bmp</Image>
|
33
|
+
</Command.SmallImages>
|
34
|
+
<Command.LargeImages>
|
35
|
+
<Image>../../res/go-jump.bmp</Image>
|
36
|
+
<Image MinDPI='120'>../../res/go-jump-big.bmp</Image>
|
37
|
+
</Command.LargeImages>
|
38
|
+
</Command>
|
39
|
+
<Command Name='cmdTab1Group4' LabelTitle='&ToggleButton' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
40
|
+
<Command.SmallImages>
|
41
|
+
<Image>../../res/audio-volume-muted-small.bmp</Image>
|
42
|
+
<Image MinDPI='120'>../../res/audio-volume-muted.bmp</Image>
|
43
|
+
</Command.SmallImages>
|
44
|
+
<Command.LargeImages>
|
45
|
+
<Image>../../res/audio-volume-muted.bmp</Image>
|
46
|
+
<Image MinDPI='120'>../../res/audio-volume-muted-big.bmp</Image>
|
47
|
+
</Command.LargeImages>
|
48
|
+
</Command>
|
49
|
+
<Command Name='cmdTab1Group5' LabelTitle='&CheckBox' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
50
|
+
<Command.SmallImages>
|
51
|
+
<Image>../../res/media-playback-pause-small.bmp</Image>
|
52
|
+
<Image MinDPI='120'>../../res/media-playback-pause.bmp</Image>
|
53
|
+
</Command.SmallImages>
|
54
|
+
<Command.LargeImages>
|
55
|
+
<Image>../../res/media-playback-pause.bmp</Image>
|
56
|
+
<Image MinDPI='120'>../../res/media-playback-pause-big.bmp</Image>
|
57
|
+
</Command.LargeImages>
|
58
|
+
</Command>
|
59
|
+
|
60
|
+
<Command Name='cmdButton1' LabelTitle='&Button1' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
61
|
+
<Command.SmallImages>
|
62
|
+
<Image>../../res/go-next-small.bmp</Image>
|
63
|
+
<Image MinDPI='120'>../../res/go-next.bmp</Image>
|
64
|
+
</Command.SmallImages>
|
65
|
+
<Command.LargeImages>
|
66
|
+
<Image>../../res/go-next.bmp</Image>
|
67
|
+
<Image MinDPI='120'>../../res/go-next-big.bmp</Image>
|
68
|
+
</Command.LargeImages>
|
69
|
+
</Command>
|
70
|
+
<Command Name='cmdDrop1' LabelTitle='&Drop1' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
71
|
+
<Command.SmallImages>
|
72
|
+
<Image>../../res/go-down-small.bmp</Image>
|
73
|
+
<Image MinDPI='120'>../../res/go-down.bmp</Image>
|
74
|
+
</Command.SmallImages>
|
75
|
+
<Command.LargeImages>
|
76
|
+
<Image>../../res/go-down.bmp</Image>
|
77
|
+
<Image MinDPI='120'>../../res/go-down-big.bmp</Image>
|
78
|
+
</Command.LargeImages>
|
79
|
+
</Command>
|
80
|
+
<Command Name='cmdSplit1' LabelTitle='&Split1' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
81
|
+
<Command.SmallImages>
|
82
|
+
<Image>../../res/go-jump-small.bmp</Image>
|
83
|
+
<Image MinDPI='120'>../../res/go-jump.bmp</Image>
|
84
|
+
</Command.SmallImages>
|
85
|
+
<Command.LargeImages>
|
86
|
+
<Image>../../res/go-jump.bmp</Image>
|
87
|
+
<Image MinDPI='120'>../../res/go-jump-big.bmp</Image>
|
88
|
+
</Command.LargeImages>
|
89
|
+
</Command>
|
90
|
+
<Command Name='cmdToggle1' LabelTitle='&Toggle1' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
91
|
+
<Command.SmallImages>
|
92
|
+
<Image>../../res/audio-volume-muted-small.bmp</Image>
|
93
|
+
<Image MinDPI='120'>../../res/audio-volume-muted.bmp</Image>
|
94
|
+
</Command.SmallImages>
|
95
|
+
<Command.LargeImages>
|
96
|
+
<Image>../../res/audio-volume-muted.bmp</Image>
|
97
|
+
<Image MinDPI='120'>../../res/audio-volume-muted-big.bmp</Image>
|
98
|
+
</Command.LargeImages>
|
99
|
+
</Command>
|
100
|
+
<Command Name='cmdCheck1' LabelTitle='&Check1' LabelDescription='LabelDescription...' TooltipDescription='TooltipDescription...'>
|
101
|
+
<Command.SmallImages>
|
102
|
+
<Image>../../res/media-playback-pause-small.bmp</Image>
|
103
|
+
<Image MinDPI='120'>../../res/media-playback-pause.bmp</Image>
|
104
|
+
</Command.SmallImages>
|
105
|
+
<Command.LargeImages>
|
106
|
+
<Image>../../res/media-playback-pause.bmp</Image>
|
107
|
+
<Image MinDPI='120'>../../res/media-playback-pause-big.bmp</Image>
|
108
|
+
</Command.LargeImages>
|
109
|
+
</Command>
|
110
|
+
|
111
|
+
<Command Name='cmdContextMap1' />
|
112
|
+
</Application.Commands>
|
113
|
+
|
114
|
+
<Application.Views>
|
115
|
+
<Ribbon>
|
116
|
+
<Ribbon.ApplicationMenu>
|
117
|
+
<ApplicationMenu CommandName='cmdAppMenu'>
|
118
|
+
<MenuGroup Class='MajorItems'>
|
119
|
+
<Button CommandName='cmdButton1' />
|
120
|
+
<DropDownButton CommandName='cmdDrop1'>
|
121
|
+
<MenuGroup Class='MajorItems'>
|
122
|
+
<Button CommandName='cmdButton1' />
|
123
|
+
</MenuGroup>
|
124
|
+
</DropDownButton>
|
125
|
+
<SplitButton>
|
126
|
+
<SplitButton.ButtonItem>
|
127
|
+
<Button CommandName='cmdSplit1' />
|
128
|
+
</SplitButton.ButtonItem>
|
129
|
+
<SplitButton.MenuGroups>
|
130
|
+
<MenuGroup Class='MajorItems'>
|
131
|
+
<ToggleButton CommandName='cmdToggle1' />
|
132
|
+
<CheckBox CommandName='cmdCheck1' />
|
133
|
+
</MenuGroup>
|
134
|
+
</SplitButton.MenuGroups>
|
135
|
+
</SplitButton>
|
136
|
+
<!--<ToggleButton CommandName='cmdToggle1' />
|
137
|
+
<CheckBox CommandName='cmdCheck1' />-->
|
138
|
+
</MenuGroup>
|
139
|
+
</ApplicationMenu>
|
140
|
+
</Ribbon.ApplicationMenu>
|
141
|
+
|
142
|
+
<Ribbon.QuickAccessToolbar>
|
143
|
+
<QuickAccessToolbar CommandName='cmdQAT'>
|
144
|
+
<QuickAccessToolbar.ApplicationDefaults>
|
145
|
+
<Button CommandName='cmdButton1' />
|
146
|
+
</QuickAccessToolbar.ApplicationDefaults>
|
147
|
+
</QuickAccessToolbar>
|
148
|
+
</Ribbon.QuickAccessToolbar>
|
149
|
+
|
150
|
+
<Ribbon.Tabs>
|
151
|
+
<Tab CommandName='cmdTab1'>
|
152
|
+
<Group CommandName='cmdTab1Group1' SizeDefinition='OneButton'>
|
153
|
+
<Button CommandName='cmdButton1' />
|
154
|
+
</Group>
|
155
|
+
|
156
|
+
<Group CommandName='cmdTab1Group2' SizeDefinition='OneButton'>
|
157
|
+
<DropDownButton CommandName='cmdDrop1'>
|
158
|
+
<MenuGroup>
|
159
|
+
<Button CommandName='cmdButton1' />
|
160
|
+
</MenuGroup>
|
161
|
+
</DropDownButton>
|
162
|
+
</Group>
|
163
|
+
|
164
|
+
<Group CommandName='cmdTab1Group3' SizeDefinition='OneButton'>
|
165
|
+
<SplitButton>
|
166
|
+
<SplitButton.ButtonItem>
|
167
|
+
<Button CommandName='cmdSplit1' />
|
168
|
+
</SplitButton.ButtonItem>
|
169
|
+
<SplitButton.MenuGroups>
|
170
|
+
<MenuGroup>
|
171
|
+
<ToggleButton CommandName='cmdToggle1' />
|
172
|
+
<CheckBox CommandName='cmdCheck1' />
|
173
|
+
</MenuGroup>
|
174
|
+
</SplitButton.MenuGroups>
|
175
|
+
</SplitButton>
|
176
|
+
</Group>
|
177
|
+
|
178
|
+
<Group CommandName='cmdTab1Group4' SizeDefinition='OneButton'>
|
179
|
+
<ToggleButton CommandName='cmdToggle1' />
|
180
|
+
</Group>
|
181
|
+
|
182
|
+
<Group CommandName='cmdTab1Group5'>
|
183
|
+
<CheckBox CommandName='cmdCheck1' />
|
184
|
+
</Group>
|
185
|
+
</Tab>
|
186
|
+
</Ribbon.Tabs>
|
187
|
+
</Ribbon>
|
188
|
+
|
189
|
+
<ContextPopup>
|
190
|
+
<ContextPopup.MiniToolbars>
|
191
|
+
<MiniToolbar Name='miniToolbar1'>
|
192
|
+
<MenuGroup>
|
193
|
+
<Button CommandName='cmdButton1' />
|
194
|
+
<DropDownButton CommandName='cmdDrop1'>
|
195
|
+
<MenuGroup>
|
196
|
+
<Button CommandName='cmdButton1' />
|
197
|
+
</MenuGroup>
|
198
|
+
</DropDownButton>
|
199
|
+
<SplitButton>
|
200
|
+
<SplitButton.ButtonItem>
|
201
|
+
<Button CommandName='cmdSplit1' />
|
202
|
+
</SplitButton.ButtonItem>
|
203
|
+
<SplitButton.MenuGroups>
|
204
|
+
<MenuGroup>
|
205
|
+
<ToggleButton CommandName='cmdToggle1' />
|
206
|
+
<CheckBox CommandName='cmdCheck1' />
|
207
|
+
</MenuGroup>
|
208
|
+
</SplitButton.MenuGroups>
|
209
|
+
</SplitButton>
|
210
|
+
<ToggleButton CommandName='cmdToggle1' />
|
211
|
+
<CheckBox CommandName='cmdCheck1' />
|
212
|
+
</MenuGroup>
|
213
|
+
</MiniToolbar>
|
214
|
+
</ContextPopup.MiniToolbars>
|
215
|
+
|
216
|
+
<ContextPopup.ContextMenus>
|
217
|
+
<ContextMenu Name='contextMenu1'>
|
218
|
+
<MenuGroup>
|
219
|
+
<Button CommandName='cmdButton1' />
|
220
|
+
<DropDownButton CommandName='cmdDrop1'>
|
221
|
+
<MenuGroup>
|
222
|
+
<Button CommandName='cmdButton1' />
|
223
|
+
</MenuGroup>
|
224
|
+
</DropDownButton>
|
225
|
+
<SplitButton>
|
226
|
+
<SplitButton.ButtonItem>
|
227
|
+
<Button CommandName='cmdSplit1' />
|
228
|
+
</SplitButton.ButtonItem>
|
229
|
+
<SplitButton.MenuGroups>
|
230
|
+
<MenuGroup>
|
231
|
+
<ToggleButton CommandName='cmdToggle1' />
|
232
|
+
<CheckBox CommandName='cmdCheck1' />
|
233
|
+
</MenuGroup>
|
234
|
+
</SplitButton.MenuGroups>
|
235
|
+
</SplitButton>
|
236
|
+
<ToggleButton CommandName='cmdToggle1' />
|
237
|
+
<CheckBox CommandName='cmdCheck1' />
|
238
|
+
</MenuGroup>
|
239
|
+
</ContextMenu>
|
240
|
+
</ContextPopup.ContextMenus>
|
241
|
+
|
242
|
+
<ContextPopup.ContextMaps>
|
243
|
+
<ContextMap CommandName='cmdContextMap1' MiniToolbar='miniToolbar1' ContextMenu='contextMenu1' />
|
244
|
+
</ContextPopup.ContextMaps>
|
245
|
+
</ContextPopup>
|
246
|
+
</Application.Views>
|
247
|
+
</Application>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'fzeet'
|
2
|
+
|
3
|
+
include Fzeet
|
4
|
+
|
5
|
+
Application.run(View.new) { |window|
|
6
|
+
UIRibbon.new(window, 'Minimal').
|
7
|
+
on(:size) { window.invalidate }.
|
8
|
+
on(CmdButton1) { message 'on(CmdButton1)' }.
|
9
|
+
|
10
|
+
window.on(:draw, Control::Font) { |dc|
|
11
|
+
dc.sms 'The quick brown fox jumps over the lazy dog. 1234567890'
|
12
|
+
}
|
13
|
+
}
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/fzeet/Application.rb
CHANGED
@@ -11,10 +11,11 @@ module Fzeet
|
|
11
11
|
@window = nil
|
12
12
|
@accelerators = []
|
13
13
|
@dialogs = []
|
14
|
+
@images = {}
|
14
15
|
|
15
16
|
class << self
|
16
17
|
attr_accessor :name, :version, :authors, :quitWhenMainWindowCloses
|
17
|
-
attr_reader :window, :accelerators, :dialogs
|
18
|
+
attr_reader :window, :accelerators, :dialogs, :images
|
18
19
|
end
|
19
20
|
|
20
21
|
def self.window=(window)
|
@@ -25,7 +26,7 @@ module Fzeet
|
|
25
26
|
|
26
27
|
def self.run(windowOrOpts = {}, &block)
|
27
28
|
@window = case windowOrOpts
|
28
|
-
when
|
29
|
+
when BasicWindow; windowOrOpts.tap { |window| block.call(window) if block }
|
29
30
|
when Hash
|
30
31
|
if windowOrOpts[:deferCreateWindow].tap { windowOrOpts.delete_if { |k, v| k == :deferCreateWindow } }
|
31
32
|
Window.new(windowOrOpts, &block)
|
@@ -56,6 +57,7 @@ module Fzeet
|
|
56
57
|
|
57
58
|
def self.quit(code = 0)
|
58
59
|
accelerators.each(&:dispose)
|
60
|
+
images.values.each(&:dispose)
|
59
61
|
|
60
62
|
Windows.PostQuitMessage(code)
|
61
63
|
end
|
data/lib/fzeet/Common.rb
CHANGED
@@ -45,7 +45,17 @@ module Fzeet
|
|
45
45
|
module_function :constant, :flags
|
46
46
|
|
47
47
|
module Toggle
|
48
|
-
def toggle(what)
|
48
|
+
def toggle(what)
|
49
|
+
send("#{what}=", !send("#{what}?"))
|
50
|
+
|
51
|
+
begin
|
52
|
+
yield self
|
53
|
+
ensure
|
54
|
+
toggle(what)
|
55
|
+
end if block_given?
|
56
|
+
|
57
|
+
self
|
58
|
+
end
|
49
59
|
end
|
50
60
|
|
51
61
|
class Command
|
@@ -111,7 +121,11 @@ module Fzeet
|
|
111
121
|
message(message, opts)
|
112
122
|
end
|
113
123
|
|
114
|
-
|
124
|
+
def shell(name, args = nil, dir = nil, verb = 'open')
|
125
|
+
raise 'ShellExecute failed.' unless Windows.ShellExecute(nil, verb, name, args, dir, Windows::SW_NORMAL).to_i > 32
|
126
|
+
end
|
127
|
+
|
128
|
+
module_function :message, :question, :shell
|
115
129
|
|
116
130
|
class Point < Windows::POINT
|
117
131
|
def initialize(x = 0, y = 0) self[:x], self[:y] = x, y end
|
@@ -266,6 +280,34 @@ module Fzeet
|
|
266
280
|
end
|
267
281
|
|
268
282
|
module DCMethods
|
283
|
+
def select(*objects)
|
284
|
+
holds = []
|
285
|
+
|
286
|
+
objects.each { |object|
|
287
|
+
holds << Windows.DetonateLastError(FFI::Pointer::NULL, :SelectObject, @handle, object.handle)
|
288
|
+
}
|
289
|
+
|
290
|
+
yield self
|
291
|
+
|
292
|
+
self
|
293
|
+
ensure
|
294
|
+
holds.each { |hold| Windows.SelectObject(@handle, hold) }
|
295
|
+
end
|
296
|
+
|
297
|
+
def fillRect(rect, brush) Windows.DetonateLastError(0, :FillRect, @handle, rect, brush.handle); self end
|
298
|
+
|
299
|
+
def text(text, rect, flags = 0) Windows.DetonateLastError(0, :DrawText, @handle, text, -1, rect, Fzeet.flags(flags, :dt_)); self end
|
300
|
+
|
301
|
+
def sms(message)
|
302
|
+
r = window.rect
|
303
|
+
|
304
|
+
r[:top] += window.ribbon.height if window.ribbon
|
305
|
+
|
306
|
+
text(message, r, [:singleline, :center, :vcenter])
|
307
|
+
|
308
|
+
self
|
309
|
+
end
|
310
|
+
|
269
311
|
def move(x, y) Windows.DetonateLastError(0, :MoveToEx, @handle, x, y, nil); self end
|
270
312
|
def line(x, y) Windows.DetonateLastError(0, :LineTo, @handle, x, y); self end
|
271
313
|
end
|
data/lib/fzeet/Control/Button.rb
CHANGED
@@ -1,7 +1,24 @@
|
|
1
1
|
require_relative 'Common'
|
2
2
|
|
3
3
|
module Fzeet
|
4
|
+
module ButtonMethods
|
5
|
+
def image=(image) sendmsg(:setimage, Windows::IMAGE_BITMAP, image.handle) end
|
6
|
+
|
7
|
+
def note=(text) Windows.LPWSTR(text) { |p| sendmsg(:setnote, 0, p) } end
|
8
|
+
|
9
|
+
def checked?; sendmsg(:getcheck) == Windows::BST_CHECKED end
|
10
|
+
def checked=(checked) sendmsg(:setcheck, (checked) ? Windows::BST_CHECKED : Windows::BST_UNCHECKED) end
|
11
|
+
|
12
|
+
def indeterminate?; sendmsg(:getcheck) == Windows::BST_INDETERMINATE end
|
13
|
+
def indeterminate=(indeterminate) sendmsg(:setcheck, (indeterminate) ? Windows::BST_INDETERMINATE : Windows::BST_UNCHECKED) end
|
14
|
+
|
15
|
+
def pushed?; (sendmsg(:getstate) & Windows::BST_PUSHED) == Windows::BST_PUSHED end
|
16
|
+
def pushed=(pushed) sendmsg(:setstate, (pushed) ? 1 : 0) end
|
17
|
+
end
|
18
|
+
|
4
19
|
class Button < Control
|
20
|
+
include ButtonMethods
|
21
|
+
|
5
22
|
Prefix = {
|
6
23
|
xstyle: [:ws_ex_],
|
7
24
|
style: [:bs_, :ws_],
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'ListBox'
|
2
|
+
|
3
|
+
module Fzeet
|
4
|
+
module ComboBoxMethods
|
5
|
+
include ListBoxMethods
|
6
|
+
|
7
|
+
def textlen(i) raise "GETLBTEXTLEN failed." if (len = sendmsg(:getlbtextlen, i)) == -1; len end
|
8
|
+
|
9
|
+
def [](i)
|
10
|
+
i = sendmsg(:getcursel) if i == :selected
|
11
|
+
|
12
|
+
return '' if i == -1 || (len = textlen(i) + 1) == 1
|
13
|
+
|
14
|
+
''.tap { |item|
|
15
|
+
FFI::MemoryPointer.new(:char, len) { |buf|
|
16
|
+
raise "GETLBTEXT failed." if sendmsg(:getlbtext, i, buf) == -1
|
17
|
+
|
18
|
+
item << buf.read_string
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class ComboBox < Control
|
25
|
+
include ComboBoxMethods
|
26
|
+
|
27
|
+
Prefix = {
|
28
|
+
xstyle: [:ws_ex_],
|
29
|
+
style: [:cbs_, :ws_],
|
30
|
+
message: [:cb_, :wm_],
|
31
|
+
notification: [:cbn_]
|
32
|
+
}
|
33
|
+
|
34
|
+
def initialize(parent, id, opts = {}, &block)
|
35
|
+
super('ComboBox', parent, id, opts)
|
36
|
+
|
37
|
+
@parent.on(:command, @id, &block) if block
|
38
|
+
end
|
39
|
+
|
40
|
+
def on(notification, &block)
|
41
|
+
@parent.on(:command, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
|
42
|
+
|
43
|
+
self
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative 'ComboBox'
|
2
|
+
|
3
|
+
module Fzeet
|
4
|
+
module ComboBoxExMethods
|
5
|
+
include ComboBoxMethods
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
class ComboBoxEx < Control
|
10
|
+
include ComboBoxExMethods
|
11
|
+
|
12
|
+
Prefix = {
|
13
|
+
xstyle: [:cbes_ex_, :ws_ex_],
|
14
|
+
style: [:cbs_, :ws_],
|
15
|
+
message: [:cb_, :cbem_, :ccm_, :wm_],
|
16
|
+
notification: [:cbn_, :cben_, :nm_]
|
17
|
+
}
|
18
|
+
|
19
|
+
def initialize(parent, id, opts = {}, &block)
|
20
|
+
super('ComboBoxEx32', parent, id, opts)
|
21
|
+
|
22
|
+
@parent.on(:command, @id, &block) if block
|
23
|
+
end
|
24
|
+
|
25
|
+
def on(notification, &block)
|
26
|
+
if (notification = Fzeet.constant(notification, *self.class::Prefix[:notification])) < Windows::CBEN_LAST
|
27
|
+
@parent.on(:command, @id, notification, &block)
|
28
|
+
else
|
29
|
+
@parent.on(:notify, @id, notification, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
self
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/fzeet/Control/Common.rb
CHANGED
@@ -36,6 +36,7 @@ module Fzeet
|
|
36
36
|
y: Windows::CW_USEDEFAULT,
|
37
37
|
width: Windows::CW_USEDEFAULT,
|
38
38
|
height: Windows::CW_USEDEFAULT,
|
39
|
+
position: []
|
39
40
|
}
|
40
41
|
badopts = opts.keys - _opts.keys; raise "Bad option(s): #{badopts.join(', ')}." unless badopts.empty?
|
41
42
|
_opts.merge!(opts)
|
@@ -43,6 +44,7 @@ module Fzeet
|
|
43
44
|
_opts[:xstyle] = Fzeet.flags(_opts[:xstyle], *self.class::Prefix[:xstyle])
|
44
45
|
_opts[:caption] = _opts[:caption].to_s
|
45
46
|
_opts[:style] = Fzeet.flags([:child, :visible, :tabstop], :ws_) | Fzeet.flags(_opts[:style], *self.class::Prefix[:style])
|
47
|
+
_opts[:x], _opts[:y], _opts[:width], _opts[:height] = _opts[:position] unless _opts[:position].empty?
|
46
48
|
|
47
49
|
@handle = Windows.DetonateLastError(FFI::Pointer::NULL, :CreateWindowEx,
|
48
50
|
_opts[:xstyle], className, _opts[:caption], _opts[:style],
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'Common'
|
2
|
+
|
3
|
+
module Fzeet
|
4
|
+
module DateTimePickerMethods
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
class DateTimePicker < Control
|
9
|
+
include DateTimePickerMethods
|
10
|
+
|
11
|
+
Prefix = {
|
12
|
+
xstyle: [:ws_ex_],
|
13
|
+
style: [:dts_, :ws_],
|
14
|
+
message: [:dtm_, :ccm_, :wm_],
|
15
|
+
notification: [:dtn_, :nm_]
|
16
|
+
}
|
17
|
+
|
18
|
+
def self.crackNotification(args)
|
19
|
+
case args[:notification]
|
20
|
+
when Windows::DTN_DATETIMECHANGE
|
21
|
+
args[:dtc] = Windows::NMDATETIMECHANGE.new(FFI::Pointer.new(args[:lParam]))
|
22
|
+
args[:st] = args[:dtc][:st] if args[:dtc][:dwFlags] == Windows::GDT_VALID
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(parent, id, opts = {}, &block)
|
27
|
+
super('SysDateTimePick32', parent, id, opts)
|
28
|
+
|
29
|
+
@parent.on(:notify, @id, &block) if block
|
30
|
+
end
|
31
|
+
|
32
|
+
def on(notification, &block)
|
33
|
+
@parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
|
34
|
+
|
35
|
+
self
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative 'Common'
|
2
|
+
|
3
|
+
module Fzeet
|
4
|
+
module EditMethods
|
5
|
+
def clear; self.text = ''; self end
|
6
|
+
|
7
|
+
def select(s = 0, e = -1) sendmsg(:setsel, s, e); self end
|
8
|
+
|
9
|
+
def cuebanner=(text) Windows.LPWSTR(text) { |p| sendmsg(:setcuebanner, 1, p) } end
|
10
|
+
|
11
|
+
def showBalloontip(text, title = '', icon = 1)
|
12
|
+
Windows.LPWSTR(text) { |ptext| Windows.LPWSTR(title) { |ptitle|
|
13
|
+
ebt = Windows::EDITBALLOONTIP.new
|
14
|
+
|
15
|
+
ebt[:cbStruct] = ebt.size
|
16
|
+
ebt[:pszTitle] = ptitle
|
17
|
+
ebt[:pszText] = ptext
|
18
|
+
ebt[:ttiIcon] = Fzeet.constant(icon, :tti_)
|
19
|
+
|
20
|
+
sendmsg(:showBalloontip, 0, ebt.pointer)
|
21
|
+
}}
|
22
|
+
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def hideBalloontip; sendmsg(:hideBalloontip); self end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Edit < Control
|
30
|
+
include EditMethods
|
31
|
+
|
32
|
+
Prefix = {
|
33
|
+
xstyle: [:ws_ex_],
|
34
|
+
style: [:es_, :ws_],
|
35
|
+
message: [:em_, :wm_],
|
36
|
+
notification: [:en_]
|
37
|
+
}
|
38
|
+
|
39
|
+
def initialize(parent, id, opts = {}, &block)
|
40
|
+
super('Edit', parent, id, opts)
|
41
|
+
|
42
|
+
style << :border; reframe
|
43
|
+
|
44
|
+
@parent.on(:command, @id, &block) if block
|
45
|
+
end
|
46
|
+
|
47
|
+
def on(notification, &block)
|
48
|
+
@parent.on(:command, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
|
49
|
+
|
50
|
+
self
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'Common'
|
2
|
+
|
3
|
+
module Fzeet
|
4
|
+
module HeaderMethods
|
5
|
+
def insertItem(i, text, width)
|
6
|
+
hdi = Windows::HDITEM.new
|
7
|
+
|
8
|
+
hdi[:mask] = Fzeet.flags([:width, :text, :format, :order], :hdi_)
|
9
|
+
hdi[:cxy] = width
|
10
|
+
hdi[:pszText] = ptext = FFI::MemoryPointer.from_string(text)
|
11
|
+
hdi[:fmt] = Fzeet.flags([:left, :string], :hdf_)
|
12
|
+
hdi[:iOrder] = i
|
13
|
+
|
14
|
+
sendmsg(:insertitem, 0, hdi.pointer)
|
15
|
+
|
16
|
+
self
|
17
|
+
ensure
|
18
|
+
ptext.free
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Header < Control
|
23
|
+
include HeaderMethods
|
24
|
+
|
25
|
+
Prefix = {
|
26
|
+
xstyle: [:ws_ex_],
|
27
|
+
style: [:hds_, :ws_],
|
28
|
+
message: [:hdm_, :ccm_, :wm_],
|
29
|
+
notification: [:hdn_, :nm_]
|
30
|
+
}
|
31
|
+
|
32
|
+
def self.crackNotification(args) end
|
33
|
+
|
34
|
+
def initialize(parent, id, opts = {}, &block)
|
35
|
+
super('SysHeader32', parent, id, opts)
|
36
|
+
|
37
|
+
@parent.on(:notify, @id, &block) if block
|
38
|
+
end
|
39
|
+
|
40
|
+
def on(notification, &block)
|
41
|
+
@parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
|
42
|
+
|
43
|
+
self
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|