Процедура окна ждет нажатия на
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
Так как x-координата - это нижнее слово lParam и члены структуры POINT размером в 32 бита, мы должны обнулить верхнее слово eax, прежде чем сохранить значение в hitpoint.x.
shr eax,16
mov hitpoint.y,eax
Так как y-координата - это верхнее слово lParam, мы должны ее в нижнее слово, прежде чем сохранять в hitрoint.y. Мы делаем это сдвигая eax на 16 битов вправо. После сохранения позиции мыши, мы устанавливаем флаг, MouseClick, в TRUE для того, чтобы отрисовывающий код в секции WM_PAINT, знал, что было нажатие в клиентской области, и значит поэтому он может нарисовать строку в позиции, где была мышь при нажатии. Затем мы вызываем функцию InvalidateRect, чтобы заставить окно полностью перерисовать ее клиентскую область.
.IF MouseClick
invoke lstrlen,ADDR AppName invoke TextOut,hdc,hitpoint.x,hitpoint.y,ADDR AppName,eax
.ENDIF
Отрисовывающий код в секции WM_PAINT должен проверять, установлен ли флаг MouseClick в TRUE, потому что когда окно создается, процедура окна получает сообщение WM_PAINT в то время, когда не было сделано еще ни одного нажатия, то есть строку отрисовывать нельзя. Мы инициализируем MouseClick в FALSE и меняем ее значение в TRUE, когда происходит нажатие на мышь. Если по крайней мере одно нажатие на мышь произошло, она вырисовывает строку в клиентской области в позиции, где была мышь при нажатии. Заметьте, что она вызывает lstrlen для того, чтобы определить длину строки и шлет полученное значение в качестве последнего параметра функции TextOut.
[C] Iczelion, пер. Aquila.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий