1
Lập trình Windows
(Windows Programming)
Nguyễn Tri Tuấn
Khoa CNTT – ĐH.KHTN.Tp.HCM
Email: nttuan@ fit.hcmuns.edu.vn
Xử lý giao diện người dùng
(User Interface)
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 2
Nội dung
Xử lý Mouse và Keyboard
Xử lý menu
Xây dựng và xử lý hộp thoại (Dialog box)
Các hộp thoại chuẩn (Common Dialog boxes)
Toolbar, Statusbar
Các Control
MDI – Multi Document Interface
2
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 3
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
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 4
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
3
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 5
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
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 6
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
WM_MOUSEMOVE
Các bước thực hiện:
Định nghĩa 4 biến (x1, y1) – (x2, y2)
Định nghĩa hàm xử lý message WM_LBUTTONDOWN
Định nghĩa hàm xử lý message WM_MOUSEMOVE
4
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 7
Xử lý Mouse…(tt)
Vẽ hình bằng mouse…(tt)
void OnLButtonDown(int &x1, int &y1,
int &x2, int &y2, int x, int y)
{
x1 = x2 = x;
y1 = y2 = y;
}
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 8
Xử lý Mouse…(tt)
Vẽ hình bằng mouse…(tt)
void OnMouseMove(HWND hWnd, UINT nFlags, int x1,
int y1, int &x2, int &y2, int x, int y)
{
if (!(nFlags & MK_LBUTTON)) break;
HDC dc = GetDC(hWnd);
// xoa duong cu
SetROP2(dc, R2_NOTXORPEN);
MoveToEx(dc, x1, y1, NULL);
LineTo(dc, x2, y2);
// ve duong moi
x2 = x;
y2 = y;
MoveToEx(dc, x1, y1, NULL);
LineTo(dc, x2, y2);
ReleaseDC(hWnd, dc);
}
5
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 9
Xử lý keyboard
Các message 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
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
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,…)
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 10
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
Các bước thực hiện
Định nghĩa hàm xử lý message WM_KEYDOWN
6
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 11
Xử lý menu
Một vài khái niệm
Tạo menu
Thay đổi trạng thái menu
Lấy thông tin của menu
Menu messages
Ví dụ
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 12
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. Tên gọi khác: main menu, top-level menu
Drop-down menu: là 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,
…
Tên gọi khác: popup menu, sub-menu
Menu item: tương ứng với 1 lệnh của ứng dụng. 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, …
System menu: chứa các lệnh hệ thống điều khiển cửa sổ.
VD. Minimize, Maximize, Close, …
7
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13
Xử lý menu - Một vài khái niệm…(tt)
System menu
Menu bar
Drop-down menu
Menu item
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 14
Xử lý menu - Một vài khái niệm…(tt)
Các trạng thái của menu item:
Checked / Unchecked
- chỉ áp dụng cho các menu item bên trong popup. Top-level menu
item không có tính chất này
Enabled, Disabled, Grayed
- HĐH Windows chỉ gởi message
WM_COMMAND cho các menu item ở
trạng thái Enabled
8
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 15
Xử lý menu - Một vài khái niệm…(tt)
Cấu trúc menu
Menu bar, Drop-down menu, System menu: được quản
lý bằng menu handle
Menu item: được quản lý bằng số ID (item ID). ID này sẽ
được gởi đến ứng dụng cùng với message
WM_COMMAND
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 16
Xử lý menu - Tạo menu
Thường có 2 cách để tạo menu:
Tạo menu ở dạng resource của ứng dụng, và
load vào khi chạy ứng dụng
Tạo trực tiếp bằng các hàm khi ứng dụng đang
chạy.
Các hàm thường dùng: CreateMenu, InsertMenu, …
9
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 17
Xử lý menu - Tạo menu…(tt)
xxx.rc
IDC_MAINMENU 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
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 18
Xử lý menu - Tạo menu…(tt)
Tham chiếu đến menu trong window class
wc.lpszMenuName = (LPCSTR) IDC_MAINMENU;
Xác định menu khi tạo cửa sổ:
hMenu = LoadMenu(hInstance,
MAKEINTRESOURCE(IDC_MAINMENU));
// sử dụng hMenu, overwrite giá trị wc.lpszMenuName
hWnd = CreateWindow(TEXT("MyClass"), TEXT("Window
Caption"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hMenu, hInstance, NULL);
10
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 19
Xử lý menu - Tạo menu…(tt)
Thay đổi menu bar:
hMenu2 = LoadMenu(hInstance,
MAKEINTRESOURCE(IDC_2NDMENU));
SetMenu(hWnd, hMenu2);
DrawMenuBar(hWnd); // vẽ lại menu mới
DestroyMenu(hMenu); // hủy bỏ menu cũ
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 20
Xử lý menu - Tạo menu…(tt)
Các hàm tạo menu “run-time”
CreateMenu
CreatePopupMenu
AppendMenu
InsertMenu
InsertMenuItem
11
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 21
Xử lý menu - Tạo menu…(tt)
// Ví dụ tạo menu File và Edit “run-time”
hMenu = CreateMenu();
hMenuPopup = CreateMenu();
AppendMenu(hMenuPopup, MF_STRING, IDM_FILE_NEW, "&New");
AppendMenu(hMenuPopup, MF_STRING, IDM_FILE_OPEN, "&Open ");
AppendMenu(hMenuPopup, MF_STRING, IDM_FILE_SAVE, "&Save");
AppendMenu(hMenuPopup, MF_STRING, IDM_FILE_SAVE_AS, "Save &As.“);
AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL);
AppendMenu(hMenuPopup, MF_STRING, IDM_APP_EXIT, "E&xit");
AppendMenu(hMenu, MF_POPUP, hMenuPopup, "&File");
hMenuPopup = CreateMenu();
AppendMenu(hMenuPopup, MF_STRING, IDM_EDIT_UNDO, "&Undo");
AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL);
AppendMenu(hMenuPopup, MF_STRING, IDM_EDIT_CUT, "Cu&t");
AppendMenu(hMenuPopup, MF_STRING, IDM_EDIT_COPY, "&Copy");
AppendMenu(hMenuPopup, MF_STRING, IDM_EDIT_PASTE, "&Paste");
AppendMenu (hMenuPopup, MF_STRING, IDM_EDIT_CLEAR, "De&lete");
AppendMenu(hMenu, MF_POPUP, hMenuPopup, "&Edit");
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 22
Xử lý menu - Thay đổi trạng thái menu
Các hàm thay đổi trạng thái menu
CheckMenuItem
EnableMenuItem
GetMenuState
Trạng thái menu cần phải được cập nhật tùy theo “ngữ
cảnh” của ứng dụng. VD:
Bật/tắt Status Bar cần thể hiện 1 dấu check () phía trước menu
item View/Status Bar
Chức năng Cut/Copy/Delete chỉ được enable khi user đánh dấu
chọn 1 đoạn text
Chức năng Paste chỉ được enable khi clipboard khác rỗng
…
12
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 23
Xử lý menu - Thay đổi trạng thái menu…(tt)
// Checked/Unchecked menu item
case WM_COMMAND:
hMenu = GetMenu(hWnd);
itemSel = LOWORD(wParam);
if (itemSel==IDM_VIEW_STATUSBAR) {
if (GetMenuState(hMenu, itemSel, MF_BYCOMMAND)&
MF_CHECKED)
nFlag = MF_UNCHECKED;
else nFlag = MF_CHECKED;
CheckMenuItem(hMenu,
itemSel, nFlag |
MF_BYCOMMAND);
}
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 24
Xử lý menu - Lấy thông tin của menu
Các hàm cung cấp thông tin của menu
GetMenu
GetSubMenu
GetSystemMenu
GetMenuInfo
GetMenuItemID
GetMenuItemInfo
GetMenuState
GetMenuString
13
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 25
Xử lý menu - Lấy thông tin của menu…(tt)
// lấy thông tin menu bar của hWnd
HMENU hMenu = GetMenu(hWnd);
MENUINFO menuInfo;
menuInfo.cbSize = sizeof(MENUINFO);
GetMenuInfo(hMenu, &menuInfo);
// lấy thông tin menu item “Open”
HMENU hMenu = GetMenu(hWnd);
MENUITEMINFO menuItemInfo;
menuItemInfo.cbSize = sizeof(MENUITEMINFO);
GetMenuItemInfo(hMenu, ID_FILE_OPEN, FALSE,
&menuItemInfo)
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 26
Xử lý menu - Lấy thông tin của menu…(tt)
// cấu trúc lưu thông tin menu
typedef struct tagMENUINFO {
DWORD cbSize;
DWORD fMask;
DWORD dwStyle;
UINT cyMax;
HBRUSH hbrBack;
DWORD dwContextHelpID;
ULONG_PTR dwMenuData;
} MENUINFO, FAR *LPMENUINFO;
typedef MENUINFO CONST FAR *LPCMENUINFO;
14
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 27
Xử lý menu - Lấy thông tin của menu…(tt)
// cấu trúc lưu thông tin menu item
typedef struct tagMENUITEMINFO {
UINT cbSize;
UINT fMask;
UINT fType;
UINT fState;
UINT wID;
HMENU hSubMenu;
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
ULONG_PTR dwItemData;
LPTSTR dwTypeData;
UINT cch;
HBITMAP hbmpItem;
} MENUITEMINFO, *LPMENUITEMINFO;
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 28
Xử lý menu – Menu messages
Các thông điệp của menu
WM_MENUSELECT
WM_INITMENUPOPUP
WM_COMMAND
WM_SYSCOMMAND
15
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 29
Xử lý menu - Menu messages…(tt)
WM_MENUSELECT: phát sinh khi user tác động (di
chuyển mouse hay cursor) lên menu. Thông điệp này có
thể dùng để cập nhật trạng thái của menu hay dùng để tạo
ra statusbar chứa hướng dẫn chi tiết của menu item
wParam:
LOWORD(wParam): ID của menu item hoặc index của menu
popup
HIWORD(wParam): các thông tin khác như trạng thái menu
(MF_CHECKED, MF_GRAYED,…), loại menu (MF_POPUP,
MF_SYSMENU,…)
lParam: handle của popup menu
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 30
Xử lý menu - Menu messages…(tt)
WM_INITMENUPOPUP: được gởi đến hàm xử lý message
trước khi Windows hiển thị popup. Message này thường
dùng để enable/disable menu item của popup.
VD. Enable Cut/Copy/Delete khi user đánh dấu chọn 1
đoạn text
wParam: Handle của popup menu
lParam:
LOWORD(lParam): vị trí của popup (zero based)
HIWORD(lParam):
= TRUE nếu là window-menu;
= FALSE nếu không phải
16
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 31
Xử lý menu - Menu messages…(tt)
WM_COMMAND: phát sinh khi user chọn 1 menu item
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
dùng phím tắt (accelerator); =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 đó
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 32
Xử lý menu - Menu messages…(tt)
WM_SYSCOMMAND: phát sinh khi user chọn 1 menu item
trong system menu
wParam: mã lệnh được chọn, là một trong các giá trị:
SC_CLOSE, SC_MAXIMIZE, SC_MINIMIZE, SC_MOVE,
SC_RESTORE, SC_SIZE,…
lParam:
LOWORD(lParam): tọa độ x của cursor (screen coordinate)
HIWORD(lParam): tọa độ y của cursor (screen coordinate)
17
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 33
Xây dựng và xử lý hộp thoại (Dialog box)
Các khái niệm
Các message thường dùng cho dialog
Các hàm thường dùng cho dialog
Xây dựng modal dialog box
Xây dựng modeless dialog box
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 34
Dialog Box – Các khái niệm
Dialog box: là phương tiện chính để nhập liệu (input) từ user. Thông
thường, dialog là một popup-window chứa các control. Ứng dụng
tạo dialog bằng cách gọi hàm CreateDialog/DialogBox mà không
cần đăng ký lớp cửa sổ.
Control: là dạng “cửa sổ điều khiển” chuyên biệt, vd. Button, Edit,
Listbox,… Mỗi control có một ID phân biệt
Dialog box template: là resource script để định nghĩa vị trí, kích
thước, ID,… của các control trong dialog
Dialog box procedure: hàm xử lý message cho dialog
Modal dialog: là dạng dialog phổ biến nhất. Khi mở modal dialog,
user không được phép chuyển (focus) sang cửa sổ khác của cùng
ứng dụng. Vd. Open, Font,…
Modeless dialog: user vẫn có thể chuyển (focus) giữa modeless
dialog và cửa sổ khác của cùng ứng dụng. Vd. Find, Replace, Spell
check,…
18
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 35
Các message thường dùng cho dialog
WM_INITDIALOG
WM_COMMAND
WM_CLOSE
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 36
Các hàm thường dùng cho dialog
CheckDlgButton
CheckRadioButton
EnableWindow
GetDlgCtrlID
GetDlgItem
GetDlgItemInt
GetDlgItemText
IsDlgButtonChecked
IsDialogMessage
SendDlgItemMessage
SetDlgItemInt
SetDlgItemText
19
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 37
Xây dựng modal dialog box
Tạo dialog: dùng hàm
DialogBox
hay DialogBoxParam
Kết thúc dialog: dùng hàm
EndDialog
Ví dụ:
Tạo dialog “Color” như hình vẽ
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 38
Xây dựng modal dialog box…(tt)
// tạo dialog
DialogBox(hInstance, MAKEINTRESOURCE(IDD_COLORDLG),
hWnd,(DLGPROC)colorDlgProc);
xxx.rc
#define IDC_BLACK 1000
#define IDC_BLUE 1001
#define IDC_GREEN 1002
#define IDC_CYAN 1003
#define IDC_RED 1004
#define IDC_MAGENTA 1005
#define IDC_YELLOW 1006
#define IDC_WHITE 1007
#define IDC_RECT 1008
#define IDC_ELLIPSE 1009
#define IDC_PAINT 1010
20
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 39
Xây dựng modal dialog box…(tt)
// hàm xử lý message
int iCurrentColor = IDC_RED; // color ñang chọn
int iCurrentFigure = IDC_ELLIPSE; // figure ñang chọn
BOOL CALLBACK colorDlgProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
static HWND hCtrlFigure;
static int iColor, iFigure;
switch (message) {
case WM_INITDIALOG:
iColor = iCurrentColor;
iFigure = iCurrentFigure;
CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE, iColor);
CheckRadioButton(hDlg, IDC_RECT, IDC_ELLIPSE, iFigure);
hCtrlFigure = GetDlgItem(hDlg, IDC_PAINT);
SetFocus(GetDlgItem(hDlg, iColor));
return FALSE;
(Còn tiếp…)
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 40
Xây dựng modal dialog box…(tt)
// hàm xử lý message…(tt)
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
// lưu lại giá trị Color và Figure rồi thoát
iCurrentColor = iColor;
iCurrentFigure = iFigure;
EndDialog(hDlg, TRUE);
return TRUE;
case IDCANCEL:
// kết thúc dialog nhưng không thay ñổi giá
// trị Color, Figure
EndDialog(hDlg, FALSE);
return TRUE;
(Còn tiếp…)
21
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 41
Xây dựng modal dialog box…(tt)
// hàm xử lý message…(tt)
case IDC_BLACK:
case IDC_RED:
case IDC_GREEN:
case IDC_YELLOW:
case IDC_BLUE:
case IDC_MAGENTA:
case IDC_CYAN:
case IDC_WHITE:
// ñổi radio button khi user chọn Color
iColor = LOWORD(wParam);
CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE,
LOWORD (wParam));
// tô màu lại figure theo màu mới chọn
PaintTheFigure(hCtrlFigure, iColor, iFigure);
return TRUE;
(Còn tiếp…)
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 42
Xây dựng modal dialog box…(tt)
// hàm xử lý message…(tt)
case IDC_RECT:
case IDC_ELLIPSE:
// ñổi radio button khi user chọn Figure
iFigure = LOWORD(wParam);
CheckRadioButton(hDlg, IDC_RECT,
IDC_ELLIPSE, LOWORD(wParam));
// vẽ lại hình theo figure mới chọn
PaintTheFigure(hCtrlFigure, iColor, iFigure);
return TRUE;
} // end of WM_COMMAND’s switch
break;
case WM_PAINT:
PaintTheFigure(hCtrlFigure, iColor, iFigure);
break;
case WM_CLOSE:
EndDialog(hDlg, FALSE);
break;
}
return FALSE;
}
22
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 43
Xây dựng modeless dialog box
Tạo dialog: dùng hàm
CreateDialog
hay CreateDialogParam
ShowWindow
Kết thúc dialog: dùng hàm
DestroyWindow
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 44
Xây dựng modeless dialog box…(tt)
Các điểm khác nhau giữa modeless và modal dialog
Cần có style WS_VISIBLE khi định nghĩa dialog template
STYLE WS_POPUP ¦ WS_CAPTION ¦ WS_SYSMENU ¦
WS_VISIBLE
Hàm CreateDialog sẽ return ngay sau khi tạo xong dialog cần
lưu lại dialog handle trong một biến toàn cục
HWND hModelessDlg = NULL; // Handle của Modeless
// dialog
hModelessDlg = CreateDialog(hInstance,
MAKEINTRESOURCE(IDD_MYDIALOG), hWnd,
(DLGPROC)MyDialogProc);
ShowWindow(hModelessDlg, SW_SHOW);
23
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 45
Xây dựng modeless dialog box…(tt)
Các điểm khác nhau giữa modeless và modal dialog…(tt)
Các message của modeless dialog sẽ đi qua application
queue, do đó, loop message cần tách riêng các message này
và gởi đến hàm xử lý message của modeless dialog
// Loop message
while (GetMessage(&msg, NULL, NULL, NULL))
if (hModelessDlg==NULL ||
!IsDialogMessage(hModelessDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 46
Xây dựng modeless dialog box…(tt)
Các điểm khác nhau giữa modeless và modal
dialog…(tt)
Kết thúc dialog bằng hàm DestroyWindow thay vì
EndDialog
case WM_CLOSE :
DestroyWindow(hDlg);
hModelessDlg = NULL;
return TRUE;
24
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 47
Multi Document Interface (MDI)
Mục đích
Phân cấp tổ chức
Các bước xây dựng giao diện MDI
Các vấn đề khác
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 48
MDI - Mục đích
MDI là một dạng ứng dụng đặc biệt có thể quản lý
nhiều “cửa sổ chứa tài liệu” (document window)
Các tài liệu được hiển thị riêng biệt trong các cửa
sổ con (child window) bên trong vùng client của
cửa sổ chính (frame window)
VD. Excel, Word, PowerPoint,…
25
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 49
MDI - Phân cấp tổ chức
Frame window
(main app window)
Client window
Child wind. Child wind. Child wind. Child wind.
…
Sơ đồ phân cấp cửa sổ cha-con trong MDI
Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 50
MDI - Phân cấp tổ chức…(tt)
Frame window
Các
child
window
Client
window