Tutorial 7: Mouse Input

We will learn how to receive and respond to mouse input in our window procedure.
The example program will wait for left mouse clicks and display a text
string at the exact clicked spot in the client area.

Preliminary:

As with keyboard input, Windows detects and sends notification about mouse
activities that are relevant to each window. These activities include left
and right clicks, mouse cursor movement over window, double clicks. Unlike
keyboard input which is directed to the window that has input focus, mouse
messages are sent to any window that the mouse cursor is over, active or
not. In addition, there are mouse messages about the non-client area too.
But most of the time, we can blissfully ignore them. We can focus on those
relating to the client area.
For each left and right mouse button, there are two associated messages:
WM_LBUTTONDOWN,WM_RBUTTONDOWN and WM_LBUTTONUP, WM_RBUTTONUP messages.
For a mouse with three buttons, there are also WM_MBUTTONDOWN and WM_MBUTTONUP.
When the mouse cursor moves over the client area, Windows sends WM_MOUSEMOVE
messages to the window under the cursor.
A window can receive double click messages, WM_LBUTTONDBCLK or WM_RBUTTONDBCLK,
if and only if its window class has been defined to receive them by including
CS_DBLCLKS flag in the class style,else the window will receive only a
series of mouse button up and down.
For all these messages, the value of lParam contains the position of
the mouse. The low word is the x-coordinate, and the high word is the y-coordinate
relative to upper left corner of the client area of the window. wParam
indicates the state of the mouse buttons and Shift and Ctrl keys.

The window procedure waits for left mouse button
click. When it receives WM_LBUTTONDOWN, lParam contains the coordinate
of the mouse cursor in the client area. It saves the coordinate in a variable
of type POINT which is defined as:

POINT STRUCT x dd ? y dd ?POINT ENDS

and sets the flag, MouseClick, to TRUE, meaning
that there's at least a left mouse button click in the client area.

mov eax,lParam
and eax,0FFFFh
mov hitpoint.x,eax

Since x-coordinate is the low word of lParam and
the members of POINT structure are 32-bit in size, we have to zero out
the high word of eax prior to storing it in hitpoint.x.

shr eax,16
mov hitpoint.y,eax

Because y-coordinate is the high word of lParam,
we must put it in the low word of eax prior to storing it in hitpoint.y.
We do this by shifting eax 16 bits to the right.After storing the mouse position, we set the
flag, MouseClick, to TRUE in order to let the painting code in WM_PAINT
section know that there's at least a click in the client area so it can
draw the string at the mouse position. Next we call InvalidateRect
function to force the window to repaint its entire client area.

The painting code in WM_PAINT section must check
if MouseClick is true, since when the window was created, it received a
WM_PAINT message which at that time, no mouse click had occurred so it
should not draw the string in the client area. We initialize MouseClick
to FALSE and change its value to TRUE when an actual mouse click occurs.If at least one mouse click has occurred, it
draws the string in the client area at the mouse position. Note that it
calls lstrlen to get the length of the string to display and sends the
length as the last parameter of TextOut function.

Visitor: 9534626 &nbsp{ 209.237.238.175 }

Copyright (c) 2002-2017 xbdev.net - All rights reserved.
Designated tutorial and software are the property of their respective owners.