Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 17MENUITEM "E&xit", ID_APP_EXIT END... Winter 2010Windows Programming - User Interface - Nguyen Tri Tua
Trang 1L ậ p trình Windows (Windows Programming)
Xây d ự ng và x ử lý h ộ p tho ạ i (Dialog box)
Các h ộ p tho ạ i chu ẩ n (Common Dialog boxes)
Trang 2Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 3
Trang 3Winter 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
Trang 4Winter 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) {
void OnMouseMove(HWND hWnd, UINT nFlags, int x1,
int y1, int &x2, int &y2, int x, int y) {
if (!(nFlags & MK_LBUTTON)) break;
Trang 5Winter 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
Trang 6Winter 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
Ví d ụ
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
Trang 7Winter 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
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
Trang 8Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 15
X ử lý menu - M ộ t vài khái ni ệ m…(tt)
Trang 9Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 17
MENUITEM "E&xit", ID_APP_EXIT END
Trang 10Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 19
Trang 11Winter 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");
X ử lý menu - Thay đổ i tr ạ ng thái menu
Các hàm thay đổ i tr ạ ng thái menu
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
…
Trang 12Winter 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
else nFlag = MF_CHECKED;
CheckMenuItem(hMenu,
itemSel, nFlag | MF_BYCOMMAND);
}
X ử lý menu - L ấ y thông tin c ủ a menu
Các hàm cung c ấ p thông tin c ủ a menu
Trang 13Winter 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)
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 {
} MENUINFO, FAR *LPMENUINFO;
typedef MENUINFO CONST FAR *LPCMENUINFO;
Trang 14Winter 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 {
Trang 15Winter 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
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
Trang 16Winter 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 đ ó
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)
Trang 17Winter 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
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
Trang 18Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 35
Các message th ườ ng dùng cho dialog
Trang 19Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 37
Xây d ự ng modal dialog box
Trang 20Winter 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) {
CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE, iColor);
CheckRadioButton(hDlg, IDC_RECT, IDC_ELLIPSE, iFigure);
hCtrlFigure = GetDlgItem(hDlg, IDC_PAINT);
Trang 21Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 41
Xây d ự ng modal dialog box…(tt)
// tô màu l ạ i figure theo màu m ớ i ch ọ n
PaintTheFigure(hCtrlFigure, iColor, iFigure);
Trang 22Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 43
Xây d ự ng modeless dialog box
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,
Trang 23Winter 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);
}
Xây d ự ng modeless dialog box…(tt)
Các đ i ể m khác nhau gi ữ a modeless và modal
Trang 24Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 47
Multi Document Interface (MDI)
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,…
Trang 25Winter 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
Trang 26Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 51
MDI - Phân c ấ p t ổ ch ứ c…(tt)
Các thành ph ầ n c ủ a MDI
Frame window : th ườ ng có title bar, menu, sizing border,
system menu icon, và minimize/maximize/close buttons
Vùng client không dùng để hi ể n th ị d ữ li ệ u
Child window : th ườ ng có title bar, sizing border, system
menu icon, minimize/maximize/close buttons, và (có th ể )
scroll bars Child window không có menu riêng (dùng
chung menu v ớ i frame window) Có th ể có nhi ề u child
window class trong m ộ t ứ ng d ụ ng MDI.
Client window : đ ây là m ộ t c ử a s ổ đặ c bi ệ t, thu ộ c l ớ p
MDICLIENT (Win32 API đị nh ngh ĩ a s ẵ n) Có nhi ệ m v ụ
qu ả n lý t ấ t c ả child window.
MDI - Phân c ấ p t ổ ch ứ c…(tt)
Các đặ c tính c ủ a MDI
Khi child window ở tr ạ ng thái minimize, nó đượ c th ể hi ệ n
b ằ ng title bar ở bên d ướ i client area
Khi child window ở tr ạ ng thái maximize, title bar c ủ a nó
s ẽ không còn, title c ủ a child window s ẽ đượ c thêm vào
phía sau title c ủ a frame window
Các phím t ắ t h ệ th ố ng: CtrlF4, CtrlF6, Alt
-Th ườ ng s ẽ có m ộ t popup “Window” trên menu-bar để
Trang 27Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 53
MDI - Phân c ấ p t ổ ch ứ c…(tt)
Các b ướ c xây d ự ng giao di ệ n MDI
Đă ng ký l ớ p c ử a s ổ frame window
WNDCLASS wc;
wc.lpszClassName = “MDI_FRAME”;
wc.lpfnWndProc = (WNDPROC) FrameWndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor((HANDLE) NULL, IDC_ARROW);
wc.hIcon = LoadIcon(hInstance, IDC_FRAME);
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
Trang 28Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 55
Các b ướ c xây d ự ng giao di ệ n MDI…(tt)
Đă ng ký l ớ p c ử a s ổ “Hello child window”
if (!RegisterClass(&wc)) return FALSE;
Các b ướ c xây d ự ng giao di ệ n MDI…(tt)
Đă ng ký l ớ p c ử a s ổ “Rect child window”
Trang 29Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 57
Các b ướ c xây d ự ng giao di ệ n MDI…(tt)
0, 0, 0, 0, hWnd,
(HMENU) NULL, hInstance, (LPSTR) &ccs);
ShowWindow(hwndMDIClient, SW_SHOW);
return 0;
Các b ướ c xây d ự ng giao di ệ n MDI…(tt)
Hàm x ử lý message c ủ a frame window [1]
case WM_SIZE:
UINT w, h;
// C ậ p nh ậ t kích th ướ c Client window
// theo kích th ướ c frame window
w = LOWORD(lParam);
h = HIWORD(lParam);
MoveWindow(hwndMDIClient, 0, 0, w, h, TRUE);
break;
Trang 30Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 59
Các b ướ c xây d ự ng giao di ệ n MDI…(tt)
Hàm x ử lý message c ủ a frame window [2]
Hàm x ử lý m ặ c đị nh
return DefFrameProc(hWnd, hwndMDIClient,
message, wParam, lParam);
Các message c ầ n đượ c chuy ể n đế n hàm DefFrameProc
ngay c ả khi ch ươ ng trình đ ã x ử lý
WM_COMMAND
WM_MENUCHAR
WM_SETFOCUS
WM_SIZE
Các b ướ c xây d ự ng giao di ệ n MDI…(tt)
Hàm x ử lý message c ủ a child window
Hàm x ử lý m ặ c đị nh
return DefMDIChildProc(hMDIWnd, message,
wParam, lParam);
Các message c ầ n đượ c chuy ể n đế n hàm
DefMDIChildProc ngay c ả khi ch ươ ng trình đ ã x ử lý
WM_MDIACTIVATE
WM_GETMINMAXINFO
WM_MENUCHAR
Trang 31Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 61
Các b ướ c xây d ự ng giao di ệ n MDI…(tt)
Child window m ớ i t ạ o s ẽ đượ c active và n ằ m ở top so
v ớ i các child window tr ướ c
Client window s ẽ thêm m ộ t menu item vào popup
“Window” trên menu-bar
Item menu m ớ i thêm vào popup
Trang 32Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 63
Trang 33Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 65
Arrange Icons WM_MDIICONARRANGE
Close All X ử lý enum
SendMessage(hwndMDIClient, WM_MDIDESTROY,
(WPARAM) hMDIWnd, 0L);
return 1;
}
Trang 34Winter 2010Windows Programming - User Interface - Nguyen Tri Tuan - DH.KHTN Tp.HCM 67
MDI - Các v ấ n đề khác…(tt)
Child window data
V ớ i MDI, user có th ể m ở nhi ề u child window, m ỗ i child
window th ườ ng c ầ n l ư u tr ữ các d ữ li ệ u riêng
C ầ n có gi ả i pháp giúp qu ả n lý data c ủ a m ỗ i child
window m ộ t cách hi ệ u qu ả ?
MDI - Các v ấ n đề khác…(tt)
Gi ả i pháp qu ả n lý child window data:
S ử d ụ ng các byte m ở r ộ ng dành riêng cho m ỗ i child
window
wc.cbWndExtra = CB_CHILDEXTRA; // 4,8,12… bytes
Caáu truùc thoâng tin 1