Tải bản đầy đủ (.pdf) (36 trang)

Bài giảng lập trình Windows - Xử lý dao diện người dùng potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (410.83 KB, 36 trang )

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

×