API - część I

Download Report

Transcript API - część I

Programowanie
Windows
W środowisku Visual C++
Część I
Anna Tomkowska
Politechnika Koszalińska 2007
1/14
Szkielet aplikacji
Ładownie bibliotek #include …
Deklaracja zmiennych globalnych
Deklaracja funkcji
Int WINAPI WinMain(..)
{
deklaracja zmiennych
wypełnienie klasy WNDCLASS
rejestracja wypełnionej klasy RegisterClass(…)
utworzenie okna uzyskując uchwyt HWND CreateWindowEx(…)
wyświetlenie okna ShowWindow(…)
odświerzenie okna UpdateWindow(…)
Pętla komunikatów
}
LRESULT CALLBACK ProceduraOkna(…)
{
deklaracja zmiennych
switch(komunikat){…}
}
Inne ewentualne funkcje
1/14
Rysowanie
LRESULT CALLBACK WndProc(…)
{
static int xp, yp, xk, yk;
HDC hdc;
…
case WM_LBUTTONDOWN:
xp=xk=LOWORD(lParam);
yp=yk=HIWORD(lParam);
return 0;
case WM_LBUTTONUP:
xk=LOWORD(lParam);
yk=HIWORD(lParam);
hdc = GetDC(hWnd);
Rectangle(hdc, xp, yp, xk, yk);
ReleaseDC(hWnd,hdc);
return 0;
…
}
4/14
Rysowanie
LRESULT CALLBACK WndProc(…)
{
static int rysuj=0;
…
case WM_LBUTTONDOWN:
…
rysuj=1; return 0;
case WM_LBUTTONUP:
…
rysuj=0; return 0;
case WM_MOUSEMOVE:
if (rysuj)
{
hdc = GetDC(hWnd);
xk=LOWORD(lParam);
yk=HIWORD(lParam);
Rectangle(hdc,xp,yp,xk,yk);
ReleaseDC(hWnd,hdc);
}
return 0;
…
3/14
Tworzenie bitmap
LRESULT CALLBACK WndProc(…)
{
static HBITMAP hBitmap, HDC hdcMap;
RECT rc;
…
case WM_CREATE:
GetClientRect(hWnd,&rc);
hdc=GetDC(hWnd);
hBitmap = CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
hdcMap = CreateCompatibleDC(hdc);
SelectObject(hdcMap,hBitmap);
PatBlt(hdcMap,0,0, rc.right,rc.bottom,WHITENESS);
ReleaseDC(hWnd,hdc);
return 0;
case WM_DESTROY:
DeleteDC(hdcMap);
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
…
4/14
Rysowanie po bitmapie
LRESULT CALLBACK WndProc(…)
{
…
case WM_LBUTTONUP:
…
hdc = GetDC(hWnd);
Rectangle(hdc, xp, yp, xk, yk);
ReleaseDC(hWnd,hdc);
Rectangle(hdcMap, xp, yp, xk, yk);
InvalidateRect(hWnd,0,0);
return 0;
…
}
5/14
Wyświetlanie bitmapy
LRESULT CALLBACK WndProc(…)
{
PAINTSTRUCT ps;
…
case WM_MOUSEMOVE:
…
BitBlt(hdc,xp,yp,xk-xp,yk-yp,hdcMap,xp,yp,SRCCOPY);
xk=LOWORD(lParam);
yk=HIWORD(lParam);
…
return 0;
case WM_PAINT:
GetClientRect(hWnd,&rc);
hdc = BeginPaint(hWnd,&ps);
BitBlt(hdc,0,0,rc.right,rc.bottom,hdcMap,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
return 0;
…
5/14
BITMAPA
Okno aplikacji podczas przetwarzania komunikatu WM_MOUSEMOVE
BitBlt(hdc, xp, yp, a, b, hdcMap, xp, yp, SRCCOPY);
xp, yp
b
case WM_LBUTTONDOWN:
xp=xk=LOWORD(lParam);
yp=yk=HIWORD(lParam);
break;
case WM_LBUTTONUP:
xk=LOWORD(lParam);
yk=HIWORD(lParam);
…
break;
xk, yk
xk, yk
a
case WM_MOUSEMOVE:
… (jeżeli rysuj = 1)
BitBlt(hdc,xp,yp,xk-xp,yk-yp,hdcMap,xp,yp,SRCCOPY);
xk=LOWORD(lParam);
yk=HIWORD(lParam);
… ( Rysuj figurę)
break;
b = yk-yp
case WM_PAINT:
…
BitBlt(hdc,0,0,rc.right,rc.bottom,hdcMap,0,0,SRCCOPY);
…
break;
a = xk -xp
6/14
Tworzenie piór i pędzli
LRESULT CALLBACK WndProc(…)
{
static HPEN pen;
static HBRUSH brush;
…
case WM_CREATE:
srand((unsigned) time(0));
…
return 0;
case WM_LBUTTONDOWN:
…
pen = CreatePen(PS_SOLID,3,RGB(rand()%256,rand()%256,rand()%256));
brush = CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256));
return 0;
case WM_LBUTTONUP:
…
DeleteObject(pen);
DeleteObject(brush);
return 0;
…
7/14
Używanie piór i pędzli
LRESULT CALLBACK WndProc(…)
{
…
case WM_LBUTTONUP:
…
pen=(HPEN) SelectObject(hdcMap,pen);
brush=(HBRUSH) SelectObject(hdcMap,brush);
Rectangle(hdcMap, xp, yp, xk, yk);
pen=(HPEN) SelectObject(hdcMap,pen);
brush=(HBRUSH) SelectObject(hdcMap,brush);
DeleteObject(pen); DeleteObject(brush);
return 0;
case WM_MOUSEMOVE:
…
pen=(HPEN) SelectObject(hdc,pen);
brush=(HBRUSH) SelectObject(hdc,brush);
Rectangle(hdc, xp, yp, xk, yk);
pen=(HPEN) SelectObject(hdc,pen);
brush=(HBRUSH) SelectObject(hdc,brush);
DeleteObject(pen); DeleteObject(brush);
return 0;
8/14
Tworzenie menu głównego
2.
1.
3.
4.
5.
9/14
Tworzenie menu głównego
1.
3.
4.
2.
5.
10/14
Dodawanie menu głównego
int WINAPI WinMain(…)
{
WNDCLASS wc;
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
…
}
int WINAPI WinMain(…)
{
…
HMENU hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1));
HWND hWnd = CreateWindow("klasa_okna", "program", WS_OVERLAPPED,
0, 0, 300,300,
0,
hMenu,
hInst,
0 );
…
}
11/14
Komunikaty menu
LRESULT CALLBACK WndProc(…)
{
static int figura = ID_RYSUJ_PROSTOKAT;
…
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_RYSUJ_ PROSTOKAT :
case ID_RYSUJ_ELIPSA:
case ID_RYSUJ_WIELOKAT:
CheckMenuItem(GetMenu(hWnd), figura, MF_UNCHECKED);
figura=LOWORD(wParam);
CheckMenuItem(GetMenu(hWnd), figura, MF_CHECKED);
break;
}
return 0;
…
}
12/14
Rysowanie
void RysujFigure(HDC hdc, int xp, int yp, int xk,int yk,int figura);
LRESULT CALLBACK WndProc(…)
{
…
case WM_LBUTTONUP:
…
Rectangle(hdcMap, xp, yp, xk, yk);
RysujFigure(hdcMap, xp, yp, xk, yk, figura);
return 0;
case WM_MOUSEMOVE:
…
Rectangle(hdc, xp, yp, xk, yk);
RysujFigure(hdc, xp, yp, xk, yk, figura);
return 0;
…
13/14
void RysujFigure(HDC hdc, int xp, int yp, int xk,int yk,int figura)
{
switch(figura)
{
case ID_RYSUJ_PROSTOKAT:
Rectangle(hdc,xp,yp,xk,yk);
break;
case ID_RYSUJ_ELIPSA:
Ellipse(hdc,xp,yp,xk,yk);
break;
case ID_RYSUJ_WIELOKAT:
{
POINT pts[6]={{xp,yp}, {xp+(xk-xp)/2,yp}, {xp+2*(xk-xp)/3,yp+(yk-yp)/2},
{xk,yk}, {xk-(xk-xp)/2,yk}, {xk-2*(xk-xp)/3,yk-(yk-yp)/2}};
Polygon(hdc,pts,6);
break;
}
}
}
14/14
Menu podręczne
LRESULT CALLBACK WndProc(…)
{
HMENU hMenuP;
POINT pt ;
…
case WM_CREATE:
`…
hMenuP =GetSubMenu(GetMenu(hWnd), 0);
return 0;
case WM_RBUTTONUP:
pt.x= LOWORD(lParam);
pt.y= HIWORD(lParam);
ClientToScreen(hWnd, &pt);
TrackPopupMenu(hMenuP, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, 0);
return 0;
…
}