Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
API_LAB.doc
Скачиваний:
1
Добавлен:
06.05.2019
Размер:
485.38 Кб
Скачать

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

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

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