-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbtnt.inc
271 lines (219 loc) · 5.96 KB
/
btnt.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
BMPBTN = 1
ImageButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ImageButnProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
sizeFrame dd ?,?
.data?
hCopy dd ?
hAbout dd ?
hExit dd ?
hWND dd ?
.code
ImageButton proc hParent:DWORD,topX:DWORD,topY:DWORD,rnum1:DWORD,rnum2:DWORD,rnum3:DWORD,ID:DWORD
; parameters are,
; 1. Parent handle
; 2/3 top X & Y co-ordinates
; 4/5/6 resource ID numbers or identifiers for UP & DOWN & MOVER bitmaps
; 67 ID number for control
LOCAL hButn1 :DWORD
LOCAL hImage :DWORD
LOCAL hModule :DWORD
LOCAL wid :DWORD
LOCAL hgt :DWORD
LOCAL hBmpU :DWORD
LOCAL hBmpD :DWORD
LOCAL hBmpN :DWORD
LOCAL Rct :RECT
LOCAL wc :WNDCLASSEX
invoke GetModuleHandle,NULL
mov hModule, eax
IFDEF BMPBTN
invoke LoadBitmap,hModule,rnum1
mov hBmpU, eax
invoke LoadBitmap,hModule,rnum2
mov hBmpD, eax
invoke LoadBitmap,hModule,rnum3
mov hBmpN,eax
ELSEIFDEF JPGBTN
invoke BitmapFromResource, hModule, rnum1
mov hBmpU,eax
invoke BitmapFromResource, hModule, rnum2
mov hBmpD,eax
invoke BitmapFromResource, hModule, rnum3
mov hBmpN,eax
ENDIF
jmp @F
Bmp_Button_Class db "Bmp_Button_Class_Jowy",0
@@:
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset ImageButnProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, 16
push hModule
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset Bmp_Button_Class
mov wc.hIcon, NULL
; invoke LoadCursor,hInstance,300
; mov hCursor,eax
mov wc.hCursor, NULL
mov wc.hIconSm, NULL
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx,WS_EX_TRANSPARENT,
ADDR Bmp_Button_Class,NULL,
WS_CHILD or WS_VISIBLE,
topX,topY,100,100,hParent,ID,
hModule,NULL
mov hButn1, eax
invoke SetWindowLong,hButn1,0,hBmpU
invoke SetWindowLong,hButn1,4,hBmpD
invoke SetWindowLong,hButn1,8,hBmpN
jmp @F
ButnImageClass db "STATIC",0
@@:
invoke CreateWindowEx,0,
ADDR ButnImageClass,NULL,
WS_CHILD or WS_VISIBLE or SS_BITMAP,
0,0,0,0,hButn1,ID,
hModule,NULL
mov hImage, eax
invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpU
invoke GetWindowRect,hImage,ADDR Rct
invoke SetWindowLong,hButn1,12,hImage
mov eax, Rct.bottom
mov edx, Rct.top
sub eax, edx
mov hgt, eax
mov eax, Rct.right
mov edx, Rct.left
sub eax, edx
mov wid, eax
invoke SetWindowPos,hButn1,HWND_TOP,0,0,wid,hgt,SWP_NOMOVE
invoke ShowWindow,hButn1,SW_SHOW
mov eax, hButn1
ret
ImageButton endp
ImageButnProc proc hWin :DWORD,uMsg :DWORD,wParam :DWORD,lParam :DWORD
LOCAL hBmpU :DWORD
LOCAL hBmpD :DWORD
LOCAL hBmpN :DWORD
LOCAL hImage :DWORD
LOCAL hParent:DWORD
LOCAL ID :DWORD
LOCAL ptX :DWORD
LOCAL ptY :DWORD
LOCAL bWid :DWORD
LOCAL bHgt :DWORD
LOCAL Rct :RECT
.data
cFlag dd 0 ; a GLOBAL variable for the "clicked" setting
.code
.if uMsg == WM_LBUTTONDOWN
invoke GetWindowLong,hWin,4
mov hBmpD, eax
invoke GetWindowLong,hWin,12
mov hImage, eax
invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpD
invoke SetCapture,hWin
mov cFlag, 1
.elseif uMsg == 200h
cmp cFlag,0
jnz @Huh
invoke GetClientRect,hWin,addr Rct
mov eax,lParam
mov ptX,eax
mov ptY,eax
and ptX,0ffffh
shr ptY,010h
mov ebx,ptX
mov ecx,ptY
cmp ecx,08ch
ja @1
cmp ebx,01eh
jbe @2
@1:
add Rct.left,0
sub Rct.right,5
add Rct.top,0
sub Rct.bottom,5
@2:
cmp ebx,Rct.left
jb @Normal
cmp ebx,Rct.right
ja @Normal
cmp ecx,Rct.top
jb @Normal
cmp ecx,Rct.bottom
ja @Normal
invoke GetWindowLong,hWin,8
mov hBmpN, eax
invoke GetWindowLong,hWin,12
mov hImage, eax
invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpN
invoke SetCapture,hWin
jmp @OK
@Normal:
invoke ReleaseCapture
invoke GetWindowLong,hWin,0
mov hBmpU, eax
invoke GetWindowLong,hWin,12
mov hImage, eax
invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpU
invoke SetFocus,hWin
@OK:
.elseif uMsg == WM_LBUTTONUP
.if cFlag == 0
ret
.else
mov cFlag, 0
.endif
invoke GetWindowLong,hWin,0
mov hBmpU, eax
invoke GetWindowLong,hWin,12
mov hImage, eax
invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpU
mov eax, lParam
cwde
mov ptX, eax
mov eax, lParam
rol eax, 16
cwde
mov ptY, eax
invoke GetWindowRect,hWin,ADDR Rct
mov eax, Rct.right
mov edx, Rct.left
sub eax, edx
mov bWid, eax
mov eax, Rct.bottom
mov edx, Rct.top
sub eax, edx
mov bHgt, eax
; --------------------------------
; exclude button releases outside
; of the button rectangle from
; sending message back to parent
; --------------------------------
cmp ptX, 0
jle @F
cmp ptY, 0
jle @F
mov eax, bWid
cmp ptX, eax
jge @F
mov eax, bHgt
cmp ptY, eax
jge @F
invoke GetParent,hWin
mov hParent, eax
invoke GetDlgCtrlID,hWin
mov ID, eax
invoke SendMessage,hParent,WM_COMMAND,ID,hWin
@@:
invoke ReleaseCapture
.endif
@Huh:
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
ImageButnProc endp