Теоретичні відомості:
Вікно може реагувати на звичайне клацання по ньому лівою кнопкою миші.
Отримавши повідомлення від лівої або правої кнопок миші, вікно запише в змінну 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;
Лістинг програми :
//lab5.cpp
#include<windows.h>
#include<tchar.h>
const wchar_t szTitle[]=_T("ЗПЗС-114 Лаб№5 Вариницький С.В.");
const wchar_t szProgName[]=_T("Лаб№5");
const wchar_t szIconName[]=_T("IDI_MYICON");
const wchar_t szCursorName[]=_T("IDC_MYCURSOR");
HINSTANCE ghInstance;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM MyRegisterClass(HINSTANCE hInstance);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd; MSG lpMsg;
ghInstance = hInstance;
WNDCLASS w;
w.style = CS_HREDRAW|CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.cbClsExtra = 0;
w.cbWndExtra = 0;
w.hInstance = hInstance;
w.hIcon = LoadIcon(hInstance, szIconName);
w.hCursor = LoadCursor(hInstance, szCursorName);
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
w.lpszMenuName = 0;
w.lpszClassName = szProgName;
if(!RegisterClass(&w)) {
MessageBox(NULL, _T("Can't register class"), _T("Error"), MB_OK); return 0;
}
hWnd = CreateWindow(szProgName, szTitle, WS_OVERLAPPEDWINDOW,100, 100, 700, 500, (HWND)NULL, (HMENU)NULL,(HINSTANCE)hInstance, (LPVOID) NULL);
if(!hWnd) {
MessageBox(NULL, _T("Can't create window"), _T("Error"), MB_OK); return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&lpMsg, hWnd, 0, 0)) {
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return lpMsg.wParam;
}
void outPicture(HDC hdc, int x, int y, wchar_t st[]) {
HDC hmdc; HBITMAP hBitmap; BITMAP bm;
hBitmap = LoadBitmap(ghInstance, st); //Зв’язування
hmdc=CreateCompatibleDC(hdc); //Створення контексту памяті
SelectObject(hmdc, hBitmap); //Вибір об’єкту картинки
GetObject(hBitmap, sizeof(bm), (LPSTR) &bm); //отримуємо висоту і ширину картинки
BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hmdc, 0,0, SRCCOPY); //Виведення картинки на екран в точку 10, 10 з пам’ятi (hmdc)
DeleteDC(hmdc); //видалення контексту з пам’яті
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
HDC hdc; PAINTSTRUCT ps;
switch(messg)
{
int x,y;
//Якщо було клацання лівою або правою кнопкою
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
char *str;
hdc=GetDC(hWnd);
x=LOWORD(lParam); //визначення координат
y=HIWORD(lParam);
outPicture(hdc, x, y, _T("IDB_MYIMAGE"));
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, messg, wParam, lParam);
}
return 0;
}
//lab5.rc
#include "windows.h"
IDI_MYICON ICON "ico.ico"
IDC_MYCURSOR CURSOR "c.cur"
IDB_MYIMAGE BITMAP "pr2.bmp"
Вікно результату :
Лістинг програми :
//lab5.cpp
#include<windows.h>
#include<tchar.h>
const wchar_t szTitle[]=_T("ЗПЗС-114 Лаб№5 Вариницький С.В.");
const wchar_t szProgName[]=_T("Лаб№5");
const wchar_t szIconName[]=_T("IDI_MYICON");
const wchar_t szCursorName[]=_T("IDC_MYCURSOR");
wchar_t szImageName[]=_T("IDB_MYIMAGE");
HINSTANCE ghInstance;
HBITMAP hBitmap; int gw=0, gh=0;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd; MSG lpMsg;
ghInstance = hInstance;
WNDCLASS w;
w.style = CS_HREDRAW|CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.cbClsExtra = 0;
w.cbWndExtra = 0;
w.hInstance = hInstance;
w.hIcon = LoadIcon(hInstance, szIconName);
w.hCursor = LoadCursor(hInstance, szCursorName);
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
w.lpszMenuName = 0;
w.lpszClassName = szProgName;
if(!RegisterClass(&w)) {
MessageBox(NULL, _T("Can't register class"), _T("Error"), MB_OK); return 0;
}
hWnd = CreateWindow(szProgName, szTitle, WS_OVERLAPPEDWINDOW,100, 100, 500, 300, (HWND)NULL, (HMENU)NULL,(HINSTANCE)hInstance, (LPVOID) NULL);
if(!hWnd) {
MessageBox(NULL, _T("Can't create window"), _T("Error"), MB_OK); return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&lpMsg, hWnd, 0, 0)) {
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return lpMsg.wParam;
}
void outPicture(HDC hdc, int x, int y, wchar_t st[]) {
HDC hmdc; HBITMAP hBitmap; BITMAP bm;
hBitmap = LoadBitmap(ghInstance, st); //Зв’язування
hmdc=CreateCompatibleDC(hdc); //Створення контексту памяті
SelectObject(hmdc, hBitmap); //Вибір об’єкту картинки
GetObject(hBitmap, sizeof(bm), (LPSTR) &bm); //отримуємо висоту і ширину картинки
gw=bm.bmWidth; gh=bm.bmHeight;
BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hmdc, 0,0, SRCCOPY); //Виведення картинки на екран в точку 10, 10 з пам’ятi (hmdc)
DeleteDC(hmdc); //видалення контексту з пам’яті
}
void drawButton (HDC hdc, int x1, int y1, int x2, int y2, wchar_t st[], int leng) {
HBRUSH hBrush;LOGFONT lf; HFONT hFont;
hBrush=CreateSolidBrush(RGB(255,255,0));
SelectObject(hdc, hBrush);
RoundRect(hdc,x1,y1,x2,y2,20,20);
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfPitchAndFamily=DEFAULT_PITCH;
lstrcpyW(lf.lfFaceName,_T("Times New Roman"));
lf.lfHeight=20;
lf.lfWidth=10;
lf.lfWeight=FW_BOLD;
lf.lfEscapement=1;
lf.lfStrikeOut=0;
lf.lfUnderline=1;
hFont=CreateFontIndirect(&lf);
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(255,0,0));
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, x1+20, y1,st, leng);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
HDC hdc=GetDC(hWnd);
switch(messg) {
int x,y;
HDC hdc, hmdc;
PAINTSTRUCT ps;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
outPicture(hdc, 10, 10, szImageName);
drawButton(hdc, 100, 100, 200, 130, _T("Enter"), strlen("Enter"));
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN:
HDC hDC;
hDC=GetDC(hWnd);
x=LOWORD(lParam);
y=HIWORD(lParam);
if((x>100)&&(x<200)&&(y>100)&&(y<130))
MessageBox(hWnd, _T("Кнопка"), _T("Yes-s-s!"), MB_OK|MB_ICONINFORMATION);
else if ((x>10)&&(x<10+gw)&&(y>10)&&(y<10+gh))
MessageBox(hWnd, _T("Картинка"), _T("Yes-s-s!"), MB_OK|MB_ICONINFORMATION);
else MessageBox(hWnd, _T("Форма"), _T("Yes-s-s!"), MB_OK|MB_ICONINFORMATION);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:return(DefWindowProc(hWnd, messg, wParam, lParam));
}
return 0;
}
//lab5.rc
#include "windows.h"
IDI_MYICON ICON "ico.ico"
IDC_MYCURSOR CURSOR "c.cur"
IDB_MYIMAGE BITMAP "pr2.bmp"
Вікно результату :
Висновок :
Під час даної лабораторної роботи було оброблено повідомлення миші у вікні засобами API.