Листинг 20.5
int InitTumbl(TUMBL *Т ) {
if(LoadRis((RIS *)Т)) return 2; if(T->hrgn) DeleteObject(T->hrgn):
T->hrgn - CreateRectRgn(T->r.1 eft.T->r.top.T->r.right.T->r.bottom);
return 0;
}
При щелчке левой кнопкой мыши оконная функция должна проверять вхождение координат мыши в сенсорные регионы всех элементов управления. В данном случае используется лишь один такой элемент, и при щелчке мыши вызывается его функция TestClick(), которая проверяет попадание курсора в сенсорный регион. Если курсор действительно находится в рассматриваемом регионе, то функция изменяет в соответствии с номером региона поле Pos. После этого координаты габаритного прямоугольника тумблера заносятся в структуру RECT г и производится вызов функции Inval i dateRect(hWnd. &г.TRUE), чтобы послать сообщение WM_PAINT и изменить изображение тумблера в окне. Код функции TestCl ick() приведен в листинге 20.6.
Листинг 20.6
int TestClick(TUMBL *T,HWND hWnd.UINT Msg.int w.long 1) {
//Координаты объекта заданы в системе окна, а функция InvalidateRectC) //требует координат в системе рабочей области. Поэтому заданные в структуре //*Т координаты углов тумблера переводим в систему рабочей области, вычитая //координаты (rrX. rrY+rrC) угла рабочей области в системе окна: RECT г = {T->abs_x-T->xC-rrX. T->abs_y-T->yC-rrY-rrC.
T->abs_x-T->xOT->RX-rrX. T->abs_y-T->yC+T->RY-rrY-rrC}; int xClick = L0W0RD(l)-(T->abs_x-T->xC)+rrX; int yClick - HIWORD(l)-(T->abs_y-T->yC)+rrY+rrC:
//Координаты мыши также передаются оконной процедуре в системе рабочей //области, переводим их в систему окна, прибавляя (rrX. rrY+rrC). потом Работа с окнами произвольной формы
//отнимаем координаты угла рисунка (T->abs_x-T->xC. T->abs_y-T->yC).
//В результате (xClick, yClick) - это координаты курсора в системе рисунка.
if(PtInRegion(T->hrgn,xClick-T->pL.x,yClick-T->pL.y)) //Проверка попадания
(if(T->Pos!-0) Inva1idateRect(hWnd.&r.TRUE): //в левый регион
T->Pos-0;return 1;