Lập trình Windows
(Windows Programming)
Xử lý giao diện người dùng
(User Interface)
Nguyễn Tri Tuấn
Khoa CNTT – ĐH.KHTN.Tp.HCM
Email: nttuan@ fit.hcmuns.edu.vn
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
2
1
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
3
Winter 2010
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
2
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
5
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
1 đường thẳng
vẽ
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
6
3
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;
}
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
7
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);
}
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
8
4
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,…)
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
9
Xử lý keyboard…(tt)
Ví dụ: Xử lý phím nhấn
Mơ tả: khi user nhấn một phím
thơng báo
hiển thị 1 MessageBox
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
10
5
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ụ
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
11
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, …
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
12
6
Xử lý menu - Một vài khái niệm…(tt)
Drop-down menu
Menu bar
System menu
Menu item
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
13
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
14
7
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
15
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, …
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
16
8
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
17
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);
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
18
9
Xử lý menu - Tạo menu…(tt)
Thay đổi menu bar:
hMenu2 = LoadMenu(hInstance,
MAKEINTRESOURCE(IDC_2NDMENU));
SetMenu(hWnd, hMenu2);
DrawMenuBar(hWnd);
DestroyMenu(hMenu);
// vẽ lại menu mới
// hủy bỏ menu cũ
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
19
Xử lý menu - Tạo menu…(tt)
Các hàm tạo menu “run-time”
CreateMenu
CreatePopupMenu
AppendMenu
InsertMenu
InsertMenuItem
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
20
10
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");
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
21
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
…
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
22
11
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);
}
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
23
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
24
12
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)
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
25
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;
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
26
13
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;
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
27
Xử lý menu – Menu messages
Các thông điệp của menu
WM_MENUSELECT
WM_INITMENUPOPUP
WM_COMMAND
WM_SYSCOMMAND
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
28
14
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
29
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
30
15
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 đó
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
31
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)
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
32
16
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
33
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,…
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
34
17
Các message thường dùng cho dialog
WM_INITDIALOG
WM_COMMAND
WM_CLOSE
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
35
Các hàm thường dùng cho dialog
CheckDlgButton
CheckRadioButton
EnableWindow
GetDlgCtrlID
GetDlgItem
GetDlgItemInt
GetDlgItemText
IsDlgButtonChecked
IsDialogMessage
SendDlgItemMessage
SetDlgItemInt
SetDlgItemText
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
36
18
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ẽ
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
37
Xây dựng modal dialog box…(tt)
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
// tạo dialog
DialogBox(hInstance, MAKEINTRESOURCE(IDD_COLORDLG),
hWnd,(DLGPROC)colorDlgProc);
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
38
19
Xây dựng modal dialog box…(tt)
// hàm xử lý message
int iCurrentColor = IDC_RED;
int iCurrentFigure = IDC_ELLIPSE;
// color ñang chọn
// 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…)
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
39
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…)
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
40
20
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…)
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
41
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;
}
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
42
21
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
43
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
lưu lại dialog handle trong một biến toàn cục
HWND
cần
hModelessDlg = NULL; // Handle của Modeless
// dialog
hModelessDlg = CreateDialog(hInstance,
MAKEINTRESOURCE(IDD_MYDIALOG), hWnd,
(DLGPROC)MyDialogProc);
ShowWindow(hModelessDlg, SW_SHOW);
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
44
22
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);
}
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
45
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;
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
46
23
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
47
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,…
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
48
24
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
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Winter 2010
49
MDI - Phân cấp tổ chức…(tt)
Frame window
Các
child
window
Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM
Client
window
Winter 2010
50
25