Lập trình C trên Windows: Kỹ thuật lập trình Visual C++ (MFC) - Nguyễn Tri Tuấn
Tóm tắt Lập trình C trên Windows: Kỹ thuật lập trình Visual C++ (MFC) - Nguyễn Tri Tuấn: ... ON_WM_PAINT () END_MESSAGE_MAP () ON_WM_PAINT là 1 macro được định nghĩa trong Afxmsg_.h, mặc nhiên liên kết message WM_PAINT với hàm OnPaint Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 24 Ứng dụng đơn giản – Các thành phần của c.trình(tt) Xử lý thêm message ...KeyUp wParam: virtual-key code lParam: chứa các thông tin khác (số lần lặp lại phím, scan code, extended key,) WM_CHAR: là kết quả phát sinh do message WM_KEYDOWN, báo hiệu 1 ký tự in được (printed character) đã được tạo ra Hàm xử lý tương ứng: CWnd::OnChar wParam: mã ký tự l...MMAND (ID_DRAW_RECTANGLE, OnDraw) // Hàm xử lý chung, xác định item hiện hành void CMainFrame::OnDraw () { m_nCurrentDraw = (UINT) LOWORD(GetCurrentMessage()->wParam); } 26 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 51 Xử lý menu - Xử lý khi menu item được chọ...
tonDown(UINT nFlags, CPoint point) { MessageBox("Left button clicked !", "Mouse", MB_OK); } 13 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 25 Ứng dụng đơn giản – Các thành phần của c.trình(tt) Xử lý thêm message WM_MOUSELEAVE Bổ sung thêm 1 hàm thành phần vào khai báo của lớp CMainWindow: afx_msg LRESULT OnMouseLeave(); Bổ sung thêm 1 macro vào khai báo Message Map: ON_MESSAGE (WM_MOUSELEAVE, OnMouseLeave) Định nghĩa hàm thành phần OnLButtonDown: LRESULT CMainWindow::OnMouseLeave() { MessageBox("Mouse leaved !", "Mouse", MB_OK); return 0; } Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 26 Chương trình MFC đầu tiên – Dialog-based App Tạo ứng dụng bằng cách sử dụng MFC AppWizard Các thành phần của chương trình 14 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 27 Dialog-based App - Tạo ứng dụng bằng MFC AppWizard Chọn menu File Æ New Chọn tab Projects Chọn loại project “MFC AppWizard (exe)” Đặt tên project và xác định đường dẫn thư mục trong ô “Location” Step 1: Chọn loại ứng dụng “Dialog-based” Step 2: Chỉ chọn option “3D controls”. Gõ tiêu đề của ứng dụng vào ô “Enter a title” Step 3: chọn theo chế độ mặc định Nhấn Finish để kết thúc Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 28 Dialog-based App - Tạo ứng dụng bằng MFC AppWizard(tt) Ứng dụng MFC (Dialog-based) 15 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 29 Dialog-based App - Các thành phần của chương trình Các file chương trình: (xxx là tên project) xxx.h: header file của file xxx.cpp, chứa khai báo lớp CxxxApp để quản lý toàn bộ ứng dụng. Lớp CxxxApp kế thừa từ lớp CWinApp của MFC xxxDlg.h: header file của file xxxDlg.cpp, chứa khai báo lớp CxxxDlg để quản lý cửa sổ Dialog giao diện của ứng dụng. Lớp CxxxDlg kế thừa từ lớp CDialog của MFC Resource.h: header file, chứa các hằng ID của các resource được định nghĩa trong file xxx.rc xxxDlg.cpp: cài đặt các hàm thành phần của lớp CxxxDlg xxx.cpp: cài đặt các hàm thành phần của lớp CxxxApp xxx.rc: mô tả các resource (tài nguyên) của ứng dụng Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 30 Dialog- based App - Các thành phần của chương trình(tt) Lớp CxxxDlg: Trong ứng dụng Dialog-based, cửa sổ giao diện chính là 1 Dialog, nên ứng dụng dùng lớp CxxxDlg thay vì lớp CMainWindow class CxxxDlg : public CDialog { public: CxxxDlg(CWnd* pParent = NULL); enum { IDD = IDD_xxx_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); protected: HICON m_hIcon; virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() }; 16 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 31 Xử lý Mouse và Keyboard Xử lý mouse Thông điệp của mouse Ví dụ: Vẽ hình bằng mouse Xử lý keyboard Thông điệp của keyboard Ví dụ: Xử lý phím nhấn Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 32 Xử lý Mouse Thông điệp của mouse WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MOUSEMOVE WM_MOUSEWHEEL 17 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 33 Xử lý Mouse(tt) Thông điệp của mouse (tt) Với mỗi thông điệp của mouse, Windows gởi kèm 2 tham số wParam và lParam wParam: cho biết phím nào đang được nhấn (Ctrl, Shift) lParam: cho biết toạ độ hiện tại LOWORD(lParam): tọa độ x HIWORD(lParam): tọa độ y Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 34 Xử lý Mouse(tt) Ví dụ: Vẽ hình bằng mouse Mô tả: khi user nhấn giữ nút trái chuột & di chuyển Æ vẽ 1 đường thẳng Các xử lý cần thiết: WM_LBUTTONDOWN Ù OnLButtonDown WM_MOUSEMOVE Ù OnMouseMove Các bước thực hiện: Định nghĩa 2 biến m_PrevX, m_PrevY trong class CxxxDlg Định nghĩa hàm xử lý message WM_LBUTTONDOWN trong class CxxxDlg Định nghĩa hàm xử lý message WM_MOUSEMOVE trong class CxxxDlg 18 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 35 Xử lý Mouse(tt) Vẽ hình bằng mouse(tt) void CxxxDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here // and/or call default m_PrevX = point.x; m_PrevY = point.y; CDialog::OnLButtonDown(nFlags, point); } Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 36 Xử lý Mouse(tt) Vẽ hình bằng mouse(tt) void CxxxDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { // Get the Device Context CClientDC dc(this); // Draw a line from the prev point to current point dc.MoveTo(m_StartX, m_StartY); dc.LineTo(point.x, point.y); // Save the current point as the previous point m_PrevX = point.x; m_PrevY = point.y; } CDialog::OnMouseMove(nFlags, point); } 19 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 37 Xử lý keyboard Thông điệp của keyboard WM_KEYDOWN / WM_KEYUP: phát sinh khi 1 phím (không phải là phím hệ thống) được nhấn xuống/thả ra Hàm xử lý tương ứng: CWnd::OnKeyDown, CWnd::OnKeyUp wParam: virtual-key code lParam: chứa các thông tin khác (số lần lặp lại phím, scan code, extended key,) WM_CHAR: là kết quả phát sinh do message WM_KEYDOWN, báo hiệu 1 ký tự in được (printed character) đã được tạo ra Hàm xử lý tương ứng: CWnd::OnChar wParam: mã ký tự lParam: chứa các thông tin khác (số lần lặp lại do nhấn giữ phím, có phím Alt nhấn kèm,) Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 38 Xử lý keyboard(tt) Ví dụ: Xử lý phím nhấn Mô tả: khi user nhấn một phím Æ hiển thị 1 MessageBox thông báo Các xử lý cần thiết WM_KEYDOWN Ù OnKeyDown Các bước thực hiện Định nghĩa hàm xử lý message WM_KEYDOWN trong class CxxxDlg 20 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 39 Xử lý menu Một vài khái niệm Tạo lập menu Load và hiển thị menu Xử lý khi menu item được chọn Thay đổi trạng thái menu Ví dụ Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 40 Xử lý menu - Một vài khái niệm Menu bar: thanh menu. Bao gồm nhiều drop-down menu và menu item Drop-down menu: một phần của menu bar, chứa các menu item hoặc các drop-down menu khác. VD. File, Edit, Menu item: tương ứng với 1 lệnh của chương trình. Mỗi menu item được xác định bằng 1 số nguyên phân biệt, gọi là item ID hay command ID. VD. Open, Save, Popup menu: giống như drop-down menu, nhưng có thể xuất hiện ở vị trí bất kỳ trên màn hình (thường khi nhấn nút phải mouse) System menu: chứa các lệnh hệ thống điều khiển cửa sổ. VD. Minimize, Maximize, Close, 21 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 41 Xử lý menu - Tạo lập menu Thường có 2 cách chính để tạo menu: Tạo menu ở dạng resource của ứng dụng, và load vào khi chạy Tạo trực tiếp bằng các hàm khi ứng dụng đang chạy. Lớp sử dụng để quản lý menu: CMenu Các hàm thành phần: CreateMenu, InsertMenu, Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 42 Xử lý menu - Tạo lập menu(tt) xxx.rc IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New\tCtrl+N", ID_FILE_NEW MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN MENUITEM SEPARATOR MENUITEM "E&xit", ID_APP_EXIT END POPUP "&Edit" BEGIN MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO MENUITEM SEPARATOR MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE END END 22 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 43 Xử lý menu - Load và hiển thị menu Xác định menu bar khi tạo cửa sổ: Create(NULL, _T("My Application"), WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME)); Thay đổi menu bar: CMenu menu; menu.LoadMenu(IDR_MAINFRAME); SetMenu(&menu); menu.Detach(); Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 44 Xử lý menu - Load và hiển thị menu(tt) MAKEINTRESOURCE: macro dùng để chuyển đổi 1 số nguyên (resource ID) thành dạng LPSTR CMenu::LoadMenu: load 1 resource menu bar và gán vào đối tượng CMenu CWnd::SetMenu: gán menu bar cho 1 cửa sổ CMenu::Detach: gỡ bỏ menu bar ra khỏi đối tượng CMenu, để menu bar không bị huỷ bỏ cùng với đối tượng CMenu khi ra khỏi phạm vi khai báo 23 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 45 Xử lý menu - Xử lý khi menu item được chọn Các thông điệp của menu Xử lý lệnh của menu item Nhóm lệnh (Command range) Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 46 Xử lý menu - Xử lý khi menu item được chọn(tt) Các thông điệp của menu: WM_MENUSELECT: phát sinh khi user tác động lên menu. Thông điệp này có thể dùng để cập nhật trạng thái của menu (trường hợp menu thay đổi theo ngữ cảnh – Context-sensitive Menu) Hàm xử lý tương ứng: CWnd::OnMenuSelect wParam: LOWORD(wParam): ID của menu item hoặc index của menu popup HIWORD(wParam): các thông tin khác (trạng thái menu, loại menu, ) lParam: handle của menu 24 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 47 Xử lý menu - Xử lý khi menu item được chọn(tt) Các thông điệp của menu: (tt) WM_COMMAND: phát sinh khi user chọn 1 menu item Hàm xử lý tương ứng: CWnd::OnCommand wParam: LOWORD(wParam): ID của menu item hoặc của control HIWORD(wParam): nguồn gốc phát sinh, 1 nếu sinh ra do 1 phím tắt; 0 nếu chọn trực tiếp từ menu lParam: NULL nếu message này phát sinh từ menu Nếu message phát sinh từ 1 control, lParam sẽ chứa handle của control đó Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 48 Xử lý menu - Xử lý khi menu item được chọn(tt) Xử lý lệnh của menu item Dựa trên message WM_COMMAND Định nghĩa message map ON_COMMAND (ID_FILE_OPEN, OnMyFileOpen) ON_COMMAND (ID_FILE_EXIT, OnMyFileExit) Viết hàm thành phần xử lý cho menu item tương ứng void CMainFrame::OnMyFileOpen () { // Thực hiện thao tác mở file } void CMainFrame::OnMyFileExit () { PostMessage (WM_CLOSE, 0, 0); } 25 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 49 Xử lý menu - Xử lý khi menu item được chọn(tt) Nhóm lệnh (Command range) Là 1 nhóm menu item hoạt động theo nguyên tắc “Chỉ có 1 phần tử được chọn tại 1 thời điểm” VD. Chức năng vẽ hình “Line / Circle / Rectangle” Cách thức xử lý ? Cách 1: map tất cả xử lý của các menu item này vào chung 1 hàm xử lý Cách 2: dùng macro ON_COMMAND_RANGE Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 50 Xử lý menu - Xử lý khi menu item được chọn(tt) Nhóm lệnh (Command range) (tt) Cách 1: map tất cả xử lý của các menu item này vào chung 1 hàm xử lý // Định nghĩa Message map ON_COMMAND (ID_DRAW_LINE, OnDraw) ON_COMMAND (ID_DRAW_CIRCLE, OnDraw) ON_COMMAND (ID_DRAW_RECTANGLE, OnDraw) // Hàm xử lý chung, xác định item hiện hành void CMainFrame::OnDraw () { m_nCurrentDraw = (UINT) LOWORD(GetCurrentMessage()->wParam); } 26 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 51 Xử lý menu - Xử lý khi menu item được chọn(tt) Nhóm lệnh (Command range) (tt) Cách 2: dùng macro ON_COMMAND_RANGE // Định nghĩa Message map ON_COMMAND_RANGE (ID_DRAW_LINE, ID_DRAW_RECTANGLE, OnDraw) // Hàm xử lý chung, xác định item hiện hành void CMainFrame::OnDraw (UINT nID) { m_nCurrentDraw = nID; } Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 52 Xử lý menu - Thay đổi trạng thái menu Các ví dụ: Khi user chọn chức năng vẽ Circle Æ cần thể hiện 1 dấu check (;) phía trước Chức năng Cut/Copy/Delete chỉ được kích hoạt khi user đánh dấu chọn 1 đoạn text Chức năng Paste chỉ được kích hoạt khi clipboard khác rỗng ... Cách xử lý void CMainFrame::OnDraw(UINT nID) { CMenu* pMenu = GetMenu(); pMenu->CheckMenuItem(m_nCurrentDraw,MF_UNCHECKED); m_nCurrentDraw = nID; pMenu->CheckMenuItem(m_nCurrentDraw, MF_CHECKED); } 27 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 53 Xử lý menu – Ví dụ Tạo 1 ứng dụng SDI Chọn menu File Æ New Chọn tab Projects Chọn loại project “MFC AppWizard (exe)” Đặt tên project và xác định đường dẫn thư mục trong ô “Location” Step 1: Chọn loại ứng dụng “Single Document”, bỏ option “Document/View architecture support” Nhấn Finish để kết thúc Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 54 Xử lý menu – Ví dụ(tt) 28 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 55 Xử lý menu – Ví dụ(tt) Xử lý lệnh của menu item Vẽ thêm vào menu popup File các item: New, Open, Save Định nghĩa Message Map cho các hàm xử lý item ON_COMMAND(ID_FILE_NEW, OnFileNew) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_FILE_SAVE, OnFileSave) Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 56 Xử lý menu – Ví dụ(tt) Xử lý lệnh của menu item (tt) Viết xử lý lệnh cho từng item void CMainFrame::OnFileNew() { // TODO: Add your command handler code here MessageBox("Ban vua chon item New", “File"); } void CMainFrame::OnFileOpen() { // TODO: Add your command handler code here MessageBox("Ban vua chon item Open", “File"); } void CMainFrame::OnFileSave() { // TODO: Add your command handler code here MessageBox("Ban vua chon item Save", “File"); } 29 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 57 Xử lý menu – Ví dụ(tt) Xử lý chọn nhóm lệnh Vẽ thêm menu popup Draw với các item: Line, Circle, Rectangle Định nghĩa message map ON_COMMAND_RANGE (ID_DRAW_LINE, ID_DRAW_RECTANGLE, OnDraw) Viết hàm xử lý void CMainFrame::OnDraw(UINT nID) { CMenu* pMenu = GetMenu(); pMenu->CheckMenuItem(m_nCurrentDraw, MF_UNCHECKED); m_nCurrentDraw = nID; pMenu->CheckMenuItem(m_nCurrentDraw, MF_CHECKED); } Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 58 Toolbar Tạo một ứng dụng có Toolbar bằng AppWizard Tạo Toolbar bằng lớp CToolBar 30 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 59 Toolbar - Tạo một ứng dụng bằng AppWizard Tạo một ứng dụng có Toolbar bằng AppWizard Chọn menu File Æ New Chọn tab Projects Chọn loại project “MFC AppWizard (exe)” Đặt tên project và xác định đường dẫn thư mục trong ô “Location” Step 1: Chọn loại ứng dụng “Single Document”, bỏ option “Document/View architecture support” Nhấn Finish để kết thúc Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 60 Toolbar - Tạo một ứng dụng bằng AppWizard(tt) Chọn option này để AppWizard tự động tạo ra một Docking Toolbar 31 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 61 Toolbar - Tạo một ứng dụng bằng AppWizard(tt) Các xử lý trong hàm OnCreate của lớp CMainFrame if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } // Xác định thuộc tính Docking m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 62 Toolbar - Tạo Toolbar bằng lớp CToolBar Tạo lập và hiển thị Ẩn/hiện thanh ToolBar Thêm các ToolTip và FlyBy text 32 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 63 Toolbar - Tạo Toolbar bằng lớp CToolBar(tt) Tạo lập và hiển thị: Bước 1: thiết kế DrawToolBar bằng RC editor, bao gồm các chức năng: Line, Circle, Rectangle, có ID là IDR_DRAWTOOLBAR Bước 2: trong class CMainFrame, định nghĩa biến quản lý DrawToolBar // class CMainFrame CToolBar m_wndDrawToolBar; Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 64 Toolbar - Tạo Toolbar bằng lớp CToolBar(tt) Bước 3: trong hàm OnCreate của lớp CMainFrame, viết lệnh tạo lập DrawToolBar // Trong hàm CMainFrame::OnCreate if (!m_wndDrawToolBar.Create(this) || !m_wndDrawToolBar.LoadToolBar(IDR_DRAWTOOLBAR)) { TRACE0(“Khong the tao duoc DrawToolBat\n"); return -1; } // Xác định tính chất của ToolBar m_wndDrawToolBar.SetBarStyle( m_wndDrawToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); // Xác định tính chất Docking m_wndDrawToolBar.EnableDocking(CBRS_ALIGN_ANY); // Docking toolbar DockControlBar(&m_wndDrawToolBar); 33 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 65 Toolbar - Tạo Toolbar bằng lớp CToolBar(tt) Ẩn/hiện thanh ToolBar Cách thực hiện: Thêm 1 menu item mới vào menu popup View, với ID là ID_VIEW_DRAWTOOLBAR Viết hàm xử lý cho menu item này void CMainFrame::OnViewDrawtoolbar() { // TODO: Add your command handler code here BOOL bVisible = m_wndDrawToolBar.GetStyle() & WS_VISIBLE; ShowControlBar(&m_wndDrawToolBar, !bVisible, FALSE); CMenu* pMenu = GetMenu(); pMenu->CheckMenuItem(ID_VIEW_DRAWTOOLBAR, (!bVisible==1) ? MF_CHECKED : MF_UNCHECKED); } Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 66 Toolbar - Tạo Toolbar bằng lớp CToolBar(tt) Thêm các ToolTip và FlyBy text ToolTip là 1 cửa sổ nhỏ chứa câu giải thích ngắn về công dụng của 1 button trên ToolBar FlyBy text là 1 câu thông báo được hiển thị trên StatusBar khi user di chuyển mouse đến 1 button của ToolBar 34 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 67 Toolbar - Tạo Toolbar bằng lớp CToolBar(tt) Thêm các ToolTip và FlyBy text (tt) Cách thực hiện: ToolBar phải có thuộc tính CBRS_TOOLTIPS ¦ CBRS_FLYBY Tạo 1 bảng mô tả chuỗi (StringTable) ID của chuỗi trùng với ID của các button trên ToolBar Chuỗi có thể gồm 2 phần: \n VD. STRINGTABLE DISCARDABLE BEGIN ID_DRAW_LINE "Draw a line\nLine“ ID_DRAW_CIRCLE "Draw a circle\nCircle" ID_DRAW_RECTANGLE "Draw a rect\nRectangle" END Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 68 Statusbar Tạo một ứng dụng có Statusbar bằng AppWizard Tạo Statusbar bằng lớp CStatusBar 35 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 69 Statusbar - Tạo một ứng dụng bằng AppWizard Tạo một ứng dụng có Statusbar bằng AppWizard Chọn menu File Æ New Chọn tab Projects Chọn loại project “MFC AppWizard (exe)” Đặt tên project và xác định đường dẫn thư mục trong ô “Location” Step 1: Chọn loại ứng dụng “Single Document”, bỏ option “Document/View architecture support” Nhấn Finish để kết thúc Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 70 Statusbar - Tạo một ứng dụng bằng AppWizard(tt) Chọn option này để AppWizard tự động tạo ra một Statusbar 36 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 71 Statusbar - Tạo một ứng dụng bằng AppWizard(tt) Các xử lý tương ứng // Định nghĩa các vùng trên Statusbar // (file MainFrm.cpp) static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; // Tạo lập Statusbar (hàm OnCreate của lớp CMainFrame) if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0(“Không thể tạo được Statusbar\n"); return -1; // fail to create } Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 72 Statusbar - Tạo Statusbar bằng lớp CStatusBar Tạo lập và hiển thị Ẩn/hiện Statusbar Thể hiện giúp đỡ cho các menu item Phân vùng trên Statusbar
File đính kèm:
- lap_trinh_c_tren_windows_ky_thuat_lap_trinh_visual_c_mfc_ngu.pdf