iczelion tut7[1]

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

本文简介:选择自 jimgreen 的 blog

 

第七课 处理鼠标输入消息


本课中我们将学习如何在我们的窗口过程函数中处理鼠标按键消息。示例程序演示了如何等待左键按下消息,我们将在按下的位置显示一个字符串。

理论:

和处理键盘输入一样,windows将捕捉鼠标动作并把它们发送到相关窗口。这些活动包括左、右键按下、移动、双击等(译者注:新式鼠标还包括滚轮消息wm_wheel)。windows并不像处理键盘输入那样把所有的鼠标消息都导向有输入焦点的窗口,任何鼠标经过的窗口都将接收到鼠标消息,无论有否输入焦点。另外,窗口还会接收到鼠标在非客户区移动的消息(wm_ncmove),但大多数的情况下我们都会将其忽略掉。 对鼠标的每一个按钮都有两个消息:wm_lbuttondown,wm_rbuttondown 。对于三键鼠标还会有wm_mbuttondown和wm_mbuttonup消息,当鼠标在某窗口客户区移动时,该窗口将接收到wm_mousemove消息。一个窗口若想处理wm_lbuttondbclk或 wm_rbuttondbclk,那么它的窗口类必须有cs_dblclks风格,否则它就会接受到一堆的按键起落(wm_xbuttondown或wm_xbuttonup)的消息。 对于所有的消息,窗口过程函数传入的参数lparam包含了鼠标的位置,其中底位为x坐标,高位为y坐标,这些坐标值都是相对于窗口客户区的左上角的值,wparam中则包含了鼠标按钮的状态。
 

例子:

.386
.model flat,stdcall
option casemap:none

winmain proto :dword,:dword,:dword,:dword

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

.data
classname db "simplewinclass",0
appname  db "our first window",0
mouseclick db 0         ; 0=no click yet

.data?
hinstance hinstance ?
commandline lpstr ?
hitpoint point <>

.code
start:
    invoke getmodulehandle, null
    mov    hinstance,eax
    invoke getcommandline
    mov commandline,eax

    invoke winmain, hinstance,null,commandline, sw_showdefault
    invoke exitprocess,eax

winmain proc hinst:hinstance,hprevinst:hinstance,cmdline:lpstr,cmdshow:dword
    local wc:wndclassex
    local msg:msg
    local hwnd:hwnd
    mov   wc.cbsize,sizeof wndclassex
    mov   wc.style, cs_hredraw or cs_vredraw
    mov   wc.lpfnwndproc, offset wndproc
    mov   wc.cbclsextra,null
    mov   wc.cbwndextra,null
    push  hinst
    pop   wc.hinstance
    mov   wc.hbrbackground,color_window+1
    mov   wc.lpszmenuname,null
    mov   wc.lpszclassname,offset classname
    invoke loadicon,null,idi_application
    mov   wc.hicon,eax
    mov   wc.hiconsm,eax
    invoke loadcursor,null,idc_arrow
    mov   wc.hcursor,eax
    invoke registerclassex, addr wc
    invoke createwindowex,null,addr classname,addr appname,\
           ws_overlappedwindow,cw_usedefault,\
           cw_usedefault,cw_usedefault,cw_usedefault,null,null,\
           hinst,null
    mov   hwnd,eax
    invoke showwindow, hwnd,sw_shownormal
    invoke updatewindow, hwnd
    .while true
                invoke getmessage, addr msg,null,0,0
                .break .if (!eax)
                invoke dispatchmessage, addr msg
    .endw
    mov     eax,msg.wparam
    ret
winmain endp

wndproc proc hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparam
    local hdc:hdc
    local ps:paintstruct

    .if umsg==wm_destroy
        invoke postquitmessage,null
    .elseif umsg==wm_lbuttondown
        mov eax,lparam
        and eax,0ffffh

本文关键:iczelion asm
  相关方案
Google
 

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

go top