intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình sự kiện - các thư viện lập trình của windows - trần minh thái - 3

Chia sẻ: Muay Thai | Ngày: | Loại File: PDF | Số trang:18

53
lượt xem
2
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài 3:Các thiết bị nhập liệu crPrevBk = SetBkColor(hdc, RGB(0,0,0)); TextOut(hdc, nCaretPosX, nCaretPosY * dwCharY, &ch, 1); SetTextColor(hdc, crPrevText); SetBkColor(hdc, crPrevBk); } // Get the width of the character and // calculate the new horizontal position of the caret. GetCharWidth32(hdc, ch, ch, &nCharWidth); ReleaseDC(hwndMain, hdc); nCaretPosX = nCaretPosX + nCharWidth; } nCurChar++; ShowCaret(hwndMain); break; } break; case VK_UP: // UP ARROW case VK_DOWN: // DOWN ARROW MessageBeep((UINT) -1); return 0; case VK_HOME: // HOME // Set the caret's position to the upper left // corner of the client area. nCaretPosX = nCaretPosY = 0; nCurChar = 0; break; case VK_END: //...

Chủ đề:
Lưu

Nội dung Text: Lập trình sự kiện - các thư viện lập trình của windows - trần minh thái - 3

  1. Bài 3:Các thiết bị nhập liệu Trần Minh Thái crPrevBk = SetBkColor(hdc, 169 RGB(0,0,0)); 170 TextOut(hdc, nCaretPosX, 171 nCaretPosY * dwCharY, 172 &ch, 1); 173 SetTextColor(hdc, crPrevText); 174 SetBkColor(hdc, crPrevBk); 175 } 176 // Get the width of the character and 177 // calculate the new horizontal position of the caret. 178 GetCharWidth32(hdc, ch, ch, &nCharWidth); 179 ReleaseDC(hwndMain, hdc); 180 nCaretPosX = nCaretPosX + nCharWidth; 181 } 182 nCurChar++; 183 ShowCaret(hwndMain); 184 break; 185 } 186 break; 187 case VK_UP: // UP ARROW 188 case VK_DOWN: // DOWN ARROW 189 MessageBeep((UINT) -1); 190 return 0; 191 case VK_HOME: // HOME 192 // Set the caret's position to the upper left 193 // corner of the client area. 194 nCaretPosX = nCaretPosY = 0; 195 nCurChar = 0; 196 break; 197 case VK_END: // END 198 // Move the caret to the end of the text. 199 for (i=0; i < cch; i++) 200 { 201 // Count the carriage returns and save the 202 // index of the last one. 203 if (pchInputBuf[i] == 0x0D) 204 { 205 cCR++; 206 nCRIndex = i + 1; 207 } 208 } 209 nCaretPosY = cCR; 210 211 // Copy all text between the last carriage 212 // return and the end of the keyboard input 213 // buffer to a temporary buffer. 214 Bài giảng: Lập trình C for Win .............................................................................................Trang 37/69
  2. Bài 3:Các thiết bị nhập liệu Trần Minh Thái for (i = nCRIndex, j = 0; i < cch; i++, j++) 215 szBuf[j] = pchInputBuf[i]; 216 szBuf[j] = TEXT('\0'); 217 // Retrieve the text extent and use it 218 // to set the horizontal position of the 219 // caret. 220 hdc = GetDC(hwndMain); 221 GetTextExtentPoint32(hdc, szBuf, lstrlen(szBuf), &sz); 222 nCaretPosX = sz.cx; 223 ReleaseDC(hwndMain, hdc); 224 nCurChar = cch; 225 break; 226 default: 227 break; 228 } 229 SetCaretPos(nCaretPosX, nCaretPosY * dwCharY); 230 break; 231 case WM_PAINT: 232 if (cch == 0) // nothing in input buffer 233 break; 234 hdc = BeginPaint(hwndMain, &ps); 235 HideCaret(hwndMain); 236 // Set the clipping rectangle, and then draw the text 237 // into it. 238 SetRect(&rc, 0, 0, dwLineLen, dwClientY); 239 DrawText(hdc, pchInputBuf, -1, &rc, DT_LEFT); 240 ShowCaret(hwndMain); 241 EndPaint(hwndMain, &ps); 242 break; 243 // Process other messages. 244 case WM_DESTROY: 245 PostQuitMessage(0); 246 // Free the input buffer. 247 GlobalFree((HGLOBAL) pchInputBuf); 248 UnregisterHotKey(hwndMain, 0xAAAA); 249 break; 250 default: 251 return DefWindowProc(hwndMain, uMsg, wParam, lParam); 252 } 253 return NULL; 254 } 255 2. Thiết bị chuột a. Kiểm tra thiết bị chuột int GetSystemMetrics( Bài giảng: Lập trình C for Win .............................................................................................Trang 38/69
  3. Bài 3:Các thiết bị nhập liệu Trần Minh Thái int nIndex // system metric or configuration setting ); fMouse = GetSystemMetrics( SM_MOUSEPRESENT ); Giá trị trả về fMouse là TRUE (1) nếu có thiết bị chuột được cài đặt, và ngược lại bằng FALSE (0) nếu thiết bị chuột không được cài đặt vào máy. b. Trong lớp cửa sổ ta định nghĩa con trỏ chuột cho ứng dụng wndclass.hCursor = LoadCursor ( NULL, IDC_ARROR); wndclass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; Với thiết bị chuột ta có thể có các hành động như sau: Kích chuột : nhấn và thả một nút chuột. Kích đúp chuột : nhấn và thả chuột nhanh (nhấn 2 lần nhanh). Kéo : di chuyển chuột trong khi vẫn nắm giữ một nút. c. Thông điệp chuột trong vùng làm việc Nút Nhấn Thả Nhấn đúp Trái WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK Giữa WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK Phải WM_RBUTTONDOWN WM_MBUTTONUP WM_RBUTTONDBLCLK d. Giá trị wParam sẽ cho biết trạng thái của nút nhấn, phím Shift, và phím Ctrl. MK_LBUTTON Nút chuột trái nhấn MK_MBUTTON Nút chuột giữa nhấn MK_RBUTTON Nút chuột phải nhấn MK_SHIFT Phím Shift được nhấn MK_CONTROL Phím Ctrl được nhấn e. Giá trị lParam sẽ cho biết vị trí chuột tại thời điểm phát sinh message. 2 bytes thấp: tọa độ x 2 bytes cao: tọa độ y f. Ví dụ Bài giảng: Lập trình C for Win .............................................................................................Trang 39/69
  4. Bài 3:Các thiết bị nhập liệu Trần Minh Thái LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 1 WPARAM wParam, LPARAM lParam) 2 { 3 HDC hdc; 4 static POINT oldPoint; 5 static int iC; 6 int WIDTH_PEN = 2; 7 HPEN oPen,pen; 8 COLORREF Col [ ] ={ RGB (0, 0, 0) , RGB (255 ,0 ,0), 9 RGB (0, 255, 0), RGB (0, 0, 255), RGB (255, 255, 0)}; 10 POINT point; 11 TCHAR str [255]; 12 switch ( message ) // Xử lý thông điệp 13 { 14 case WM_LBUTTONDOWN: 15 /* Vẽ đường thẳng từ vị trí trước đó đến vị trí chuột hiện tại*/ 16 hdc = GetDC ( hWnd ); 17 pen = CreatePen ( PS_SOLID,WIDTH_PEN,Col [ 18 iC] ); 19 oPen = ( HPEN ) SelectObject ( hdc,pen ); 20 point.x = LOWORD ( lParam ); 21 point.y = HIWORD ( lParam ); 22 MoveToEx ( hdc, oldPoint.x, oldPoint.y, NULL ); 23 LineTo ( hdc, point.x, point.y ); 24 oldPoint = point; 25 /* Chọn lại bút vẽ trước đó và hủy bút vẽ vừa tạo*/ 26 SelectObject ( hdc, oPen ); 27 DeleteObject ( pen ); 28 ReleaseDC ( hWnd, hdc ); 29 break; 30 case WM_RBUTTONDOWN: 31 /* Chuyển index của bảng màu sang vị trí tiếp theo, nếu 32 cuối bảng màu thì quay lại màu đầu tiên*/ 33 iC = ( iC+1 ) % ( sizeof ( Col ) / sizeof ( 34 COLORREF ) ); 35 break; 36 case WM_MOUSEMOVE: 37 /* Xuất toạ độ chuột hiện thời lên thanh tiêu đề*/ 38 sprintf ( str,"Toa do chuot x = %d, To do y = %d", 39 LOWORD(lParam), HIWORD(lParam)); 40 SetWindowText ( hWnd, str ); 41 /* Kiểm tra xem có giữ phím chuột trái hay không*/ 42 if ( wParam & MK_LBUTTON ) 43 { 44 hdc = GetDC ( hWnd ); 45 Bài giảng: Lập trình C for Win .............................................................................................Trang 40/69
  5. Bài 3:Các thiết bị nhập liệu Trần Minh Thái pen = CreatePen ( 46 PS_SOLID,WIDTH_PEN,Col [ iC ] ); 47 oPen = ( HPEN ) SelectObject ( hdc, pen ); 48 point.x = LOWORD ( lParam ); 49 point.y = HIWORD ( lParam ); 50 MoveToEx ( hdc, oldPoint.x, oldPoint.y, 51 NULL ); 52 LineTo ( hdc, point.x, point.y ); 53 oldPoint = point; 54 SelectObject ( hdc, oPen ); 55 DeleteObject ( pen ); 56 ReleaseDC ( hWnd, hdc ); 57 } 58 break; 59 case WM_DESTROY: 60 PostQuitMessage ( 0 ); 61 break; 62 default: 63 return DefWindowProc ( hWnd, message, wParam, 64 lParam ); 65 } 66 return 0; 67 } 68 3. Timer a. Khởi tạo UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ); hWnd : Định danh của cửa sổ khai báo dùng bộ định thời gian. nIDEvent : Định danh của bộ định thời gian. nElapse : Là khoảng thời gian nghỉ giữa hai lần gởi thông điệp lpTimerFunc : Hàm sẽ xử lý khi thông điệp WM_TIMER phát sinh, nếu chúng ta khai báo là NULL thì Windows sẽ gởi thông điệp WM_TIMER vào hàng đợi thông điệp của cửa sổ tương ứng. b. Hủy BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ); hWnd : Định danh của cửa sổ dùng bộ định thời gian uIDEvent : Định danh của bộ định thời gian. c. Ví dụ 1 #include 1 Bài giảng: Lập trình C for Win .............................................................................................Trang 41/69
  6. Bài 3:Các thiết bị nhập liệu Trần Minh Thái #include "stdio.h" 2 #define MAX_POINT 10000 3 #define IDT_TIMER1 1 4 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 5 WPARAM wParam, LPARAM lParam) 6 { 7 PAINTSTRUCT ps; 8 HDC hdc; 9 static int NumCir = 0; 10 static POINT point [ MAX_POINT ]; 11 int r = 5, i; 12 HPEN pen, oldPen; 13 RECT rc; 14 TCHAR str [255]; 15 /* Xử lý thông điệp*/ 16 switch ( message ) 17 { 18 case WM_CREATE: 19 SetTimer(hWnd, IDT_TIMER1, 500, 20 (TIMERPROC) NULL); 21 srand ( (unsigned) time( NULL ) ); 22 break; 23 case WM_PAINT: 24 hdc = BeginPaint ( hWnd, &ps ); 25 pen = CreatePen ( PS_SOLID, 2, RGB (255,0,0) ); 26 oldPen = (HPEN) SelectObject ( hdc, pen ); 27 for( i=0; i < NumCir; i++ ) 28 Arc ( hdc, point[i].x-r, point[i].y-r, 29 point[i].x+r, point[i].y+r, point[i].x+r, 30 point[i].y,point[i].x+r,point[i].y); 31 SelectObject ( hdc, oldPen ); 32 DeleteObject ( pen ); 33 EndPaint ( hWnd, &ps ); 34 break; 35 case WM_TIMER: 36 GetClientRect ( hWnd, &rc ); 37 point [NumCir].x = rand( ) % (rc.right - rc.left); 38 point [NumCir].y = rand( ) % (rc.bottom - rc.top); 39 NumCir++; 40 sprintf ( str,"So vong tron : %d", NumCir); 41 SetWindowText ( hWnd, str ); 42 InvalidateRect ( hWnd, &rc, FALSE); 43 break; 44 case WM_DESTROY: 45 KillTimer ( hWnd, IDT_TIMER1 ); 46 PostQuitMessage ( 0 ); 47 Bài giảng: Lập trình C for Win .............................................................................................Trang 42/69
  7. Bài 3:Các thiết bị nhập liệu Trần Minh Thái break; 48 default: 49 return DefWindowProc ( hWnd, message, wParam, 50 lParam ); 51 } 52 return 0; 53 } 54 d. Ví dụ 2 #include 1 #include "stdio.h" 2 #define IDT_TIMER1 1 3 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 4 WPARAM wParam, LPARAM lParam) 5 { 6 PAINTSTRUCT ps; 7 HDC hdc; 8 /* Khai báo biến lưu các giá trị không gian*/ 9 struct tm *newtime; 10 time_t CurTime; 11 TCHAR str [255]; 12 RECT rc; 13 /* Biến LOGFONT để tạo font mới*/ 14 LOGFONT lf; 15 HFONT oldFont, font; 16 COLORREF color = RGB (255, 0, 0), oldColor; 17 switch ( message ) 18 { 19 case WM_CREATE: 20 /* khởi tạo bộ định thời gian, và khai báo hàm xử lý Timer*/ 21 SetTimer ( hWnd, IDT_TIMER1, 1000, ( TIMERPROC ) 22 TimerProc ); 23 break; 24 case WM_PAINT: 25 hdc = BeginPaint ( hWnd, &ps ); 26 time( &CurTime ); 27 newtime = localtime ( &CurTime ); 28 GetClientRect ( hWnd, &rc ); 29 sprintf(str,"Gio hien tai : %d gio: %d phut: %d giay", 30 newtime->tm_hour,newtime->tm_min, newtime- 31 >tm_sec); 32 oldColor = SetTextColor ( hdc, color ); 33 memset ( &lf, 0, sizeof ( LOGFONT ) ); 34 lf.lfHeight = 50; 35 strcpy ( lf.lfFaceName, "Tahoma" ); 36 Bài giảng: Lập trình C for Win .............................................................................................Trang 43/69
  8. Bài 3:Các thiết bị nhập liệu Trần Minh Thái font = CreateFontIndirect ( &lf ); 37 oldFont = ( HFONT ) SelectObject ( hdc,font ); 38 DrawText ( hdc, str, strlen(str), &rc, DT_CENTER | 39 DT_VCENTER | DT_SINGLELINE ); 40 SetTextColor ( hdc,oldColor ); 41 SelectObject ( hdc,oldFont ); 42 DeleteObject ( font ); 43 EndPaint ( hWnd, &ps ); 44 break; 45 case WM_DESTROY: 46 PostQuitMessage ( 0 ); 47 break; 48 default: 49 return DefWindowProc ( hWnd, message, wParam, 50 lParam ); 51 } 52 return 0; 53 } 54 VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, 55 UINT_PTR idEvent, DWORD dwTime) 56 { 57 RECT rc; 58 GetClientRect ( hwnd, &rc ); 59 InvalidateRect ( hwnd, &rc, TRUE ); 60 } 61 Bài giảng: Lập trình C for Win .............................................................................................Trang 44/69
  9. Bài 4: Hộp thọai và điều khiển Trần Minh Thái Bài 4: HỘP THOẠI VÀ ĐIỀU KHIỂN Phân bố thời lượng: - Số tiết giảng ở lớp: 12 tiết - Số tiết tự học ở nhà: 12 tiết - Số tiết cài đặt chương trình ở nhà: 24 tiết 1. Hộp thoại Hộp thoại phối hợp giữa người sử dụng với chương trình bằng một số phần tử điều khiển mà các phần tử này nhận nhiệm vụ thu nhận thông tin từ người dùng và cung cấp thông tin đến người dùng khi người dùng tác động đến các phần tử điều khiển. Các phần tử điều khiển này nhận cửa sổ cha là một hộp thoại. Các phần tử điều khiển thường là các Button, List Box, Combo Box, Check Box, Radio Button, Edit Box, Scroll Bar, Static. Hộp thoại trạng thái (modal). Hộp thoại không trạng thái (modeless). Hộp thoại thông dụng (common dialog) a) Thiết kế hộp thọai Bài giảng: Lập trình C for Win .............................................................................................Trang 45/69
  10. Bài 4: Hộp thọai và điều khiển Trần Minh Thái Ví dụ: IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 196, 102 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Logon" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,24,81,50,14 PUSHBUTTON "Cancel",IDCANCEL,109,81,50,14 LTEXT "User name",IDC_STATIC,7,23,40,15 LTEXT "Password",IDC_STATIC,7,50,40,16 EDITTEXT DC_EDT_NAME,52,19,137,16,ES_AUTOHSCROLL EDITTEXT IDC_EDT_PASSWORD, 52, 48, 137, 16, ES_AUTOHSCROLL END Lớp Kiểu điều khiển Kiểu cửa sổ PUSHBUTTON Button BS_PUSHBUTTON DEFPUSHBUTTON Button BS_DEFBUSHBUTTON | WS_TABSTOP CHECKBOX Button BS_CHECKBOX | WS_TABSTOP RADIOBUTTON Button BS_RADIOBUTTON | WS_TABSTOP GROUPBOX Button BS_GROUPBOX | WS_TABSTOP LTEXT Static SS_LEFT | WS_GROUP CTEXT Static SS_CENTER | WS_GROUP RTEXT Static SS_RIGHT | WS_GROUP ICON Static SS_ICON EDITTEXT Edit ES_LEFT | WS_BORDER | Bài giảng: Lập trình C for Win .............................................................................................Trang 46/69
  11. Bài 4: Hộp thọai và điều khiển Trần Minh Thái WS_STABSTOP SCROLLBAR Scrollbar SBS_HORZ LISTBOX Listbox LBS_NOTIFY | WS_BORDER | WS_VSCROLL COMBOBOX Combobox CBS_SIMPLE | WS_TABSTOP Các kiểu điều khiển Các kiểu điều khiển được khai báo trong resource script có dạng như sau, ngoại trừ kiểu điều khiển LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT. Control-type "text", id, xPos, yPos, xWidth, yHeight, iStyle Các kiểu điều khiển LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT được khai báo trong resource script với cấu trúc như trên nhưng không có trường "text". Thêm thuộc tính cho các kiểu điều khiển bằng cách thay đổi tham số iStyle. Ví dụ ta muốn tạo radio button với chuỗi diễn đạt nằm ở bên trái của nút thì ta gán trường iStyle bằng BS_LEFTTEXT cụ thể như sau. RADIOBUTTON Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT b) Thủ tục xử lý hộp thọai Đặc điểm • Mỗi hộp thọai cần có một thủ tục xử lý riêng. • Các thông điệp không được gửi tới hàm xử lý cửa sổ chính. • Là một hàm xử lý cửa sổ. Mẫu hàm BOOL CALLBACK Tên hàm (HWND, UINT, WPARAM, LPARAM) ; • Có nhiều thông điệp khác nhau. • Không cần xử lý WM_PAINT và WM_DESTROY. • Xử lý thông điệp nào thì trả về TRUE, nếu không trả về FALSE. Bài giảng: Lập trình C for Win .............................................................................................Trang 47/69
  12. Bài 4: Hộp thọai và điều khiển Trần Minh Thái • Thường phải xử lý hai thông điệp chính: WM_INITDIALOG và WM_COMMAND: LOWORD(WPARAM) chứa ID các điều khiển. Ví dụ: LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, 1 LPARAM); 2 BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, 3 LPARAM) ; 4 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 5 WPARAM wParam, LPARAM lParam) 6 { 7 static HINSTANCE hInstance ; 8 switch (message) 9 { 10 case WM_CREATE : 11 hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; 12 return 0 ; 13 case WM_COMMAND : 14 switch (LOWORD (wParam)) 15 { 16 case IDC_SHOW : 17 DialogBox (hInstance, TEXT ("DIALOG1"), 18 hwnd, DialogProc) ; 19 break; 20 } 21 return 0 ; 22 case WM_DESTROY : 23 PostQuitMessage (0) ; 24 return 0 ; 25 } 26 return DefWindowProc (hwnd, message, wParam, lParam) ; 27 } 28 /*----------------------hàm xử lý thông điệp hộp thoại----------------------*/ 29 BOOL CALLBACK DialogProc (HWND hDlg, UINT message, 30 WPARAM wParam, LPARAM lParam) 31 { 32 switch (message) 33 { 34 case WM_INITDIALOG: return TRUE ; 35 case WM_COMMAND: 36 switch (LOWORD (wParam)) 37 { 38 case IDOK : 39 EndDialog (hDlg, 0) ; 40 Bài giảng: Lập trình C for Win .............................................................................................Trang 48/69
  13. Bài 4: Hộp thọai và điều khiển Trần Minh Thái return TRUE ; 41 } 42 break ; 43 } 44 return FALSE ; 45 } 46 c) Hộp thoại trạng thái Hiển thị hộp thoại INT_PTR DialogBox( HINSTANCE hInstance, // handle to module LPCTSTR lpTemplate, // dialog box template HWND hWndParent, // handle to owner window DLGPROC lpDialogFunc // dialog box procedure ); Ví dụ: DialogBox (hInstance, TEXT ("DIALOG1"), hwnd, DialogProc) ; Gởi thông điệp đến hàm WndProc yêu cầu xử lý ngay cả khi hộp thoại đang mở nhờ hàm SendMessage: SendMessage(GetParent(hDlg), message, wParam, lParam); Thêm tiêu đề cho hộp thoại: SetWindowText(hDlg,TEXT("Hello Dialog")); trong xử lý thông điệp WM_INITDIALOG Đóng hộp thoại BOOL EndDialog( HWND hDlg, // handle to dialog box INT_PTR nResult // value to return ); Ví dụ Bài giảng: Lập trình C for Win .............................................................................................Trang 49/69
  14. Bài 4: Hộp thọai và điều khiển Trần Minh Thái LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 1 BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM); 2 int iCurrentColor = IDC_BLACK, iCurrentFigure = IDC_RECT; 3 int iCurrenBrush = IDC_HS_BDIAGONAL; 4 void PaintWindow(HWND hwnd, int iColor, int iFigure, int iBrush) 5 { 6 static COLORREF crColor[8] = { RGB(0, 0, 0), RGB(0, 0, 255), 7 RGB(0, 255, 0), RGB(0, 255, 255), RGB(255, 0, 0), RGB(255, 0, 255), 8 RGB(255, 255, 0), RGB(255, 255, 255) } ; 9 HBRUSH hBrush,hbrush; 10 HDC hdc ; 11 RECT rect ; 12 hdc = GetDC (hwnd) ; 13 GetClientRect (hwnd, &rect) ; 14 if(iBrush==IDC_HS_BDIAGONAL) 15 hbrush=CreateHatchBrush(HS_BDIAGONAL, 16 crColor[iColor-IDC_BLACK]); 17 if(iBrush == IDC_HS_CROSS) 18 hbrush=CreateHatchBrush(HS_CROSS, 19 crColor[iColor - IDC_BLACK]); 20 if(iBrush == IDC_HS_DIAGCROSS) 21 hbrush=CreateHatchBrush(HS_DIAGCROSS, 22 crColor[iColor - IDC_BLACK]); 23 if(iBrush == IDC_HS_FDIAGONAL) 24 hbrush=CreateHatchBrush(HS_FDIAGONAL, 25 crColor[iColor - IDC_BLACK]); 26 if(iBrush == IDC_HS_HORIZONTAL) 27 hbrush=CreateHatchBrush(HS_HORIZONTAL, 28 crColor[iColor - IDC_BLACK]); 29 if(iBrush == IDC_HS_VERTICAL) 30 hbrush=CreateHatchBrush(HS_BDIAGONAL, 31 crColor[iColor - IDC_BLACK]); 32 hBrush = (HBRUSH) SelectObject (hdc, hbrush) ; 33 if (iFigure == IDC_RECT) 34 Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ; 35 else 36 Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom) ; 37 DeleteObject (SelectObject (hdc, hBrush)) ; 38 ReleaseDC (hwnd, hdc) ; 39 } 40 void PaintTheBlock(HWND hCtrl, int iColor, int iFigure, int iBrush) 41 { 42 InvalidateRect (hCtrl, NULL, TRUE) ; 43 UpdateWindow (hCtrl) ; 44 PaintWindow (hCtrl, iColor, iFigure,iBrush) ; 45 } 46 Bài giảng: Lập trình C for Win .............................................................................................Trang 50/69
  15. Bài 4: Hộp thọai và điều khiển Trần Minh Thái LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM 47 wParam, LPARAM lParam) 48 { 49 static HINSTANCE hInstance ; 50 PAINTSTRUCT ps ; 51 switch (message) 52 { 53 case WM_CREATE: 54 hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; 55 return 0 ; 56 case WM_COMMAND: 57 switch (LOWORD (wParam)) 58 { 59 case IDC_SHOW: 60 if (DialogBox (hInstance, TEXT ("DIALOG"), 61 hwnd, DialogProc)) 62 InvalidateRect (hwnd, NULL, TRUE) ; 63 return 0 ; 64 } 65 break; 66 case WM_PAINT: 67 BeginPaint (hwnd, &ps) ; 68 EndPaint (hwnd, &ps) ; 69 PaintWindow (hwnd, iCurrentColor, iCurrentFigure, 70 iCurrenBrush) ; 71 return 0 ; 72 case WM_DESTROY: 73 PostQuitMessage (0) ; 74 return 0 ; 75 } 76 return DefWindowProc (hwnd, message, wParam, lParam) ; 77 } 78 BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM 79 wParam, LPARAM lParam) 80 { 81 static HWND hCtrlBlock ; 82 static int iColor, iFigure,iBrush; 83 switch (message) 84 { 85 case WM_INITDIALOG: 86 iColor = iCurrentColor ; 87 iFigure = iCurrentFigure ; 88 iBrush = iCurrenBrush; 89 CheckRadioButton(hDlg,IDC_BLACK,IDC_WHITE, 90 iColor); 91 Bài giảng: Lập trình C for Win .............................................................................................Trang 51/69
  16. Bài 4: Hộp thọai và điều khiển Trần Minh Thái CheckRadioButton(hDlg,IDC_RECT,IDC_ELLIPSE,iFig 92 ure);CheckRadioButton (hDlg, IDC_HS_BDIAGONAL, 93 IDC_HS_VERTICAL, iBrush); 94 hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ; 95 SetFocus (GetDlgItem (hDlg, iColor)) ; 96 return FALSE ; 97 case WM_COMMAND: 98 switch (LOWORD (wParam)) 99 { 100 case IDOK: 101 iCurrentColor = iColor ; 102 iCurrentFigure = iFigure ; 103 iCurrenBrush = iBrush; 104 EndDialog (hDlg, TRUE) ; 105 return TRUE ; 106 case IDCANCEL: 107 EndDialog (hDlg, FALSE) ; 108 return TRUE ; 109 case IDC_BLACK: 110 case IDC_RED: 111 case IDC_GREEN: 112 case IDC_YELLOW: 113 case IDC_BLUE: 114 case IDC_MAGENTA: 115 case IDC_CYAN: 116 case IDC_WHITE: 117 iColor = LOWORD (wParam) ; 118 CheckRadioButton (hDlg, IDC_BLACK, 119 IDC_WHITE, LOWORD (wParam)) ; 120 PaintTheBlock (hCtrlBlock, iColor, 121 iFigure,iBrush); 122 return TRUE ; 123 case IDC_RECT: 124 case IDC_ELLIPSE: 125 iFigure = LOWORD (wParam) ; 126 CheckRadioButton (hDlg, IDC_RECT, 127 IDC_ELLIPSE, LOWORD (wParam)) ; 128 PaintTheBlock (hCtrlBlock, iColor, 129 iFigure,iBrush); 130 return TRUE ; 131 case IDC_HS_BDIAGONAL: 132 case IDC_HS_CROSS: 133 case IDC_HS_DIAGCROSS: 134 case IDC_HS_FDIAGONAL: 135 case IDC_HS_HORIZONTAL: 136 case IDC_HS_VERTICAL: 137 Bài giảng: Lập trình C for Win .............................................................................................Trang 52/69
  17. Bài 4: Hộp thọai và điều khiển Trần Minh Thái iBrush = LOWORD (wParam) 138 CheckRadioButton(hDlg,IDC_HS_BDIAGONAL, 139 IDC_HS_VERTICAL, LOWORD (wParam)) ; 140 PaintTheBlock (hCtrlBlock, iColor, 141 iFigure,iBrush); 142 return TRUE ; 143 } 144 break; 145 case WM_PAINT: 146 PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ; 147 break ; 148 } 149 return FALSE ; 150 } 151 d) Hộp thoại không trạng thái Hiển thị hộp thoại HWND hDlgModeless=CreateDialog(hInstance, szTemplate, hwndParent, DialogProc); ShowWindow(hDlgModeless,SW_SHOW); while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless==0 || !IsDialogMessage (hDlgModeless, &msg); { TranslateMessage(&msg); DispatchMessage(&msg); } } while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless==0 || !IsDialogMessage(hDlgModeless, &msg); { if(TranslateAccelerator (hwnd, hAccel, &msg) { TranslateMessage(&msg); DispatchMessage(&msg); } } } Đóng hộp thoại Đặt hDlgModeless về giá trị 0. Bài giảng: Lập trình C for Win .............................................................................................Trang 53/69
  18. Bài 4: Hộp thọai và điều khiển Trần Minh Thái BOOL DestroyWindow( HWND hWnd // handle to window to destroy ); Ví dụ void PaintWindow (HWND hwnd, int iColor[], int iFigure) 1 { 2 HBRUSH hBrush ; 3 HDC hdc ; 4 RECT rect ; 5 hdc = GetDC(hwnd) ; 6 GetClientRect (hwnd, &rect) ; 7 hBrush = CreateSolidBrush(RGB(iColor[0], iColor[1], 8 iColor[2])); 9 hBrush = (HBRUSH) SelectObject (hdc, hBrush) ; 10 if (iFigure == IDC_RECT) 11 Rectangle (hdc, rect.left, rect.top, rect.right, 12 rect.bottom) ; 13 else 14 Ellipse(hdc, rect.left, rect.top, rect.right, 15 rect.bottom) ; 16 DeleteObject (SelectObject (hdc, hBrush)) ; 17 ReleaseDC (hwnd, hdc) ; 18 } 19 LRESULT CALLBACK WndProc (HWND hwnd, UINT 20 message, WPARAM wParam, LPARAM lParam) 21 { 22 switch (message) 23 { 24 case WM_PAINT: 25 PaintTheBlock(hwnd, iColor, iFigure) ; 26 return 0 ; 27 case WM_DESTROY : 28 Bài giảng: Lập trình C for Win .............................................................................................Trang 54/69
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2