Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗвЫт_ЛР_C++.doc
Скачиваний:
1
Добавлен:
05.05.2019
Размер:
513.02 Кб
Скачать

Теоретичні відомості:

Вікно може реагувати на звичайне клацання по ньому лівою кнопкою миші.

Отримавши повідомлення від лівої або правої кнопок миші, вікно запише в змінну 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]