KHUNG CỬA SỔ GIAO DIỆN CHÍNH
10.1 KHUNG CỬA SỔ GIAO DIỆN (FRAME WINDOW):
Frame window là loại cửa sổ chuyên dùng làm màn hình chính của ứng dụng. Frame window có các đặc điểm như sau:
Cho phép lồng vào frame window thanh trạng thái (statusbar), thanh công cụ (toolbar), menu và các phím tắt trên menu.
Cho phép lồng một đối tượng view (thuộc lớp kế thừa từ CWnd) vào vùng client của frame window để hoạt động phối hợp trong việc hiển thị nội dung trao đổi của ứng dụng. Hành vi OnSetFocus của frame window thực hiện hành vi OnSetFocus của view để tạo sự đồng bộ giữa frame và view khi kích hoạt. Thông qua hành vi OnCmdMsg, frame window có thể điều phối command message cho view.
Phối hợp, đồng bộ việc thực hiện xử lý và thay đổi trạng thái của các đối tượng trực thuộc: menu, toolbar, statusbar, view.
Cho phép cơ chế thực hiện WinHelp và tự động kết thúc WinHelp khi frame window chấm dứt hoạt động.
10.2 THANH TRẠNG THÁI (STATUSBAR) & LỚP CStatusBar:
StatusBar là khung bao gồm các hộp (pane) chứa thông báo. Thông qua statusbar, ứng dụng có thể thông tin cho người dùng về các hoạt động của ứng dụng và các thông số liên quan. Statusbar thường được đặt ở cạnh dưới của frame window. Mỗi pane trên statusbar có thể được ấn định một kiểu dạng thể hiện và nội dung thông tin riêng.
Việc quản lý statusbar trong ứng dụng được MFC hỗ trợ thông qua lớp đối tượng CStatusBar. Các hành vi đặc trưng của lớp này như sau:
118Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com CStatusBar( ); Tạo lập đối tượng rỗng.
BOOL Create (
CWnd* pParentWnd, /* Con trỏ đối tượng cửa sổ cha */ /* Thông số dạng của statusbar và giá trị mặc nhiên */
DWORD dwStyle WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, /* Số hiệu statusbar, giá trị mặc nhiên cho statusbar chính */ UINT nID = AFX_IDW_STATUS_BAR
); Khởi tạo thông số cho đối tượng statusbar. BOOL SetIndicators (
const UINT* lpIDArray, // Mảng chứa số hiệu panes int nIDCount // Số pane trên statusbar ); Qui định số pane và số hiệu của chúng.
Các số hiệu pane đặc biệt như sau:
ID_SEPARATOR : Dùng cho pane thông tin trạng thái, ID_INDICATOR_CAPS : Pane trạng thái phím capslock. ID_INDICATOR_NUM : Pane trạng thái phím numslock ID_INDICATOR_SCRL : Pane trạng thái phím scrolllock void SetWindowText (
LPCTSTR lpszString // Nội dung thông báo cập nhật ); Cập nhật thông báo cho pane có số hiệu là 0.
BOOL SetPaneText (
int nIndex, // Số hiệu pane
LPCTSTR lpszNewText, // Nội dung thông báo cập nhật BOOL bUpdate=TRUE // Vẽ lại thông tin cập nhật ); Cập nhật nội dung thông báo trong pane một pane. void SetPaneInfo (
int nIndex, // Số thứ tự pane trong statusbar UINT nID, // Số hiệu gán cho pane
UINT nStyle, // Thông số dạng của pane int cxWidth // Độ rộng pane (tính bằng pixel) ); Ấn định các thông số liên quan hoạt động hiển thị của pane. Giá trị nStyle có thể là:
SBPS_NOBORDERS : Không viền. SBPS_POPOUT : Viền nổi. SBPS_DISABLED : Cấm.
Khung cửa sổ giao diện chính 119
SBPS_NORMAL : Không có kiểu dáng đặc biệt, void SetPaneStyle (
int nIndex, // Số thứ tự pane trong statusbar UINT nStyle // Thông số dạng của pane ); Ấn định thông số dạng của pane.
10.3 THANH CÔNG CỤ (TOOLBAR) & LỚP CToolBar:
Toolbar là khung chứa các mục chọn có hình ảnh gợi nhớ và được kết vào cạnh của frame window. Mỗi mục chọn của toolbar có một số hiệu riêng hoặc gắn với một mục chọn xác định trong hệ thống menu. CToolBar là lớp do MFC cung cấp nhằm hỗ trợ việc quản lý toolbar trong ứng dụng.
CToolBar( ); Tạo lập đối tượng rỗng. BOOL Create (
CWnd* pParentWnd, /* Con trỏ đối tượng cửa sổ cha */ /* Thông số dạng của toolbar với giá trị mặc nhiên */ DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, /* Số hiệu của toolbar, giá trị mặc nhiên cho toolbar chính */ UINT nID = AFX_IDW_TOOLBAR
); Khởi tạo thông số cho đối tượng toolbar. dwStyle có thể nhận các thông số sau:
CBRS_GRIPPER : Toolbar di chuyển được
CBRS_FLOAT_MULTI : Cho phép nhiều toolbar trong 1 frame CBRS_TOOLTIPS : Có tiptext cho mỗi mục chọn
CBRS_FLYBY : Đồng bộ tooltip và message info CBRS_SIZE_DYNAMIC : Kích thước thay đổi được CBRS_SIZE_FIXED : Kích thước cố định BOOL CreateEx (
CWnd* pParentWnd,
DWORD dwCtrlStyle = TBSTYLE_FLAT, // Dạng phẳng DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP CRect rcBorders = CRect ( 0, 0, 0, 0 ),
UINT nID = AFX_IDW_TOOLBAR
); Khởi tạo đối tượng toolbar với thông số dạng mở rộng. dwCtrlStyle có thể là TBSTYLE_TRANSPARENT (trong suốt). BOOL LoadToolBar (
UINT nIDResource // Số hiệu của toolbar resource ); Tạo dạng cho toolbar từ toolbar resource.
120Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com void SetHeight( int cyHeight ); Ấn định chiều cao của toolbar.
void EnableDocking (
DWORD dwStyle // Cách kết toolbar vào frame window // xem EnableDocking() của CFrameWnd ); Ấn định kiểu kết cho phép của toolbar với cửa sổ cha của nó.
CToolBarCtrl& GetToolBarCtrl( ); Trả về đối tượng quản lý các nút chọn trên toolbar. Với đối tượng này ta có thể thực hiện các chỉnh sửa phù hợp trên từng nút chọn.
) Thực hiện toolbar trong ứng dụng: Ta tiến hành các bước sau đây. 10.3.1 Thiết kế toolbar resource:
Toolbar resource chứa thông tin về hình ảnh, số hiệu, nội dung thông báo và các hướng dẫn cho từng mục chọn trên thanh toolbar.
Mở dự án cần bổ sung toolbar resource trong VC.
Tạo mới toolbar resource: Thực hiện tương tự tạo mới icon (2.8). Lưu ý: Chọn Resource Type = ToolBar.
Đặt số hiệu cho toolbar (ví dụ IDR_MAINFRAME cho toolbar chính). Thiết kế toolbar thông qua màn hình thiết kế mà ta vừa nhận được từ
bước trên. Các thao tác cơ bản như sau: • Khai báo thông số cho nút chọn:
- Double-click trên nút:
- Ấn định các thông số cho nút:
à ID : Số hiệu của nút chọn, có thể là số hiệu của mục menu. à Width, Height : Chiều rộng và chiều cao của nút.
à Prompt : Tương tự như Prompt của mục chọn trên menu. • Thêm một nút mới: Double-click trên . Sau đó thực hiện khai
báo thông số cho nút như trên.
Khung cửa sổ giao diện chính 121
• Tách nhóm nút: Drag nút ra xa vị trí nút kế cận. • Xóa nút: Drag nút ra khỏi thanh toolbar.
• Trang trí nút: Thực hiện như trang trí icon.
Khi thiết kế xong, chọn mục Save và đóng màn hình thiết kế toolbar. 10.3.2 Dùng toolbar resource cho đối tượng CToolBar của FrameWnd:
Khai báo đối tượng thuộc tính kiểu CToolBar trong lớp CFrameWnd của ứng dụng:
CToolBar m_toolbar; // Đặt trong khai báo lớp CFrameWnd
Hành vi OnCreate của FrameWnd khởi tạo thông số cho đối tượng toolbar . Sau đó kết đối tượng toolbar vào frame window.
int CEmpFrame::OnCreate( LPCREATESTRUCT lpCreateStruct ) {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
// Create the main toolbar for frame window m_toolbar.CreateEx(this, TBSTYLE_FLAT,
WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY); // Initiate toolbar’s appearance by toolbar resource
m_toolbar.LoadToolBar(IDR_MAINFRAME); m_toolbar.EnableDocking(CBRS_ALIGN_ANY);
// attach the toolbar to frame window
this->EnableDocking(CBRS_ALIGN_ANY);
this->DockControlBar(&m_toolbar, AFX_IDW_DOCKBAR_TOP); return 0;
}
10.4 LỚP CFrameWnd:
CFrameWnd là lớp đối tượng kế thừa từ CWnd cho phép quản lý frame window trong ứng dụng. Ngoài các thuộc tính và hành vi kế thừa public từ CWnd, CFrameWnd có các thuộc tính và hành vi đặc trưng giúp việc ấn định và điều khiển frame window được dễ dàng và hiệu quả.
CFrameWnd( ); Hành vi tạo lập. BOOL Create (
LPCTSTR lpszClassName, // Tên lớp đã đăng ký của frame LPCTSTR lpszWindowName, // Tên, tiêu đề của frame window /* thông số dạng của frame */
122Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com DWORD dwStyle = WS_OVERLAPPEDWINDOW,
/* Tọa độ, kích thước của frame rectDefault: Giá trị mặc nhiên */ const RECT& rect = rectDefault,
// Con trỏ đối tượng cửa sổ cha CWnd* pParentWnd = NULL,
// Chuỗi tên menu resource LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle // Thông số dạng frame mở rộng ); Khởi tạo thông số cho frame window.
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); Hành vi kế thừa cho phép khởi tạo thông số các đối tượng trực thuộc.
virtual BOOL LoadFrame (
UINT nIDResource, // Số hiệu các resource liên quan: icon, // cursor, bảng phím tắt, menu (bắt buộc). DWORD dwDefaultStyle // Thông số dạng frame window = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, CWnd* pParentWnd // Con trỏ đối tượng cửa sổ cha ); Khởi tạo thông số cho frame window.
BOOL LoadAccelTable (
LPCTSTR Bảng_phím_tắt // Tên bảng phím tắt trong resource ); Nạp bảng phím tắt, chỉ dùng khi frame được khởi tạo bởi Create. virtual void ActivateFrame (
int nCmdShow = -1 // Thông số về trạng thái kích hoạt ); Hành vi kế thừa để ấn định thông số trạng thái frame khi kích hoạt. void EnableDocking (
DWORD dwDockStyle // Thông số ấn định ); Qui định cách kết thanh công cụ vào frame window. dwDockStyle có thể nhận một trong các giá trị sau:
CBRS_ALIGN_TOP : Kết ở cạnh trên vùng client. CBRS_ALIGN_BOTTOM : Kết ở cạnh dưới
CBRS_ALIGN_LEFT : Kết ở cạnh trái CBRS_ALIGN_RIGHT : Kết ở cạnh phải
Khung cửa sổ giao diện chính 123
void DockControlBar (
CControlBar * pBar, // Con trỏ đối tượng toolbar UINT nDockBarID // Thông số ấn định
); Kết đối tượng toolbar vào frame window, sử dụng khi trước đó định cách kết toolbar cho frame window là CBRS_ALIGN_ANY. Thông số ấn định phải phù hợp với đặc tính của pBar, có thể là các giá trị sau:
AFX_IDW_DOCKBAR_TOP : Kết ở cạnh trên AFX_IDW_DOCKBAR_BOTTOM : Kết ở cạnh dưới AFX_IDW_DOCKBAR_LEFT : Kết ở cạnh trái AFX_IDW_DOCKBAR_RIGHT : Kết ở cạnh phải virtual BOOL OnCreateClient (
LPCREATESTRUCT lpcs, // Con trỏ đến cấu trúc chứa CCreateContext* pContext // Các thông số liên kết.
); Hành vi được thực hiện khi các view đã được tạo xong. Kế thừa hành vi này để ấn định các thông số riêng của ứng dụng.
virtual CWnd* GetMessageBar( ); Trả về con trỏ trỏ đến đối tượng statusbar trực thuộc.