Теоретичні відомості:
Вікно може реагувати на звичайне клацання по ньому лівою кнопкою миші.
Отримавши повідомлення від лівої або правої кнопок миші, вікно запише в змінну lParam значення координат миші в момент натискання. lParam для зручності можна розлядати у вигляді двох частин - старшої і молодшої. Для вибору значень з кожної частини можна застосувати функції LOWORD() і HIWORD(). В молодшому слові буде координата по х, в старшому - по у.
int x,y;
//Якщо було клацання лівою або правою кнопкою
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
char *str;
HDC hDC;
hDC=GetDC(hWnd);
x=LOWORD(lParam); //визначення координат
y=HIWORD(lParam);
TextOut(hDC, x, y, szText, strlen(szText));
break;
Лістинг програми :
#include "windows.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE ghInstance;
char szIconName[]="MYICON";
char szProgName[]="Progname";
char szText[]="Вітаю, тепер ви вмієте працювати з мишею!";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG lpMsg;
WNDCLASS w;
ghInstance = hInstance;
w.lpszClassName=szProgName;
w.hInstance=hInstance;
w.lpfnWndProc=WndProc;
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.hIcon=LoadIcon(hInstance, szIconName);
w.lpszMenuName=0; //меню пока не будет
w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
w.style=CS_HREDRAW|CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w))
return 0;
hWnd=CreateWindow(szProgName,
"Черга за мишею!",
WS_OVERLAPPEDWINDOW, 100,100, 500, 400,
(HWND)NULL,
(HMENU)NULL,
(HINSTANCE)hInstance,
(HINSTANCE)NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&lpMsg, NULL, 0, 0))
{
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return(lpMsg.wParam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,
WPARAM wParam, LPARAM lParam)
{
//Цикл обробки повідомлень
switch(messg)
{
int x,y; //координати
//якщо було клацання лівою або правою кнопкою
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
HDC hDC;
PAINTSTRUCT ps;
hDC=GetDC(hWnd);
x=LOWORD(lParam); //визначення координат
y=HIWORD(lParam);
hDC=BeginPaint(hWnd, &ps);
HDC hmdc; HBITMAP hBitmap; BITMAP bm;
hBitmap = LoadBitmap(ghInstance, ("IDB_MYIMAGE"));
hmdc=CreateCompatibleDC(hDC);
SelectObject(hmdc, hBitmap);
GetObject(hBitmap, sizeof(bm), (LPSTR) &bm);
BitBlt(hDC, 0, 10, bm.bmWidth, bm.bmHeight, hmdc, 0,0, SRCCOPY);
DeleteDC(hmdc);
ValidateRect(hWnd, NULL);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam));
}
return 0;
}
Вікно результату :
Лістинг програми :
#include "windows.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char szIconName[]="MYICON";
char szImageName[]="MYIMAGE";
char szProgName[]="Progname";
HBITMAP hBitmap;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG lpMsg;
hBitmap=LoadBitmap(hInstance, szImageName);
WNDCLASS w;
w.lpszClassName=szProgName;
w.hInstance=hInstance;
w.lpfnWndProc=WndProc;
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.hIcon=LoadIcon(hInstance, szIconName);
w.lpszMenuName=0;
w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); w.style=CS_HREDRAW|CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w))
return 0;
hWnd=CreateWindow(szProgName,
"Марк!",
WS_OVERLAPPEDWINDOW, 100, 100, 500, 400,
(HWND)NULL,
(HMENU)NULL,
(HINSTANCE)hInstance,
(HINSTANCE)NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&lpMsg, NULL, 0, 0))
{
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return(lpMsg.wParam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
//Координати кнопки
int x1=180;
int y1=250;
int x2=400;
int y2=300;
//Цикл обробки повідомлень
switch(messg)
{
int x,y; //координати миші
HDC hdc, hmdc;
BITMAP bm;
PAINTSTRUCT ps;
LOGFONT lf;
HFONT hFont;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
//Малювання картинки:
hmdc=CreateCompatibleDC(hdc);
SelectObject(hmdc, hBitmap);
GetObject(hBitmap, sizeof(bm), (LPSTR)&bm);
BitBlt(hdc, 10,10, bm.bmWidth, bm.bmHeight, hmdc, 0,0,SRCINVERT);
DeleteDC(hmdc);
HBRUSH hBrush; //Створення пензля
//Рамка кнопки
hBrush=CreateSolidBrush(RGB(255,255,0));
SelectObject(hdc, hBrush);
RoundRect(hdc,x1,y1,x2,y2,20,20);
//Сама кнопка
hBrush=CreateSolidBrush(RGB(0,255,0));
SelectObject(hdc, hBrush);
RoundRect(hdc,185,255,395,295,20,20);
//Параметри шрифта
lf.lfCharSet=DEFAULT_CHARSET; //значення за замовчуванням
lf.lfPitchAndFamily=DEFAULT_PITCH; // значення за замовчуванням
strcpy(lf.lfFaceName,"Times New Roman");
lf.lfHeight=20;
lf.lfWidth=10;
lf.lfWeight=FW_BOLD;
lf.lfEscapement=0;
lf.lfStrikeOut=0;
lf.lfUnderline=0;
hFont=CreateFontIndirect(&lf);
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(255,0,0)); //колір тексту
SetBkMode(hdc, TRANSPARENT); //текст буде прозорий
TextOut(hdc, 218, 263,"Push the button", 15); //текст кнопки
EndPaint(hWnd, &ps);
break;
//повідомлення миші
case WM_LBUTTONDOWN:
HDC hDC;
hDC=GetDC(hWnd);
x=LOWORD(lParam);//координати курсору при натисканні миші
y=HIWORD(lParam);
//Якщо натискання в межах кнопки
if((x>x1)&&(x<x2)&&(y>y1)&&(y<y2))
{
MessageBox(hWnd, "Вітаю, з мишею Ви розібралися!", "Yes-s-s!", MB_OK|MB_ICONINFORMATION);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam));
}
return 0;
}
Вікно результату :
Висновок :
Під час даної лабораторної роботи було оброблено повідомлення миші у вікні засобами API.