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

Giáo trình lập trình C cho winform - 6

Chia sẻ: Cao Thi Nhu Kieu | Ngày: | Loại File: PDF | Số trang:10

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

Bài 4: Hộp thọai và điều khiển Thông điệp Nguyên nhân phát sinh Thông điệp này cùng được gởi đến các cửa sổ bị kích hoạt và cửa sổ không bị kích. Đị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ủ đề:
Lưu

Nội dung Text: Giáo trình lập trình C cho winform - 6

  1. 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
  2. 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
  3. 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
  4. 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
  5. Bài 4: Hộp thọai và điều khiển Trần Minh Thái DeleteObject((HGDIOBJ)SetClassLong(hw 29 nd, GCL_HBRBACKGROUND,(LONG) 30 GetStockObject (WHITE_BRUSH))) ; 31 PostQuitMessage (0) ; 32 return 0 ; 33 } 34 return DefWindowProc (hwnd, message, wParam, 35 lParam); 36 } 37 void PaintTheBlock (HWND hCtrl, int iColor[], int iFigure) 38 { 39 InvalidateRect (hCtrl, NULL, TRUE); 40 UpdateWindow (hCtrl) ; 41 PaintWindow (hCtrl, iColor, iFigure) ; 42 } 43 BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT 44 message, WPARAM wParam, LPARAM lParam) 45 { 46 HWND hwndParent, hCtrl ; 47 static HWND hCtrlBlock ; 48 int iCtrlID, iIndex ; 49 switch (message) 50 { 51 case WM_INITDIALOG : 52 hCtrlBlock = GetDlgItem (hDlg, 53 IDC_PAINT) ; 54 for (iCtrlID = 10 ; iCtrlID < 13 ; iCtrlID++) 55 { 56 hCtrl = GetDlgItem (hDlg, iCtrlID) ; 57 PaintTheBlock (hCtrlBlock, iColor, 58 iFigure) ; 59 PaintTheBlock (hwndParent, iColor, 60 iFigure) ; 61 SetScrollRange (hCtrl, SB_CTL, 0, 62 255, FALSE) ; 63 SetScrollPos(hCtrl, SB_CTL, 0, 64 FALSE) ; 65 } 66 return TRUE ; 67 case WM_COMMAND: 68 { 69 switch( LOWORD(wParam)) 70 { 71 case IDC_RECT: 72 case IDC_ELLIPSE: 73 iFigure = LOWORD(wParam); 74 Bài giảng: Lập trình C for Win .............................................................................................Trang 55/69
  6. Bài 4: Hộp thọai và điều khiển Trần Minh Thái hwndParent = 75 GetParent(hDlg); 76 CheckRadioButton(hDlg, 77 IDC_RECT, IDC_ELLIPSE, 78 LOWORD (wParam)) ; 79 PaintTheBlock(hCtrlBlock, 80 iColor, iFigure) ; 81 PaintTheBlock (hwndParent, 82 iColor, iFigure) ; 83 return TRUE ; 84 } 85 break; 86 } 87 case WM_VSCROLL : 88 hCtrl = (HWND) lParam ; 89 iCtrlID = GetWindowLong (hCtrl, 90 GWL_ID) ; 91 iIndex = iCtrlID - 10 ; 92 hwndParent = GetParent (hDlg) ; 93 PaintTheBlock (hCtrlBlock, iColor, iFigure); 94 PaintTheBlock (hwndParent, iColor, 95 iFigure) ; 96 switch (LOWORD (wParam)) 97 { 98 case SB_PAGEDOWN : 99 iColor[iIndex] += 15 ; 100 case SB_LINEDOWN : 101 iColor[iIndex] = min (255, 102 iColor[iIndex] + 1) ; 103 break; 104 case SB_PAGEUP : 105 iColor[iIndex] -= 15 ; 106 case SB_LINEUP : 107 iColor[iIndex] = max (0, 108 iColor[iIndex] - 1); 109 break; 110 case SB_TOP : 111 iColor[iIndex] = 0 ; 112 break; 113 case SB_BOTTOM : 114 iColor[iIndex] = 255 ; 115 break; 116 case SB_THUMBPOSITION : 117 case SB_THUMBTRACK : 118 iColor[iIndex] = HIWORD 119 (wParam) ; 120 Bài giảng: Lập trình C for Win .............................................................................................Trang 56/69
  7. Bài 4: Hộp thọai và điều khiển Trần Minh Thái break; 121 default : 122 return FALSE ; 123 } 124 SetScrollPos(hCtrl, SB_CTL, iColor[iIndex], 125 TRUE) ; 126 SetDlgItemInt (hDlg, iCtrlID + 3, iColor[iIndex], 127 FALSE) ; 128 InvalidateRect(hwndParent,NULL,TRUE); 129 DeleteObject ( (HGDIOBJ)SetClassLong( 130 hwndParent, GCL_HBRBACKGROUND, (LONG) 131 CreateSolidBrush( RGB(iColor[0], iColor[1], 132 iColor[2]) ) ) ) ; 133 return TRUE ; 134 case WM_PAINT: 135 PaintTheBlock(hCtrlBlock, iColor, iFigure) ; 136 break; 137 } 138 return FALSE ; 139 2. Menu a) Tạo Menu MENUDEMO MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New", IDM_FILE_NEW MENUITEM "&Open", IDM_FILE_OPEN MENUITEM "&Save", IDM_FILE_SAVE MENUITEM "Save &As...", IDM_FILE_SAVE_AS MENUITEM SEPARATOR MENUITEM "E&xit", IDM_APP_EXIT END POPUP "&Edit" BEGIN MENUITEM "&Undo", IDM_EDIT_UNDO MENUITEM SEPARATOR MENUITEM "C&ut", IDM_EDIT_CUT MENUITEM "&Copy", IDM_EDIT_COPY MENUITEM "&Paste", IDM_EDIT_PASTE MENUITEM "De&lete", IDM_EDIT_CLEAR END POPUP "&Background" BEGIN Bài giảng: Lập trình C for Win .............................................................................................Trang 57/69
  8. Bài 4: Hộp thọai và điều khiển Trần Minh Thái MENUITEM "&White", IDM_BKGND_WHITE, CHECKED MENUITEM "&Light Gray", IDM_BKGND_LTGRAY MENUITEM "&Gray", IDM_BKGND_GRAY MENUITEM "&Dark Gray", IDM_BKGND_DKGRAY MENUITEM "&Black", IDM_BKGND_BLACK END POPUP "&Help" BEGIN MENUITEM "&Help...", IDM_APP_HELP MENUITEM "&About ...", IDM_APP_ABOUT END END b) Thiết lập Menu wndclass.lpszMenuName = "MENU1"; hoặc: hMenu = LoadMenu ( hInstance, TEXT("MENU1") ); hwnd = CreateWindow ( TEXT("MyClass"), TEXT("Window Caption"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, NULL ); SetMenu(hWnd, hMenu); LOWORD(WPARAM) chứa ID các điều khiển. c) Ví dụ LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, 1 LPARAM); 2 /* Khai báo tên dùng chung cho cáctài nguyên trong chương trình.*/ 3 TCHAR szAppName[] = TEXT ("MenuDemo") ; 4 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE 5 hPrevInstance, PSTR szCmdLine, int iCmdShow) 6 { 7 HWND hwnd; 8 MSG msg; 9 WNDCLASS wndclass; 10 wndclass.style = CS_HREDRAW | CS_VREDRAW; 11 wndclass.lpfnWndProc = WndProc ; 12 wndclass.cbClsExtra = 0 ; 13 wndclass.cbWndExtra = 0 ; 14 wndclass.hInstance = hInstance ; 15 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 16 Bài giảng: Lập trình C for Win .............................................................................................Trang 58/69
  9. Bài 4: Hộp thọai và điều khiển Trần Minh Thái wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); 17 wndclass.hbrBackground = 18 (HBRUSH)GetStockObject(WHITE_BRUSH) ; 19 wndclass.lpszMenuName = szAppName ; 20 wndclass.lpszClassName = szAppName ; 21 if (!RegisterClass (&wndclass)) 22 { 23 MessageBox(NULL, TEXT("This program requires 24 Windows "), szAppName, MB_ICONERROR) ; 25 return 0 ; 26 } 27 hwnd = CreateWindow (szAppName, TEXT("Menu 28 Demonstration"), WS_OVERLAPPEDWINDOW, 29 CW_USEDEFAULT, CW_USEDEFAULT, 30 CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, 31 hInstance, NULL) ; 32 ShowWindow (hwnd, iCmdShow) ; 33 UpdateWindow (hwnd) ; 34 while (GetMessage(&msg, NULL, 0, 0)) 35 { 36 TranslateMessage (&msg) ; 37 DispatchMessage (&msg) ; 38 } 39 return msg.wParam ; 40 } 41 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 42 WPARAM wParam, LPARAM lParam) 43 { 44 /* Khao báo danh sách các màu chỗi tô, các hằng này được định 45 nghĩa trong file WINGDI.H */ 46 static int idColor[5] = { WHITE_BRUSH, LTGRAY_BRUSH, 47 GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH } ; 48 static int iSelection = IDM_BKGND_WHITE ; 49 HMENU hMenu ; 50 switch (message) 51 { 52 case WM_COMMAND: 53 hMenu = GetMenu (hwnd) ; // Lấy định danh của menu 54 switch (LOWORD (wParam)) //Kiểm tra định danh mục chọn 55 { 56 case IDM_FILE_NEW: 57 case IDM_FILE_OPEN: 58 case IDM_FILE_SAVE: 59 case IDM_FILE_SAVE_AS: 60 MessageBeep(0) ; //Phát ra tiếng kêu bíp 61 return 0 ; 62 Bài giảng: Lập trình C for Win .............................................................................................Trang 59/69
  10. Bài 4: Hộp thọai và điều khiển Trần Minh Thái case IDM_APP_EXIT: 63 /*Gởi thông điệp để đóng ứng dụng lại*/ 64 SendMessage (hwnd, WM_CLOSE, 0, 0) ; 65 return 0 ; 66 case IDM_EDIT_UNDO: 67 case IDM_EDIT_CUT: 68 case IDM_EDIT_COPY: 69 case IDM_EDIT_PASTE: 70 case IDM_EDIT_CLEAR: 71 MessageBeep (0) ; 72 return 0 ; 73 case IDM_BKGND_WHITE: 74 case IDM_BKGND_LTGRAY: 75 case IDM_BKGND_GRAY: 76 case IDM_BKGND_DKGRAY: 77 case IDM_BKGND_BLACK: 78 /* Bỏ check của mục chọn trước đó*/ 79 CheckMenuItem(hMenu,iSelection, 80 MF_UNCHECKED); 81 iSelection = LOWORD (wParam) ; /*Lấy ID 82 mục mới*/ 83 /* Check mục chọn mới*/ 84 CheckMenuItem (hMenu, iSelection, 85 MF_CHECKED) ; 86 /* Thiết lập màu tương ứng với mục chọn 87 mới*/ 88 SetClassLong(hwnd,GCL_HBRBACKGRO 89 UND, (LONG) 90 GetStockObject(idColor[iSelection- 91 IDM_BKGND_WHITE])); 92 InvalidateRect (hwnd, NULL, TRUE) ; 93 return 0 ; 94 case IDM_APP_HELP: 95 MessageBox(hwnd, TEXT("Help not yet 96 implemented!"), szAppName, 97 MB_ICONEXCLAMATION | MB_OK) ; 98 return 0 ; 99 case IDM_APP_ABOUT: 100 MessageBox (hwnd, TEXT ("Menu 101 Demonstration Program\n (c) Charles 102 Petzold, 1998"), szAppName, 103 MB_ICONINFORMATION | MB_OK) ; 104 return 0 ; 105 } 106 break; 107 case WM_DESTROY: 108 Bài giảng: Lập trình C for Win .............................................................................................Trang 60/69
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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