170 likes | 317 Views
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
E N D
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 Okno aplikacji podczas przetwarzania komunikatu WM_MOUSEMOVE BITMAPA 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; 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; xk, yk xk, yk a b = yk-yp 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; … }