mov hitpoint.x,eax
mov eax,lparam
shr eax,16
mov hitpoint.y,eax
mov mouseclick,true
invoke invalidaterect,hwnd,null,true
.elseif umsg==wm_paint
invoke beginpaint,hwnd, addr ps
mov hdc,eax
.if mouseclick
invoke lstrlen,addr appname
invoke textout,hdc,hitpoint.x,hitpoint.y,addr appname,eax
.endif
invoke endpaint,hwnd, addr ps
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret
.endif
xor eax,eax
ret
wndproc endp
end start
分析:
.elseif umsg==wm_lbuttondownmov eax,lparam
and eax,0ffffh
mov hitpoint.x,eax
mov eax,lparam
shr eax,16
mov hitpoint.y,eax
mov mouseclick,true
invoke invalidaterect,hwnd,null,true
窗口过程处理了wm_lbuttondown消息,当接收到该消息时,lparam中包含了相对于窗口客户区左上角的坐标,我们把它保存下来,放到一个结构体变量(point)中,该结构体变量的定义如下:
point struct
x dd ?
y dd ?
point ends
然后我们把标志量mouseclick设为true,这表明至少有一次在客户区的左键按下消息。
mov eax,lparam
and eax,0ffffh
mov hitpoint.x,eax
由于lparam是一个32位长的数,其中高、底16位分别包括了x、y坐标所以我们做一些小处理,以便保存它们。
shr eax,16
mov hitpoint.y,eax
保存完坐标后我们设标志mouseclick为true,这是在处理wm_paint时用来判断是否有鼠标左键按下消息。然后我们调用invalidaterect()函数迫使windows重新绘制客户区。
.if mouseclick
invoke lstrlen,addr appname
invoke textout,hdc,hitpoint.x,hitpoint.y,addr appname,eax