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

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 )

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


×