WIN32汇编: 7.处理鼠标输入消息[2]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 goddragon 的 blog

        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_lbuttondown
        mov 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

本文关键:asm
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top