当前位置:中国易下载软件教材中心文章中心编程语言汇编语言 → 汇编语言教学(7)

汇编语言教学(7)

减小字体 增大字体 作者:佚名  来源:不详  发布时间:2007-8-21 1:04:16
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
喜欢这些内容嘛,请告诉你身边的朋友,易下载中心-QQ资源-itnetcn.com一起享受这份乐趣,本站内容来源互联网
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

第七课 处理鼠标输入消息LiV海岸线网络安全资讯站
本课中我们将学习如何在我们的窗口过程函数中处理鼠标按键消息。示例程序演示了如何等待左键按下消息,我们将在按下的位置显示一个字符串。 LiV海岸线网络安全资讯站
理论:LiV海岸线网络安全资讯站
和处理键盘输入一样,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中则包含了鼠标按钮的状态。 LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
例子:LiV海岸线网络安全资讯站
.386 LiV海岸线网络安全资讯站
.model flat,stdcall LiV海岸线网络安全资讯站
option casemap:none LiV海岸线网络安全资讯站
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
include \masm32\include\windows.inc LiV海岸线网络安全资讯站
include \masm32\include\user32.inc LiV海岸线网络安全资讯站
include \masm32\include\kernel32.inc LiV海岸线网络安全资讯站
include \masm32\include\gdi32.inc LiV海岸线网络安全资讯站
includelib \masm32\lib\user32.lib LiV海岸线网络安全资讯站
includelib \masm32\lib\kernel32.lib LiV海岸线网络安全资讯站
includelib \masm32\lib\gdi32.lib LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
.data LiV海岸线网络安全资讯站
ClassName db "SimpleWinClass",0 LiV海岸线网络安全资讯站
AppName db "Our First Window",0 LiV海岸线网络安全资讯站
MouseClick db 0 ; 0=no click yet LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
.data? LiV海岸线网络安全资讯站
hInstance HINSTANCE ? LiV海岸线网络安全资讯站
CommandLine LPSTR ? LiV海岸线网络安全资讯站
hitpoint POINT <> LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
.code LiV海岸线网络安全资讯站
start: LiV海岸线网络安全资讯站
invoke GetModuleHandle, NULL LiV海岸线网络安全资讯站
mov hInstance,eax LiV海岸线网络安全资讯站
invoke GetCommandLineLiV海岸线网络安全资讯站
mov CommandLine,eax LiV海岸线网络安全资讯站
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT LiV海岸线网络安全资讯站
invoke ExitProcess,eax LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LiV海岸线网络安全资讯站
LOCAL wc:WNDCLASSEX LiV海岸线网络安全资讯站
LOCAL msg:MSG LiV海岸线网络安全资讯站
LOCAL hwnd:HWND LiV海岸线网络安全资讯站
mov wc.cbSize,SIZEOF WNDCLASSEX LiV海岸线网络安全资讯站
mov wc.style, CS_HREDRAW or CS_VREDRAW LiV海岸线网络安全资讯站
mov wc.lpfnWndProc, OFFSET WndProc LiV海岸线网络安全资讯站
mov wc.cbClsExtra,NULL LiV海岸线网络安全资讯站
mov wc.cbWndExtra,NULL LiV海岸线网络安全资讯站
push hInst LiV海岸线网络安全资讯站
pop wc.hInstance LiV海岸线网络安全资讯站
mov wc.hbrBackground,COLOR_WINDOW+1 LiV海岸线网络安全资讯站
mov wc.lpszMenuName,NULL LiV海岸线网络安全资讯站
mov wc.lpszClassName,OFFSET ClassName LiV海岸线网络安全资讯站
invoke LoadIcon,NULL,IDI_APPLICATION LiV海岸线网络安全资讯站
mov wc.hIcon,eax LiV海岸线网络安全资讯站
mov wc.hIconSm,eax LiV海岸线网络安全资讯站
invoke LoadCursor,NULL,IDC_ARROW LiV海岸线网络安全资讯站
mov wc.hCursor,eax LiV海岸线网络安全资讯站
invoke RegisterClassEx, addr wc LiV海岸线网络安全资讯站
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ LiV海岸线网络安全资讯站
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ LiV海岸线网络安全资讯站
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ LiV海岸线网络安全资讯站
hInst,NULL LiV海岸线网络安全资讯站
mov hwnd,eax LiV海岸线网络安全资讯站
invoke ShowWindow, hwnd,SW_SHOWNORMAL LiV海岸线网络安全资讯站
invoke UpdateWindow, hwnd LiV海岸线网络安全资讯站
.WHILE TRUE LiV海岸线网络安全资讯站
invoke GetMessage, ADDR msg,NULL,0,0 LiV海岸线网络安全资讯站
.BREAK .IF (!eax) LiV海岸线网络安全资讯站
invoke DispatchMessage, ADDR msg LiV海岸线网络安全资讯站
.ENDW LiV海岸线网络安全资讯站
mov eax,msg.wParam LiV海岸线网络安全资讯站
ret LiV海岸线网络安全资讯站
WinMain endp LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LiV海岸线网络安全资讯站
LOCAL hdc:HDC LiV海岸线网络安全资讯站
LOCAL ps:PAINTSTRUCT LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
.IF uMsg==WM_DESTROY LiV海岸线网络安全资讯站
invoke PostQuitMessage,NULL LiV海岸线网络安全资讯站
.ELSEIF uMsg==WM_LBUTTONDOWN LiV海岸线网络安全资讯站
mov eax,lParam LiV海岸线网络安全资讯站
and eax,0FFFFh LiV海岸线网络安全资讯站
mov hitpoint.x,eax LiV海岸线网络安全资讯站
mov eax,lParam LiV海岸线网络安全资讯站
shr eax,16 LiV海岸线网络安全资讯站
mov hitpoint.y,eax LiV海岸线网络安全资讯站
mov MouseClick,TRUE LiV海岸线网络安全资讯站
invoke InvalidateRect,hWnd,NULL,TRUE LiV海岸线网络安全资讯站
.ELSEIF uMsg==WM_PAINT LiV海岸线网络安全资讯站
invoke BeginPaint,hWnd, ADDR ps LiV海岸线网络安全资讯站
mov hdc,eax LiV海岸线网络安全资讯站
.IF MouseClick LiV海岸线网络安全资讯站
invoke lstrlen,ADDR AppName LiV海岸线网络安全资讯站
invoke TextOut,hdc,hitpoint.x,hitpoint.y,ADDR AppName,eax LiV海岸线网络安全资讯站
.ENDIF LiV海岸线网络安全资讯站
invoke EndPaint,hWnd, ADDR ps LiV海岸线网络安全资讯站
.ELSE LiV海岸线网络安全资讯站
invoke DefWindowProc,hWnd,uMsg,wParam,lParam LiV海岸线网络安全资讯站
ret LiV海岸线网络安全资讯站
.ENDIF LiV海岸线网络安全资讯站
xor eax,eax LiV海岸线网络安全资讯站
ret LiV海岸线网络安全资讯站
WndProc endp LiV海岸线网络安全资讯站
end start LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
分析:LiV海岸线网络安全资讯站
.ELSEIF uMsg==WM_LBUTTONDOWN LiV海岸线网络安全资讯站
mov eax,lParam LiV海岸线网络安全资讯站
and eax,0FFFFh LiV海岸线网络安全资讯站
mov hitpoint.x,eax LiV海岸线网络安全资讯站
mov eax,lParam LiV海岸线网络安全资讯站
shr eax,16 LiV海岸线网络安全资讯站
mov hitpoint.y,eax LiV海岸线网络安全资讯站
mov MouseClick,TRUE LiV海岸线网络安全资讯站
invoke InvalidateRect,hWnd,NULL,TRUE LiV海岸线网络安全资讯站
窗口过程处理了WM_LBUTTONDOWN消息,当接收到该消息时,lParam中包含了相对于窗口客户区左上角的坐标,我们把它保存下来,放到一个结构体变量(POINT)中,该结构体变量的定义如下: LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
POINT STRUCT LiV海岸线网络安全资讯站
x dd ? LiV海岸线网络安全资讯站
y dd ? LiV海岸线网络安全资讯站
POINT ENDS LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
然后我们把标志量MouseClick设为TRUE,这表明至少有一次在客户区的左键按下消息。 LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
mov eax,lParam LiV海岸线网络安全资讯站
and eax,0FFFFh LiV海岸线网络安全资讯站
mov hitpoint.x,eax LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
由于lParam是一个32位长的数,其中高、底16位分别包括了x、y坐标所以我们做一些小处理,以便保存它们。 LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
shr eax,16 LiV海岸线网络安全资讯站
mov hitpoint.y,eax LiV海岸线网络安全资讯站
保存完坐标后我们设标志MouseClick为TRUE,这是在处理WM_PAINT时用来判断是否有鼠标左键按下消息。然后我们调用InvalidateRect()函数迫使WINDOWS重新绘制客户区。 LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
.IF MouseClick LiV海岸线网络安全资讯站
invoke lstrlen,ADDR AppName LiV海岸线网络安全资讯站
invoke TextOut,hdc,hitpoint.x,hitpoint.y,ADDR AppName,eax LiV海岸线网络安全资讯站
.ENDIF LiV海岸线网络安全资讯站
LiV海岸线网络安全资讯站
绘制客户区的代码首先检测MouseClick标志位,再决定是否重绘。因为我们在首次显示窗口时还没有左键按下的消息,所以我们在初始时把该标志设为FALSE,告诉WINDOWS不要重绘客户区,当有左键按下的消息时,它会在鼠标按下的位置绘制字符串。注意在调用TextOut()函数时,其关于字符串长度的参数是调用lstrlen()函数来计算的。LiV海岸线网络安全资讯站