17
Programowanie Windows W środowisku Visual C+ + Część I Anna Tomkowska Politechnika Koszalińska 2007

Programowanie Windows

  • Upload
    meadow

  • View
    40

  • Download
    0

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: Programowanie Windows

Programowanie Windows

W środowisku Visual C++Część I

Anna TomkowskaPolitechnika Koszalińska 2007

Page 2: Programowanie Windows

Szkielet aplikacji Ładownie bibliotek #include …Deklaracja zmiennych globalnychDeklaracja funkcji

Int WINAPI WinMain(..){

deklaracja zmiennychwypełnienie klasy WNDCLASSrejestracja 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 zmiennychswitch(komunikat){…}

}

Inne ewentualne funkcje

1/14

Page 3: Programowanie Windows

RysowanieLRESULT 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;…}

1/14

Page 4: Programowanie Windows

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;…

4/14

Page 5: Programowanie Windows

Tworzenie bitmapLRESULT 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;…

3/14

Page 6: Programowanie Windows

Rysowanie po bitmapieLRESULT 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;…}

4/14

Page 7: Programowanie Windows

Wyświetlanie bitmapyLRESULT 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

Page 8: Programowanie Windows

5/14

xp, yp

xk, yk

case WM_LBUTTONDOWN: xp=xk=LOWORD(lParam); yp=yk=HIWORD(lParam); break;case WM_LBUTTONUP: xk=LOWORD(lParam); yk=HIWORD(lParam); … break;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;case WM_PAINT: … BitBlt(hdc,0,0,rc.right,rc.bottom,hdcMap,0,0,SRCCOPY); … break;

BITMAPA Okno aplikacji podczas przetwarzania komunikatu WM_MOUSEMOVE

xk, yk

BitBlt(hdc, xp, yp, a, b, hdcMap, xp, yp, SRCCOPY);

a

b

b = yk-yp

a = xk -xp

Page 9: Programowanie Windows

Tworzenie piór i pędzliLRESULT 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;…

6/14

Page 10: Programowanie Windows

Używanie piór i pędzliLRESULT 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;

7/14

Page 11: Programowanie Windows

Tworzenie menu głównego

4.

3.

2.

5.

1.

8/14

Page 12: Programowanie Windows

Tworzenie menu głównego

1.

2.

5.

4.

3.

9/14

Page 13: Programowanie Windows

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 );

…}

Dodawanie menu głównego10/14

Page 14: Programowanie Windows

Komunikaty menuLRESULT 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;…}

11/14

Page 15: Programowanie Windows

Rysowanievoid 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;…

12/14

Page 16: Programowanie Windows

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; } }}

13/14

Page 17: Programowanie Windows

Menu podręczneLRESULT 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;…}

14/14