LLậập trp trìình trên môi trư
ng Windows nh trên môi trườờng Windows
P TRÌNH VISUAL C++ KKỸỸ THUTHUẬẬT LT LẬẬP TRÌNH VISUAL C++ (MFC) (MFC)
NNộội dung tr
i dung trìình bnh bààyy
u tiên nh MFC đầầu tiên
MFC i thiệệu vu vềề MFC Chương trìình MFC đ
Keyboard lý Mouse vàà Keyboard
•• GiGiớới thi •• Chương tr •• XXửử lý Mouse v •• MMộột st sốố llớớp thưp thườờng gng gặặp: CWnd, CString,.. p: CWnd, CString,.. •• CCáác control thư c control thườờng gng gặặpp c dialog thườờng gng gặặpp •• CCáác dialog thư lý menu •• XXửử lý menu
1
GiGiớới thi
i thiệệu vu vềề MFCMFC
•• MFC lMFC làà ggìì ??
•• MMộột st sốố ttíính năng c
nh năng củủa MFC qua t
ng version a MFC qua từừng version
•• CCáác thc thàành ph
ng trong VC++ nh phầần cn củủa 1 a 1 ứứng dng dụụng trong VC++
GiGiớới thi i thiệệu vu vềề MFCMFC MFC lMFC làà ggìì ??
t thư việện cn cáác lc lớớp hưp hướớng đng đốối tưi tượợng dng dùùng cho vi
nh trên ng cho việệc lc lậập trp trìình trên
•• LLàà mmộột thư vi Windows. Windows.
•• ĐưĐượợc xây d
c xây dựựng trên cơ s
ng trên cơ sởở ccáác hc hààm thư vi
m thư việện API c
n API củủa Windows a Windows
•• Version 6 c
Version 6 cóó khokhoảảng 200 l
ng 200 lớớpp
•• GiGiúúp cho ngư
p cho ngườời li lậập trp trìình cnh cóó ththểể xây d
i việệc sc sửử ddụụng đơn thu
c hơn so vớới vi
xây dựựng ng ứứng dng dụụng nhanh v ng đơn thuầần cn cáác hc hààm thư vi
ng nhanh vàà íít tt tốốn n n API m thư việện API
công sứức hơn so v công s a Windows ccủủa Windows
•• Ta vTa vẫẫn cn cóó ththểể ggọọi ci cáác hc hààm Windows API trong c
ng MFC m Windows API trong cáác c ứứng dng dụụng MFC
2
GiGiớới thi i thiệệu vu vềề MFCMFC MFC lMFC làà ggìì ??
ng không gọọi hi hààm m ta thườờng không g ng MFC, ta thư •• Trong 1
Trong 1 ứứng dng dụụng MFC, Windows API trựực tic tiếếp, mp, màà ssẽẽ ttạạo co cáác đc đốối tưi tượợng tng từừ nhnhữững ng Windows API tr llớớp cp củủa MFC, v a MFC, vàà ggọọi phương th i phương thứức cc củủa đa đốối tưi tượợng đng đóó
•• Đa sĐa sốố ccáác phương th c phương thứức cc củủa nha nhữững lng lớớp MFC c ng tên p MFC cóó ccùùng tên m Windows API vvớới nhi nhữững hng hààm Windows API
•• MFC tMFC tạạo ra mo ra mộột Application Framework, gi t Application Framework, giúúp:p: – Thiết lập kiến trúc của ứng dụng một cách nhất quán và khoa
học
– Che dấu đi nhiều phần chi tiết mà Windows API đòi hỏi, giúp
lập trình viên “thảnh thơi” hơn
i thiệệu vu vềề MFCMFC
GiGiớới thi MMộột st sốố ttíính năng c
a MFC nh năng củủa MFC
3
Version 1: •• Version 1: – Các lớp List, Array, String, Time, Date, File access,… – Các lớp giao diện cơ bản – MDI, OLE 1.0 Version 2: •• Version 2: – File open, save – Print preview, printing – Scrolling window, Splitter window – Toolbar, Statusbar – Truy xuất được đến các control của VB – Trợ giúp theo ngữ cảnh (Context-sensitive help) – DLL
i thiệệu vu vềề MFCMFC
GiGiớới thi MMộột st sốố ttíính năng c
a MFC nh năng củủa MFC
Version 2.5: •• Version 2.5: – Hỗ trợ ODBC (Open Database Connectivity), cho phép truy
xuất đến các CSDL Access, FoxPro, SQL Server,…
– OLE 2.01 Version 3: •• Version 3: – Hỗ trợ tab dialog (property sheet) – Docking control bar Version 3.1: •• Version 3.1: – Hỗ trợ các control chuẩn của Windows 95 – ODBC level 2 with Access Jet database engine – Các lớp Winsock phục vụ lập trình TCP/IP
i thiệệu vu vềề MFCMFC
GiGiớới thi MMộột st sốố ttíính năng c
a MFC nh năng củủa MFC
4
Version 4.0: •• Version 4.0: – ADO (Data Access Object) – Windows 95 docking control bar – Bổ sung thêm lớp TreeView và RichEdit – Các lớp đồng bộ hoá các tiểu trình Version 4.2: •• Version 4.2: – Các lớp WinInet – Các lớp ActiveX document server – Các tính năng mở rộng của ActiveX control – Tăng cường một số khả năng của ODBC
i thiệệu vu vềề MFCMFC
GiGiớới thi MMộột st sốố ttíính năng c
a MFC nh năng củủa MFC
Version 6: •• Version 6: – Hỗ trợ các lớp cho những control chuẩn trong IE
4.0
– Hỗ trợ Dynamic HTML, cho phép tạo lập động các trang HTML
– Active Document Containment, cho phép ứng dụng MFC có thể chứa các Active Document
– OLE DB và ADO
i thiệệuu
GiGiớới thi CCáác thc thàành ph
nh phầần cn củủa 1 a 1 ứứng dng dụụngng
5
Chương trìình MFC đ Chương tr
u tiên nh MFC đầầu tiên
ng MFC •• TTạạo o ứứng dng dụụng bng bằằng cng cáách sch sửử ddụụng MFC
AppWizard AppWizard
•• CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr ng MFC AppWizard TTạạo o ứứng dng dụụng bng bằằng MFC AppWizard
Visual Studio 6.0
6
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr ng MFC AppWizard TTạạo o ứứng dng dụụng bng bằằng MFC AppWizard
Visual Studio 2005
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr ng MFC AppWizard TTạạo o ứứng dng dụụng bng bằằng MFC AppWizard
Visual Studio 6.0
7
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr ng MFC AppWizard TTạạo o ứứng dng dụụng bng bằằng MFC AppWizard
Visual Studio 2005
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
•• CCáác file chương tr
c file chương trìình: (xxx l
tên project) nh: (xxx làà tên project)
– xxx.h: header file của file xxx.cpp, chứa khai báo lớp CxxxApp để quản lý toàn bộ ứng dụng. Lớp CxxxApp kế thừa từ lớp CWinApp của MFC
– xxxDlg.h: header file của file xxxDlg.cpp, chứa khai báo lớp
CxxxDlg để quản lý cửa sổ Dialog giao diện của ứng dụng. Lớp CxxxDlg kế thừa từ lớp CDialog của MFC
– Resource.h: header file, chứa các hằng ID của các resource được
định nghĩa trong file xxx.rc
– xxxDlg.cpp: cài đặt các hàm thành phần của lớp CxxxDlg – xxx.cpp: cài đặt các hàm thành phần của lớp CxxxApp – xxx.rc: mô tả các resource (tài nguyên) của ứng dụng
8
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
Visual Studio 6.0
Visual Studio 2005
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
a MFC đểể ququảản lý n lý ứứng dng dụụng. Ch
ng. Chứứa đa đựựng vòng l
ng vòng lặặp p
•• CWinApp: l
i message đếến cn cáác cc cửửa sa sổổ ccủủa a ứứng dng dụụngng
phân phốối message đ
CWinApp: lớớp chp chíính cnh củủa MFC đ nhnhậận message v n message vàà phân ph p CWinApp. CDemoApp: lớớp kp kếế ththừừa ta từừ llớớp CWinApp.
•• CDemoApp: l class CMFC01App : public CWinApp class CMFC01App : public CWinApp {{ public: public:
CMFC01App(); CMFC01App();
// Overrides // Overrides public: public: virtual BOOL InitInstance(); virtual BOOL InitInstance();
// Implementation // Implementation
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
};};
9
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
••
ng, override lên hààm chum chuẩẩn cn củủa la lớớp p
CxxxApp::::InitInstance
InitInstance()()
InitInstance(): hààm khm khởởi ti tạạo o ứứng dng dụụng, override lên h InitInstance(): h CWinApp CWinApp BOOL CxxxApp BOOL {{
CDemoDlg dlg; CDemoDlg dlg; m_pMainWnd = &dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); int nResponse = dlg.DoModal(); if (nResponse == IDOK) if (nResponse == IDOK) {{ with OK // TODO: Place code here to handle when the dialog is dismissed with OK // TODO: Place code here to handle when the dialog is dismissed }} else if (nResponse == IDCANCEL) else if (nResponse == IDCANCEL) {{ }} t the // Since the dialog has been closed, return FALSE so that we exit the // Since the dialog has been closed, return FALSE so that we exi // application, rather than start the application's message pump.p. // application, rather than start the application's message pum return FALSE;; return FALSE
}}
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
a MFC đểể ququảản lý c
n lý cáác loc loạại ci cửửa a
•• CWnd: l
giao diệện. Cn. Cóó nhinhiềều lu lớớp đưp đượợc kc kếế ththừừa ta từừ llớớp p
c nhau n lý cáác loc loạại ci cửửa sa sổổ khkháác nhau
CWnd: lớớp chp chíính cnh củủa MFC đ ssổổ giao di nnàày đy đểể ququảản lý c (CTreeCtrl, CListBox, CEdit,……)) (CTreeCtrl, CListBox, CEdit,
•• CDialog k
p cơ bảản đưn đượợc c
CDialog kếế ththừừa ta từừ llớớp CWnd, l ddùùng đng đểể hihiểển thn thịị ccáác dialog trên m
p CWnd, làà llớớp cơ b c dialog trên mààn hn hìình.nh.
10
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
i dialog sẽẽ ccóó tương
tương ứứng mng mộột lt lớớp CxxxDlg k
CDialog. p CxxxDlg kếế ththừừa ta từừ CDialog.
CMFC01Dlg : public
CDialog : public CDialog
•• MMỗỗi dialog s class CMFC01Dlg class {{ // Construction // Construction public: public:
CMFC01Dlg(CWnd* pParent = NULL); CMFC01Dlg(CWnd* pParent = NULL);
// standard constructor // standard constructor
// Dialog Data // Dialog Data
enum { IDD = IDD_MFC01_DIALOG }; enum { IDD = IDD_MFC01_DIALOG }; protected: protected: // DDX/DDV support virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support virtual void DoDataExchange(CDataExchange* pDX);
// Implementation // Implementation protected: protected:
HICON m_hIcon; HICON m_hIcon; // Generated message map functions // Generated message map functions virtual BOOL OnInitDialog(); virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
};};
u tiên nh MFC đầầu tiên
Chương trìình MFC đ Chương tr CCáác thc thàành ph
nh phầần cn củủa chương tr
a chương trììnhnh
p CDemoDlg: •• MMộột st sốố hhààm cm củủa la lớớp CDemoDlg:
• Khởi tạo các giá trị cần thiết cho dialog, được gọi khi dialog
sắp được hiển thị.
• Hàm xử lý cho thông điệp WM_INITDIALOG
– OnInitDialog:
• Được gọi khi cần cập nhật nội dung cho dialog (vẽ lại màn
hình).
• Hàm xử lý cho thông điệp WM_PAINT.
11
– OnPaint:
Message Map Message Map
•• LLààm sao đ
m sao đểể xxửử lý
lý 1 t1 thông đi
hông điệệp ?p ? – MFC dùng Message Map để liên kết các thông điệp
với những hàm thành phần của lớp cửa sổ.
Message Map Message Map
BEGIN_MESSAGE_MAP(CMFC01Dlg, CDialog)
ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP END_MESSAGE_MAP()
i thông điệệp sp sẽẽ đư đượợc xc xửử lý blý bởởi 1 h i 1 hààm thm thàành ph nh phầần n •• MMỗỗi thông đi tương ứứngng tương
12
1 macro đư macro đượợc đc địịnh ngh a trong nh nghĩĩa trong c nhiên liên kếết thông đi t thông điệệp WM_PAINT v p WM_PAINT vớới i ON_WM_PAINT làà 1 •• ON_WM_PAINT l Afxmsg_.h, mặặc nhiên liên k Afxmsg_.h, m m OnPaint hhààm OnPaint
XXửử lý thông đi
lý thông điệệpp
•• Thêm x
p WM_LBUTTONDOWN lý thông điệệp WM_LBUTTONDOWN Thêm xửử lý thông đi – Bổ sung thêm khai báo hàm xử lý thông điệp afx_msg void OnLButtonDown(UINT nFlags, CPoint point); – Bổ sung 1 macro trong khai báo message map ON_WM_LBUTTONDOWN() – Viết hàm thực thi OnLButtonDown
void CMFC01Dlg::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default MessageBox(_T("Nhan phim trai chuoi"), _T("Thong bao"), MB_OK); CDialog::OnLButtonDown(nFlags, point);
}
XXửử lý thông đi
lý thông điệệpp
ng ClassWizard •• SSửử ddụụng ClassWizard (Ctrl--W)W) (Ctrl
Visual Studio 6.0
13
•• Click chu Click chuộột pht phảải, chi, chọọn n ClassWizard ClassWizard
XXửử lý thông đi
lý thông điệệpp
Messages •• ChChọọn phn phầần n Messages p thoạại i trong hộộp tho trong h Properties.. Properties
Visual Studio 2005
•• ChChọọn đn đúúng thông đi ng thông điệệp cp cầần n xxửử lý.lý.
XXửử lý mouse v
keyboard lý mouse vàà keyboard
lý mouse •• XXửử lý mouse
lý keyboard •• XXửử lý keyboard
– Thông điệp của mouse – Ví dụ: Vẽ hình bằng mouse
14
– Thông điệp của keyboard
lý mouse XXửử lý mouse a mouse c thông điệệp cp củủa mouse CCáác thông đi
•• WM_LBUTTONDOWN WM_LBUTTONDOWN •• WM_LBUTTONUP WM_LBUTTONUP WM_LBUTTONDBLCLK •• WM_LBUTTONDBLCLK •• WM_RBUTTONDOWN WM_RBUTTONDOWN WM_RBUTTONUP •• WM_RBUTTONUP WM_RBUTTONDBLCLK •• WM_RBUTTONDBLCLK WM_MOUSEMOVE •• WM_MOUSEMOVE WM_MOUSEWHEEL •• WM_MOUSEWHEEL
lý mouse XXửử lý mouse a mouse c thông điệệp cp củủa mouse CCáác thông đi
•• VVớới mi mỗỗi thông đi
a chuộột, Windows g
t, Windows gởởi ki kèèm 2 m 2
i thông điệệp cp củủa chu lParam wParam vàà lParam tham sốố wParam v tham s – wParam: cho biết phím nào đang được nhấn (Ctrl,
Shift)
• LOWORD(lParam): tọa độ x • HIWORD(lParam): tọa độ y
15
– lParam: cho biết toạ độ hiện tại
lý mouse XXửử lý mouse a mouse c thông điệệp cp củủa mouse CCáác thông đi
Thông điệệpp Thông đi
Map Macro Message--Map Macro Message
HHààm xm xửử lý thông đi
lý thông điệệpp
WM_LBUTTONDOWN WM_LBUTTONDOWN
ON_WM_LBUTTONDOWN ON_WM_LBUTTONDOWN
OnLButtonDown OnLButtonDown
WM_LBUTTONUP WM_LBUTTONUP
ON_WM_LBUTTONUP ON_WM_LBUTTONUP
OnLButtonUp OnLButtonUp
WM_LBUTTONDBLCLK WM_LBUTTONDBLCLK
ON_WM_LBUTTONDBLCLK ON_WM_LBUTTONDBLCLK
OnLButtonDblClk OnLButtonDblClk
WM_MBUTTONDOWN WM_MBUTTONDOWN
ON_WM_MBUTTONDOWN ON_WM_MBUTTONDOWN
OnMButtonDown OnMButtonDown
WM_MBUTTONUP WM_MBUTTONUP
ON_WM_MBUTTONUP ON_WM_MBUTTONUP
OnMButtonUp OnMButtonUp
WM_MBUTTONDBLCLK WM_MBUTTONDBLCLK
ON_WM_MBUTTONDBLCLK ON_WM_MBUTTONDBLCLK
OnMButtonDblClk OnMButtonDblClk
WM_RBUTTONDOWN WM_RBUTTONDOWN
ON_WM_RBUTTONDOWN ON_WM_RBUTTONDOWN
OnRButtonDown OnRButtonDown
WM_RBUTTONUP WM_RBUTTONUP
ON_WM_RBUTTONUP ON_WM_RBUTTONUP
OnRButtonUp OnRButtonUp
WM_RBUTTONDBLCLK WM_RBUTTONDBLCLK
ON_WM_RBUTTONDBLCLK ON_WM_RBUTTONDBLCLK
OnRButtonDblClk OnRButtonDblClk
WM_MOUSEMOVE WM_MOUSEMOVE
ON_WM_MOUSEMOVE ON_WM_MOUSEMOVE
OnMouseMove OnMouseMove
lý mouse XXửử lý mouse a mouse c thông điệệp cp củủa mouse CCáác thông đi
lý thông điệệp cho mouse c
•• CCáác hc hààm xm xửử lý thông đi afx_msg void OnMsgName afx_msg void On
p cho mouse cóó ddạạng:ng: (UINT nFlags, CPoint MsgName (UINT nFlags, CPoint
point) point) – point: thuộc lớp CPoint, chỉ vị trí của trỏ chuột. Gốc toạ độ được xác định theo góc trái trên của cửa sổ – nFlags: trạng thái của các phím chuột và các phím
16
Ctrl, Alt.
lý mouse XXửử lý mouse a mouse c thông điệệp cp củủa mouse CCáác thông đi
•• SSửử ddụụng ph
ng phéép top toáán n && đ đểể kikiểểm tra m
m tra mộột trt trạạng th
ng tháái i
ccóó ttồồn tn tạại không i không – Ví dụ: nFlags & MK_CONTROL khác 0 kiểm tra phím
Ctrl được nhấn
GiGiáá trtrịị
Ý nghÝ nghĩĩaa
PhPhíím trm tráái chu
MK_LBUTTON MK_LBUTTON
i chuộột đưt đượợc nhc nhấấnn
MK_MBUTTON MK_MBUTTON
PhPhíím gim giữữa chu
a chuộột đưt đượợc nhc nhấấnn
MK_RBUTTON MK_RBUTTON
PhPhíím phm phảải chu
i chuộột đưt đượợc nhc nhấấnn
MK_CONTROL MK_CONTROL
PhPhíím Ctrl đư
m Ctrl đượợc nhc nhấấnn
MK_SHIFT MK_SHIFT
PhPhíím Shift đư
m Shift đượợc nhc nhấấnn
XXửử lý mouse lý mouse VVíí ddụụ minh h
minh họọaa
ng mouse •• VVíí ddụụ: V: Vẽẽ hhìình bnh bằằng mouse
17
hi ngườời si sửử ddụụng nh ng nhấấn gin giữữ nnúút trt tráái chu t & di i chuộột & di •• Mô tMô tảả: k: khi ngư chuyểển vn vẽẽ 1 chuy 1 đưđườờng th ng thẳẳngng
XXửử lý mouse lý mouse VVíí ddụụ minh h
minh họọaa
– WM_LBUTTONDOWN : OnLButtonDown – WM_MOUSEMOVE : OnMouseMove
n thiếết:t: •• CCáác xc xửử lý clý cầần thi
– Định nghĩa 2 biến m_PrevX, m_PrevY trong class CxxxDlg – Định nghĩa hàm xử lý message WM_LBUTTONDOWN trong
•• CCáác bưc bướớc thc thựực hic hiệện:n:
class CxxxDlg
– Định nghĩa hàm xử lý message WM_MOUSEMOVE trong
class CxxxDlg
XXửử lý mouse lý mouse VVíí ddụụ minh h
minh họọaa
•• ViViếết code cho h t code cho hààm xm xửử lý thông đi lý thông điệệp nhp nhấấn trn tráái chu i chuộộtt
void CMouseProcessingDlg::OnLButtonDown(UINT nFlags,
CPoint point)
{
// TODO: Add your message handler code here and/or // call default m_PrevX = point.x; m_PrevY = point.y; CDialog::OnLButtonDown(nFlags, point);
}
18
XXửử lý mouse lý mouse VVíí ddụụ minh h
minh họọaa
void CMouseProcessingDlg::OnMouseMove(UINT nFlags, CPoint point) void CMouseProcessingDlg::OnMouseMove(UINT nFlags, CPoint point) {{
i đang nhấấnn
// TODO: Add your message handler code here and/or call default // TODO: Add your message handler code here and/or call default t đang di chuyểển vn vớới phi phíím trm tráái đang nh //Chuộột đang di chuy //Chu if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { nh thiếết bt bịị đ đểể vvẽẽ
ng thẳẳng tng từừ đi
điểểm trưm trướớc đc đóó đ đếến đin điểểm him hiệện tn tạạii
Lưu điểểm him hiệện tn tạại li lạạii
// L// Lấấy ngy ngữữ ccảảnh thi CClientDC dc(this); CClientDC dc(this); // V// Vẽẽ mmộột đưt đườờng th dc.MoveTo(m_PrevX, m_PrevY); dc.MoveTo(m_PrevX, m_PrevY); dc.LineTo(point.x, point.y); dc.LineTo(point.x, point.y); // // Lưu đi m_PrevX = point.x; m_PrevX = point.x; m_PrevY = point.y; m_PrevY = point.y;
}} CDialog::OnMouseMove(nFlags, point); CDialog::OnMouseMove(nFlags, point);
}}
XXửử lý mouse lý mouse VVíí ddụụ minh h
minh họọaa
19
•• Biên d Biên dịịch vch vàà chchạạy thy thửử
lý keyboard XXửử lý keyboard
•• Thông đi
a keyboard Thông điệệp cp 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
• Hàm xử lý tương ứng: CWnd::OnKeyDown, CWnd::OnKeyUp • 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
• Hàm xử lý tương ứng: CWnd::OnChar • 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,…)
lý keyboard XXửử lý keyboard
•• CCáác hc hààm xm xửử lý thông đi
lý thông điệệp liên quan đ
p liên quan đếến bn bààn phn phíím m
ccóó ddạạng:ng:
(UINT nChar, UINT MsgName (UINT nChar, UINT
afx_msg void OnMsgName afx_msg void On nRepCnt, UINT nFlags) nRepCnt, UINT nFlags) – nChar: mã phím ảo được nhấn hoặc thả – nRepCnt: số lần nhấn/thả phím tương ứng – nFlags: cờ liên quan (xem thêm trong MSDN)
20
lý keyboard XXửử lý keyboard
•• Mã phMã phíím m ảảoo
Mã phMã phíím m ảảoo
PhPhíím tương
m tương ứứngng
,VK_F12 VK_F1,……,VK_F12 VK_F1,
1_F12 c năng F1_F12
PhPhíím chm chứức năng F
,VK_NUMPAD9 VK_NUMPAD0,……,VK_NUMPAD9 VK_NUMPAD0,
PhPhíím sm sốố 0 0,..,
,.., 9 (9 (Numlock đư
Numlock đượợc bc bậật)t)
VK_CANCEL VK_CANCEL
CtrlCtrl--BreakBreak
VK_RETURN VK_RETURN
Enter Enter
VK_BACK VK_BACK
Backspace Backspace
VK_TAB VK_TAB
TabTab
VK_CLEAR VK_CLEAR
PhPhíím sm sốố 5 (Num Lock t
5 (Num Lock tắắt)t)
VK_SHIFT VK_SHIFT
Shift Shift
VK_CONTROL VK_CONTROL
CtrlCtrl
VK_MENU VK_MENU
AltAlt
VK_PAUSE VK_PAUSE
Pause Pause
VK_ESCAPE VK_ESCAPE
EscEsc
lý keyboard XXửử lý keyboard
•• Mã phMã phíím m ảảoo
Mã phMã phíím m ảảoo
PhPhíím tương
m tương ứứngng
VK_SPACE VK_SPACE
Spacebar Spacebar
VK_PRIOR VK_PRIOR
PgUp Page Up vàà PgUp Page Up v
VK_NEXT VK_NEXT
PgDn Page Down vàà PgDn Page Down v
VK_END VK_END
EndEnd
VK_HOME VK_HOME
HomeHome
VK_LEFT VK_LEFT
Left arrow Left arrow
VK_UP VK_UP
Up arrow Up arrow
VK_RIGHT VK_RIGHT
Right arrow Right arrow
VK_DOWN VK_DOWN
Down arrow Down arrow
VK_SNAPSHOT VK_SNAPSHOT
Print Screen Print Screen
VK_INSERT VK_INSERT
Insert vàà InsIns Insert v
VK_DELETE VK_DELETE
Delete vàà DelDel Delete v
21
lý keyboard XXửử lý keyboard
•• Mã phMã phíím m ảảoo
Mã phMã phíím m ảảoo
PhPhíím tương
m tương ứứngng
VK_MULTIPLY VK_MULTIPLY
m * (bên phảải)i)
PhPhíím * (bên ph
VK_ADD VK_ADD
PhPhíím + (bên ph
m + (bên phảải)i)
VK_SUBTRACT VK_SUBTRACT
PhPhíím m –– (bên ph
(bên phảải)i)
VK_DECIMAL VK_DECIMAL
PhPhíím . (bên ph
m . (bên phảải)i)
VK_DIVIDE VK_DIVIDE
PhPhíím / (bên ph
m / (bên phảải)i)
VK_CAPITAL VK_CAPITAL
Caps Lock Caps Lock
VK_NUMLOCK VK_NUMLOCK
Num Lock Num Lock
VK_SCROLL VK_SCROLL
Scroll Lock Scroll Lock
VK_LWIN VK_LWIN
PhPhíím Windows (tr
m Windows (tráái)i)
VK_RWIN VK_RWIN
PhPhíím Windows (ph
m Windows (phảải)i)
VK_APPS VK_APPS
m Menu PhPhíím Menu
lý keyboard XXửử lý keyboard
•• CCáác phc phíím Am A--Z, aZ, a--z, 0z, 0--9 c9 cóó mã phmã phíím m ảảo mang gi
o mang giáá
trtrịị ANSI c ANSI củủa pha phíím.m. – 0x41 – 0x5A : A-Z – 0x61 – 0x7A : a-z – 0x30 – 0x39 : 0-9
22
lý keyboard XXửử lý keyboard
m Ctrl, Shift, Num Lock, CapsLock, ng tháái ci cáác phc phíím Ctrl, Shift, Num Lock, CapsLock,
•• LLấấy try trạạng th Scroll Lock Scroll Lock – Các trạng thái này không được gửi kèm với thông điệp bàn
phím
– Sử dụng hàm ::GetKeyState để lấy trạng thái – Ví dụ:
• ::GetKeyState (VK_SHIFT) • ::GetKeyState (VK_CONTROL) • if ((nChar == VK_LEFT) && (::GetKeyState (VK_CONTROL) < 0)) { } • ::GetKeyState (VK_NUMLOCK) & 0x01
MMộột st sốố llớớp thưp thườờng gng gặặpp
p CWnd •• LLớớp CWnd
p CString •• LLớớp CString
23
LLớớp CWnd p CWnd GiGiớới thi
i thiệệuu
•• Đây lĐây làà mmộột lt lớớp tp tổổng qu
ng quáát vt vàà ggặặp rp rấất nhi
t nhiềều lu lầần n c trên dialog nóói riêng v
i riêng vàà
trong quáá trtrìình lnh lààm vim việệc trên dialog n trong qu trên cáác c ứứng dng dụụng MFC n trên c
i chung. ng MFC nóói chung.
n cho c năng cơ bảản cho
•• LLớớp CWnd cung c
p CWnd cung cấấp cp cáác chc chứức năng cơ b
c control, mainframe, ttấất ct cảả ccáác lc lớớp cp cửửa sa sổổ (c(cáác control, mainframe, view, dialog……) t) trong thư vi view, dialog
n MFC. rong thư việện MFC.
LLớớp CWnd p CWnd CCáác hc hààm cơ b
p CWnd m cơ bảản cn củủa la lớớp CWnd
24
GetDlgItem •• GetDlgItem EnableWindow •• EnableWindow •• GetFocus GetFocus SetFocus •• SetFocus •• GetClientRect GetClientRect •• MoveWindow MoveWindow GetDlgCtrlID •• GetDlgCtrlID GetDlgItemInt •• GetDlgItemInt •• GetDlgItemText GetDlgItemText •• SetDlgItemText SetDlgItemText GetWindowText •• GetWindowText SetWindowText •• SetWindowText
p CWnd m cơ bảản cn củủa la lớớp CWnd
CCáác hc hààm cơ b m CWnd::GetDlgItem HHààm CWnd::GetDlgItem
•• CWnd*
(int nID ) const; GetDlgItem(int nID ) const;
CWnd* GetDlgItem – Trả về con trỏ CWnd* của một cửa sổ con trên 1
CWnd *pWnd; pWnd = this->GetDlgItem(IDC_EDIT1);
dialog. – Ví dụ :
CCáác hc hààm cơ b p CWnd m cơ bảản cn củủa la lớớp CWnd m CWnd::EnableWindow HHààm CWnd::EnableWindow
BOOL EnableWindow(BOOL bEnable = TRUE ); BOOL EnableWindow(BOOL bEnable = TRUE );
– Làm cho cửa sổ có thể/không thể bị tác động bởi chuột/bàn phím
CWnd* pWnd = this->GetDlgItem(edt1); pWnd->EnableWindow(FALSE);
pWnd = this->GetDlgItem(stc3); pWnd->EnableWindow(TRUE);
25
– Ví dụ:
CCáác hc hààm cơ b m cơ bảản cn củủa la lớớp CWnd p CWnd m CWnd::GetFocus HHààm CWnd::GetFocus
static CWnd* PASCAL GetFocus( ); •• static CWnd* PASCAL GetFocus( ); – Trả về con trỏ CWnd của control đang được nhận
tác động.
CWnd* pWnd; pWnd = this->GetFocus();
– Ví dụ:
CCáác hc hààm cơ b m cơ bảản cn củủa la lớớp CWnd p CWnd m CWnd::SetFocus HHààm CWnd::SetFocus
CWnd* SetFocus( ); CWnd* SetFocus( );
– Đặt focus cho một đối tượng cửa sổ. – Trả về con trỏ CWnd* của cửa sổ nhận focus trước đó.
CWnd* pWnd; pWnd = GetDlgItem(IDC_EDIT1); pWnd->SetFocus();
26
– Ví dụ:
CCáác hc hààm cơ b p CWnd m cơ bảản cn củủa la lớớp CWnd m CWnd::GetClientRect HHààm CWnd::GetClientRect
void GetClientRect (LPRECT lpRect) const; •• void GetClientRect (LPRECT lpRect) const; – Xác định toạ độ của hình chữ nhật bao quanh cửa
CRect rect; pWnd->GetClientRect(&rect);
RECT rect; pWnd->GetClientRect(&rect);
sổ. – Ví dụ :
CCáác hc hààm cơ b p CWnd m cơ bảản cn củủa la lớớp CWnd m CWnd::MoveWindow HHààm CWnd::MoveWindow
•• void MoveWindow(int x, int y, int nWidth,int nHeight, BOOL bRepa
int void MoveWindow(int x, int y, int nWidth,int nHeight, BOOL bRepaint = TRUE ); = TRUE ); void MoveWindow(LPCRECT lpRect,BOOL bRepaint = TRUE); •• void MoveWindow(LPCRECT lpRect,BOOL bRepaint = TRUE);
– Dịch chuyển, thay đổi kích cỡ một cửa sổ – Ví dụ :
this->MoveWindow(100,100,400,400);
CRect rect; rect.top = 100; rect.left = 100; rect.right = 500; rect.bottom = 500; this->MoveWindow(&rect);
27
CCáác hc hààm cơ b HHààm CWnd::
m cơ bảản cn củủa la lớớp CWnd p CWnd m CWnd::GetDlgCtrlID GetDlgCtrlID
int GetDlgCtrlID( ) const; •• int GetDlgCtrlID( ) const; – Xác định ID của một control trên dialog. – Ví dụ: int ID; ID = pWnd->GetDlgCtrlID();
CCáác hc hààm cơ b p CWnd m cơ bảản cn củủa la lớớp CWnd m CWnd::GetDlgItemText HHààm CWnd::GetDlgItemText
int GetDlgItemText(int nID, LPTSTR lpStr, int int GetDlgItemText(int nID, LPTSTR lpStr, int
nMaxCount) const; nMaxCount) const;
int GetDlgItemText(int nID, CString& rString) const; int GetDlgItemText(int nID, CString& rString) const;
CString str; this->GetDlgItemText(IDC_EDIT1, str); // str sẽ mang nội dung của IDC_EDIT1
28
– Lấy chuỗi nội dung của 1 control. – Ví dụ : Lấy chuỗi nội dung của control có ID là IDC_EDIT1 trên dialog.
CCáác hc hààm cơ b p CWnd m cơ bảản cn củủa la lớớp CWnd m CWnd::SetDlgItemText HHààm CWnd::SetDlgItemText
void SetDlgItemText (int nID, LPCTSTR •• void SetDlgItemText (int nID, LPCTSTR lpszString); lpszString);
– Đặt chuỗi nội dung cho một control trên dialog.
CCáác hc hààm cơ b p CWnd m cơ bảản cn củủa la lớớp CWnd m CWnd::GetWindowText HHààm CWnd::GetWindowText
••
– Lấy chuỗi nội dung cho một đối tượng cửa sổ – Ví dụ : Lấy nội dung cho đối tượng cửa sổ có ID là IDC_TEXT
CWnd * pWnd; CString str; pWnd = GetDlgItem(IDC_TEXT); pWnd->GetWindowText(str);
29
int GetWindowText ( LPTSTR lpszStringBuf, int int GetWindowText ( LPTSTR lpszStringBuf, int nMaxCount ) const; nMaxCount ) const; void GetWindowText(CString& rString) const; •• void GetWindowText(CString& rString) const;
CCáác hc hààm cơ b p CWnd m cơ bảản cn củủa la lớớp CWnd m CWnd::SetWindowText HHààm CWnd::SetWindowText
void SetWindowText(LPCTSTR lpszString ); •• void SetWindowText(LPCTSTR lpszString );
– Thiết lập chuỗi nội dung cho một đối tượng cửa sổ – Ví dụ : Đặt chuỗi nội dung cho đối tượng cửa sổ có
ID là IDC_TEXT CWnd * pWnd; CString str; pWnd = GetDlgItem(IDC_TEXT); pWnd->SetWindowText(_T(“Hi ! Hello”));
LLớớp CString p CString GiGiớới thi
i thiệệuu
n trong MFC tương tựự
i cơ bảản trong MFC tương t ng quảản lý n lý nhưng tựự đ độộng qu
CString làà llớớp chu •• CString l như char * t* trong C/C++ như char kkíích thư
p chuỗỗi cơ b rong C/C++ nhưng t ch thướớc vc vàà ccấấp php pháát vt vùùng nh
ng nhớớ..
30
LLớớp CString p CString CCáác thao t
c thao táác cơ b
c cơ bảảnn
n: operator =, += •• PhPhéép gp gáán: operator =, +=
•• CCộộng chu
i: operator + ng chuỗỗi: operator +
nh: operator ==, <=, >=, <, >, != •• So sSo sáánh: operator ==, <=, >=, <, >, !=
: operator [], hààm GetAt(), h
m GetAt(), hààm m
•• Truy xu Truy xuấất pht phầần tn tửử: operator [], h SetAt() SetAt()
LLớớp CString p CString CCáác thao t
c thao táác khc kháácc
Empty, IsEmpty •• Empty, IsEmpty Format •• Format Find, ReverseFind •• Find, ReverseFind GetLength •• GetLength Left, Right, Mid •• Left, Right, Mid TrimLeft, TrimRight •• TrimLeft, TrimRight MakeLower, MakeUpper, MakeReverse •• MakeLower, MakeUpper, MakeReverse Delete •• Delete Replace •• Replace
31
p CString m cơ bảản cn củủa la lớớp CString
CCáác hc hààm cơ b PhPhéép gp gáán, phn, phéép cp cộộng chu
ng chuỗỗii
n: operator =, += •• PhPhéép gp gáán: operator =, += •• CCộộng chu i: operator + ng chuỗỗi: operator + •• VVíí ddụụ::
CString str, strNew; str = _T("Hello“); str += _T(", world!“); strNew = str + _T(" Nice to meet you");
CCáác hc hààm cơ b CCáác thao t
p CString m cơ bảản cn củủa la lớớp CString c so sáánhnh c thao táác so s
•• So sSo sáánh: operator ==, <=, >=, <, >, != nh: operator ==, <=, >=, <, >, != •• VVíí ddụụ::
CString s1( _T("Tom") ); CString s2( _T("Jerry") ); if( s1 < s2 ) {
...
32
}
CCáác hc hààm cơ b m cơ bảản cn củủa la lớớp CString p CString Truy xuấất pht phầần tn tửử Truy xu
•• Truy xu
: operator [], hààm m
Truy xuấất pht phầần tn tửử: operator [], h m CString::SetAt() CString::GetAt(), hààm CString::SetAt() CString::GetAt(), h
•• VVíí ddụụ::
CString str; str = _T("Xin chao cac ban"); str.SetAt(1, str[3]); //str : “X n chao cac ban”
p CString m cơ bảản cn củủa la lớớp CString
CCáác hc hààm cơ b ChuChuỗỗi ri rỗỗngng
t chuỗỗi ri rỗỗngng
•• HHààm CString::Empty: t •• HHààm CString::IsEmpty: ki m CString::Empty: tạạo mo mộột chu m CString::IsEmpty: kiểểm tra xem m m tra xem mộột chu t chuỗỗi ci cóó rrỗỗng ng
không không •• VVíí ddụụ::
CString str;. str = _T("Hello"); str.Empty(); if (str.IsEmpty()) {
}
33
CCáác hc hààm cơ b ĐĐịịnh dnh dạạng chu
m cơ bảản cn củủa la lớớp CString p CString ng chuỗỗii
sprintf ccủủa Ca C
ng chuỗỗi theo mong mu
i theo mong muốốn.n.
•• Tương t Tương tựự hhààm m sprintf •• DDùùng đng đểể đ địịnh dnh dạạng chu •• VVíí ddụụ::
int X, Y; CString str, str1; str1 = _T("Ban vua nhan tai toa do") ; X = 100; Y = 200; str.Format(_T("%s %d, %d"), str1, X, Y);
p CString m cơ bảản cn củủa la lớớp CString
CCáác hc hààm cơ b TTììm kim kiếếmm
•• CString::Find CString::Find •• TTììm kim kiếếm vm vịị trtríí xuxuấất hi
t hiệện chu
n chuỗỗi con trong chu
i đã i con trong chuỗỗi đã
chocho
•• VVíí ddụụ::
int result;
34
CString s = _T("This is an example"); result = s.Find('i'); //kiem tu dau chuoi, result = 2 result = s.Find('i',3); // kiem tu vi tri thu 3, result = 5 result = s.Find(_T("is")); // kiem tu dau chuoi, result = 2
p CString m cơ bảản cn củủa la lớớp CString
CCáác hc hààm cơ b TTììm kim kiếếmm
•• CString::ReverseFind CString::ReverseFind •• TTììm kim kiếếm vm vịị trtríí xuxuấất hi
t hiệện cun cuốối ci cùùng cng củủa ký t
trong a ký tựự trong
chuchuỗỗii •• VVíí ddụụ::
int result; CString s = _T("This is an example"); result = s.ReverseFind('i'); //kiem tu nguoc lai, result = 5 result = s.ReverseFind('a');
p CString m cơ bảản cn củủa la lớớp CString
CCáác hc hààm cơ b XXáác đc địịnh chi
nh chiềều du dàài chu
i chuỗỗii
y chiềều du dàài ci củủa chu
i đã a chuỗỗi đã
•• CString::GetLength(): L
CString::GetLength(): Lấấy chi chocho •• VVíí ddụụ::
35
int result; CString s = _T"This is an example"); result = s.GetLength();// result = 18
p CString CCáác hc hààm cơ b m cơ bảản cn củủa la lớớp CString ch chuỗỗii CCáác hc hààm tm táách chu
CString CString::Left(int nCount) CString CString::Left(int nCount) CString CString::Right(int nCount) CString CString::Right(int nCount) CString CString::Mid(int Start, int nCount) CString CString::Mid(int Start, int nCount) •• VVíí ddụụ::
CString s = _T("Hello, how are you"); CString strL, strMid, strR; strL = s.Left(5); strMid = s.Mid(7,3); strR = s.Right(3);
p CString m cơ bảản cn củủa la lớớp CString
CCáác hc hààm cơ b LoLoạại bi bỏỏ ccáác ký t
c ký tựự đ đầầu, cuu, cuốối chu
i chuỗỗii
u chuỗỗii
•• HHààm CString::TrimLeft: lo •• HHààm CString::TrimRight: lo
m CString::TrimLeft: loạại bi bỏỏ ccáác ký t m CString::TrimRight: loạại bi bỏỏ ccáác ký t
c ký tựự đ đầầu chu c ký tựự cucuốối i
chuchuỗỗii •• VVíí ddụụ::
36
CString str; str = _T(" HHHHello, how are you "); str.TrimLeft(); str.TrimRight(); str.TrimLeft('H');
CCáác hc hààm cơ b m cơ bảản cn củủa la lớớp CString p CString Thay đổổi ni nộội dung chu Thay đ
i dung chuỗỗii
trong c ký tựự trong
•• CString::MakeLower: in t
•• CString::MakeUpper: VI
T HOA cáác ký t
trong c ký tựự trong
•• CString::MakeReverse:
o chuỗỗi theo chi
i theo chiềều u
CString::MakeLower: in thưhườờng cng cáác ký t chuchuỗỗii CString::MakeUpper: VIẾẾT HOA c chuchuỗỗii CString::MakeReverse: đ đảảo chu ngưngượợc lc lạạii
•• VVíí ddụụ::
CString s = _T("Hello, how are you"); s.MakeUpper();//HELLO, HOW ARE YOU s.MakeLower();//hello, how are you s.MakeReverse();//uoy era woh ,olleh
p CString CCáác hc hààm cơ b m cơ bảản cn củủa la lớớp CString n chuỗỗii XoXoáá mmộột pht phầần chu
•• CString::Delete: Xo
CString::Delete: Xoáá mmộột pht phầần chu
n chuỗỗii
•• VVíí ddụụ::
37
CString str; str = _T("Hello, how are you? "); str.Delete(5,1);
p CString CCáác hc hààm cơ b m cơ bảản cn củủa la lớớp CString i con t chuỗỗi con Thay thếế mmộột chu Thay th
•• CString::Replace : Thay th
t chuỗỗi con b
i con bằằng ng
CString::Replace : Thay thếế mmộột chu mmộột chu
t chuỗỗi con kh
i con kháácc
•• VVíí ddụụ::
CString str; str = _T("Alibaba"); str.Replace(_T("ba"), _T("ab"));
c control CCáác control
•• GiGiớới thi
i thiệệuu
•• Phân lo
Phân loạạii
•• SSửử ddụụng control
ng control –– VVíí ddụụ minh ho
minh hoạạ
38
CCáác control c control GiGiớới thi
i thiệệuu
•• Phiên b
ng 20 a Windows cóó khokhoảảng 20
Phiên bảản hin hiệện hn hàành cnh củủa Windows c i control. loloạại control.
•• 6 trong s
classic control (nhữững control ng control u tiên củủa Windows). Ch
phiên bảản đn đầầu tiên c
a Windows). Chứứa a
6 trong sốố đ đóó ggọọi li làà classic control (nh ccóó ttừừ phiên b trong User.exe trong User.exe
•• CCáác control còn l
c control còn lạại gi gọọi li làà common control common control. H. Hầầu u a trong Windows 95. Chứứa trong
t hiệện tn từừ Windows 95. Ch
hhếết xut xuấất hi comctl32.dll. comctl32.dll.
CCáác control c control GiGiớới thi
i thiệệuu
Progressbar •• Progressbar Slider •• Slider Tree Control •• Tree Control •• Tab Control Tab Control •• Animate Animate Rich Edit •• Rich Edit •• Date Time Date Time Month Calendar •• Month Calendar •• IP Address IP Address •• ……
39
•• Picture control Picture control •• Static Text Static Text •• Text box Text box Group Box •• Group Box Button •• Button •• Checkbox Checkbox Radio Button •• Radio Button •• Combo Box Combo Box •• List Box List Box Scrollbar •• Scrollbar •• SpinSpin
CCáác control c control Classic control Classic control
Classic control: •• Classic control: – Button – List box – Editbox – Combo box – Scroll bar – Static box
CCáác control c control Classic control Classic control
i button LoLoạại button
WNDCLASS WNDCLASS
p MFC LLớớp MFC
Button Button
"BUTTON" "BUTTON"
CButton CButton
List box List box
"LISTBOX" "LISTBOX"
CListBox CListBox
Edit control Edit control
"EDIT" "EDIT"
CEdit CEdit
Combo box Combo box
"COMBOBOX" "COMBOBOX"
CComboBox CComboBox
Scroll bar Scroll bar
"SCROLLBAR" "SCROLLBAR"
CScrollBar CScrollBar
Static control Static control
"STATIC" "STATIC"
CStatic CStatic
40
CCáác control c control SSửử ddụụng control
ng control -- VVíí ddụụ minh ho
minh hoạạ
•• CCáác hc hààm cm cầần quan tâm c
a CListBox: n quan tâm củủa CListBox:
– GetCount – GetCurSel, SetCurSel – AddString – DeleteString – GetText, GetTextLen – FindString, FindStringExact – InsertString – ResetContent
CCáác control c control SSửử ddụụng control
ng control -- VVíí ddụụ minh ho
minh hoạạ
•• CCáác hc hààm cm cầần quan tâm c
a CComboBox: n quan tâm củủa CComboBox:
41
– GetCount – GetCurSel, SetCurSel – AddString, DeleteString – GetLBText , GetLBTextLen – FindString, FindStringExact – InsertString – ResetContent
CCáác control c control SSửử ddụụng control
ng control -- VVíí ddụụ minh ho
minh hoạạ
•• LLấấy vy vịị trtríí đư đượợc chc chọọn cn củủa ma mộột ListBox c
t ListBox cóó ID l
ID làà
IDC_DANHSACH IDC_DANHSACH CListBox *pListBox; int nSelected; pListBox = (CListBox*) GetDlgItem
(IDC_DANHSACH);
nSelected = pListBox->GetCurSel();
CCáác dialog thư
c dialog thườờng gng gặặpp
•• Nguyên nhân ra đ
Nguyên nhân ra đờờii
•• CCáác loc loạại dialog thư
i dialog thườờng gng gặặpp
•• SSửử ddụụng bng bằằng thư vi
n MFC ng thư việện MFC
•• VVíí ddụụ minh ho
minh hoạạ
42
c dialog thườờng gng gặặpp
CCáác dialog thư Nguyên nhân ra đờờii Nguyên nhân ra đ
c Windows 3.1, lậập trp trìình viên ph c lưu file (cho ph (cho phéép ngư c dialog nh viên phảải ti tựự viviếết ct cáác dialog ng chọọn đưn đườờng dng dẫẫn n p ngườời di dùùng ch
•• TrưTrướớc Windows 3.1, l mmởở hohoặặc lưu file file) file) => Không nhất quán giữa các ứng dụng
Windows 3.1, Windows xây dựựng cng cáác dialog thư c dialog thườờng ng •• TTừừ Windows 3.1, Windows xây d t DLL. a trong mộột DLL. ssửử ddụụng vng vàà chchứứa trong m
•• Windows 95 b sung thêm dialog Page Setup. Windows 95 bổổ sung thêm dialog Page Setup.
•• Windows 98, Windows 2000 b sung thêm nhiềều tu tíính nh Windows 98, Windows 2000 bổổ sung thêm nhi c dialog trên. năng cho cáác dialog trên. năng cho c
c dialog thườờng gng gặặpp CCáác dialog thư t kê chi tiếếtt LiLiệệt kê chi ti
Open / Save As dialog •• Open / Save As dialog
Print / Print Setup dialog •• Print / Print Setup dialog
Page Setup dialog •• Page Setup dialog
Find and Replace dialog •• Find and Replace dialog
Color dialog •• Color dialog
43
Font dialog •• Font dialog
c dialog thườờng gng gặặpp
CCáác dialog thư Save As dialog Open –– Save As dialog Open
c dialog thườờng gng gặặpp
CCáác dialog thư Print setup dialog Print vàà Print setup dialog Print v
44
c dialog thườờng gng gặặpp
CCáác dialog thư Page Setup Dialog Page Setup Dialog
c dialog thườờng gng gặặpp
CCáác dialog thư Find and Replace dialog Find and Replace dialog
45
CCáác dialog thư c dialog thườờng gng gặặpp Color dialog Color dialog
c dialog thườờng gng gặặpp
CCáác dialog thư Font dialog Font dialog
46
c dialog thườờng gng gặặpp
CCáác dialog thư SSửử ddụụng bng bằằng thư vi
n MFC ng thư việện MFC
i dialog LoLoạại dialog LLớớpp
CFileDialog CFileDialog HHộộp tho p thoạại Open ho c Save As i Open hoặặc Save As
CPrintDialog CPrintDialog HHộộp tho p thoạại Print ho c Print Setup i Print hoặặc Print Setup
CPageSetupDialog CPageSetupDialog i Page Setup p thoạại Page Setup HHộộp tho
CFindReplaceDialog CFindReplaceDialog HHộộp tho i Find and Replace p thoạại Find and Replace
CColorDialog CColorDialog HHộộp tho p thoạại Color (ch i Color (chọọn mn mààu)u)
CFontDialog CFontDialog HHộộp tho p thoạại Font (ch n font) i Font (chọọn font)
c dialog thườờng gng gặặpp
CCáác dialog thư SSửử ddụụng bng bằằng thư vi
n MFC ng thư việện MFC
•• Nguyên t
dialog c dialog thườờng gng gặặp (trp (trừừ dialog
Nguyên tắắc gc gọọi ci cáác dialog thư Find and Replace): Find and Replace):
– Tạo đối tượng thuộc lớp dialog quan tâm (cung cấp các thông tin cơ bản theo qui định)
– Gọi hàm DoModal() để hiển thị
47
– Lấy các giá trị quan tâm từ đối tượng đã khai báo
minh hoạạ
VVíí ddụụ minh ho Open/Save As dialog Open/Save As dialog
•• Constructor c
Constructor củủa la lớớp CFileDialog p CFileDialog CFileDialog::CFileDialog ( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL, DWORD dwSize = 0);
•• VVíí ddụụ::
CFileDialog dlg(TRUE, _T(""), _T("AAA"), OFN HIDEREADONLY |
minh hoạạ
VVíí ddụụ minh ho Open/Save As dialog Open/Save As dialog
•• CCáác hc hààm cm cầần quan tâm c
p CFileDialog: n quan tâm củủa la lớớp CFileDialog:
– GetFileExt: lấy phần mở rộng của tập tin được chọn
– GetFileName: lấy tên tập tin được chọn – GetFileTitle: lấy phần tên (không có phần mở rộng) của tập tin được chọn
48
– GetFolderPath: lấy thư mục của tập tin được chọn – GetPathName: lấy đường dẫn của tập tin được chọn
CCáác dialog thư c dialog thườờng gng gặặpp VVíí ddụụ minh ho
minh hoạạ
•• HiHiểển thn thịị Open Dialog đ
Open Dialog đểể chchọọn filen file
minh hoạạ
VVíí ddụụ minh ho Open/Save As dialog Open/Save As dialog
t Browse •• ViViếết ht hààm xm xửử lý slý sựự kikiệện nhn nhấấn vn vàào no núút Browse
void CFileDialogDemoDlg::OnBrowse() {
// TODO: Add your control notification handler code //here CFileDialog dlg (TRUE, _T(""), _T("AAA"), OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT, _T("Text files|*.txt|All files|*.*||")); if (dlg.DoModal() == IDOK) {
MessageBox(dlg.GetFileName());
49
}
lý menu XXửử lý menu
i niệệmm •• MMộột vt vàài khi kháái ni
p menu •• TTạạo lo lậập menu
•• NNạạp vp vàà hihiểển thn thịị menumenu
•• XXửử lý khi menu item đư lý khi menu item đượợc chc chọọnn
•• Thay đ Thay đổổi tri trạạng th i menu ng tháái menu
•• VVíí ddụụ
XXửử lý menu lý menu MMộột vt vàài khi kháái ni
i niệệmm
•• Menu bar: thanh menu. Bao g
u drop--down menu v
menu down menu vàà menu
Menu bar: thanh menu. Bao gồồm nhim nhiềều drop itemitem
•• DropDrop--down menu: m
down menu: mộột pht phầần cn củủa menu bar, ch
a menu bar, chứứa ca cáác menu item ho
c menu item hoặặc c
down menu kháác.c.
c drop--down menu kh
i menu item a chương trìình. Mnh. Mỗỗi menu item
•• Menu item:
tương ứứng vng vớới 1 l
i 1 lệệnh cnh củủa chương tr item ID hay nguyên phân biệệt, gt, gọọi li làà item ID hay
ng 1 sốố nguyên phân bi
•• Popup menu: gi
ng như drop--down menu, n
down menu, nhưng c
hưng cóó ththểể xuxuấất hi
t hiệện n ởở
i mouse) ng khi nhấấn nn núút pht phảải mouse)
ng điềều khi
u khiểển cn cửửa sa sổổ..
ccáác drop – VD. File, Edit, … Menu item: tương đưđượợc xc xáác đc địịnh bnh bằằng 1 s command ID. command ID. – VD. Open, Save, … Popup menu: giốống như drop vvịị trtríí bbấất kt kỳỳ trên m nh (thưhườờng khi nh trên mààn hn hìình (t System menu: chứứa ca cáác lc lệệnh hnh hệệ ththốống đi •• System menu: ch – VD. Minimize, Maximize, Close, …
50
XXửử lý menu lý menu MMộột vt vàài khi kháái ni
i niệệmm
•• VVíí ddụụ vvềề menubar, drop
down menu, menu item menubar, drop--down menu, menu item
XXửử lý menu lý menu MMộột vt vàài khi kháái ni
i niệệmm
•• XXáác lc lậập đp đốối tưi tượợng menu trong c
ng menu trong cáác hc hààm xm xửử lýlý
• Chỉ định menuitem thông qua ID của chúng
– BYCOMMAND
• Chỉ định menu (item & popup) thông qua vị trí (gần cha
nhất, bắt đầu bằng chỉ số 0)
51
– BYPOSITION
XXửử lý menu lý menu p menu TTạạo lo lậập menu
•• ThưThườờng cng cóó 2 c2 cáách ch
o menu: ch chíính đnh đểể ttạạo menu:
– Tạo menu ở dạng resource của ứng dụng, và load vào khi chạy
• Lớp sử dụng để quản lý menu: CMenu • Các hàm thành phần: CreateMenu, InsertMenu, …
– Tạo trực tiếp bằng các hàm khi ứng dụng đang chạy.
XXửử lý menu lý menu p menu TTạạo lo lậập menu
i nguyên p menu trong tàài nguyên •• TTạạo lo lậập menu trong t IDC_DEMOWIN32 MENU DISCARDABLE IDC_DEMOWIN32 MENU DISCARDABLE BEGIN BEGIN
POPUP "&File" POPUP "&File" BEGIN BEGIN MENUITEM "E&xit", IDM_EXIT MENUITEM "E&xit", IDM_EXIT
52
ENDEND POPUP "&Help" POPUP "&Help" BEGIN BEGIN MENUITEM "&About ...", IDM_ABOUT MENUITEM "&About ...", IDM_ABOUT ENDEND ENDEND
XXửử lý menu lý menu p menu TTạạo lo lậập menu
ng editor p menu bằằng editor trong môi trườờng lng lậập p •• TTạạo lo lậập menu b ccóó trong môi trư trtrìình.nh.
XXửử lý menu lý menu NNạạp vp vàà hihiểển thn thịị menumenu
•• XXáác đc địịnh menu bar khi t nh menu bar khi tạạo co cửửa sa sổổ::
Create(NULL, _T("My Application"),
WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME));
•• Thay đ
53
Thay đổổi menu bar: i menu bar: CMenu menu; menu.LoadMenu(IDR_MAINFRAME); SetMenu(&menu); menu.Detach();
XXửử lý menu lý menu NNạạp vp vàà hihiểển thn thịị menumenu
p CMenu •• LLớớp CMenu
• DeleteMenu: Xoá một đối tượng trên menu • TrackPopupMenu: hiển thị menu popup nổi
– Theo tác trên menu:
• AppendMenu: thêm vào cuối menu một menuitem. • InsertMenu: thêm một đối tượng menu tại một vị trí xác định • ModifyMenu: chỉnh sửa một đối tượng menu xác định.
– Thao tác trên các menuitem:
XXửử lý menu lý menu NNạạp vp vàà hihiểển thn thịị menumenu
p CMenu •• LLớớp CMenu
• CheckMenuItem: thêm/bỏ dấu check phía trước một
menuitem
• CheckMenuRadioItem: check một menuitem trong một
nhóm các menuitem
• EnableMenuItem: thiết lập menuitem các trạng thái enable
(MF_ENABLED), disable (MF_DISABLED), gray(MF_GRAYED).
• GetMenuItemCount: lấy số lượng menuitem trong một
menu
54
– Thao tác trên các menuitem
lý menu XXửử lý menu lý khi menu item đượợc chc chọọnn XXửử lý khi menu item đư
•• CCáác thông đi
a menu c thông điệệp cp củủa menu
•• XXửử lý l
a menu item lý lệệnh cnh củủa menu item
nh (Command range) •• NhNhóóm lm lệệnh (Command range)
XXửử lý khi menu item đư CCáác thông đi
lý khi menu item đượợc chc chọọn n a menu c thông điệệp cp củủa menu
•• WM_MENUSELECT: ph ng lên t sinh khi user táác đc độộng lên ng tháái i a menu (trưtrườờng hng hợợp menu thay đ ng điệệp np nàày cy cóó ththểể ddùùng đng đểể ccậập nhp nhậật trt trạạng th i theo ngữữ ccảảnh nh –– p menu thay đổổi theo ng
• wParam:
– LOWORD(wParam): ID của menu item hoặc index của menu popup – HIWORD(wParam): các thông tin khác (trạng thái menu, loại menu, …).
MF_POPUP; MF_CHECKED; MF_DISABLED, MF_GRAYED; MF_SEPARATOR; MF_SYSMENU,…
• lParam: handle của menu
55
WM_MENUSELECT: pháát sinh khi user t menu. Thông đi menu. Thô ccủủa menu ( sensitive Menu) Context--sensitive Menu) Context – Hàm xử lý tương ứng: CWnd::OnMenuSelect
XXửử lý khi menu item đư CCáác thông đi
lý khi menu item đượợc chc chọọn n a menu c thông điệệp cp củủa menu
n 1 menu item t sinh khi user chọọn 1 menu item •• WM_COMMAND: ph
• 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 1 phím
tắt; 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 đó
WM_COMMAND: pháát sinh khi user ch – Hàm xử lý tương ứng: CWnd::OnCommand – wParam:
XXửử lý khi menu item đư CCáác thông đi
lý khi menu item đượợc chc chọọn n a menu c thông điệệp cp củủa menu
•• XXửử lý l
a menu item lý lệệnh cnh củủa menu item
ON_COMMAND(IDM_ABOUT, OnAbout) ON_COMMAND(IDM_EXIT, OnExit)
56
– Dựa trên message WM_COMMAND – Định nghĩa message map
•• ViViếết ht hààm xm xửử lýlý
void CDialogDemoDlg::OnAbout() {
// TODO: Add your command handler code here MessageBox(_T("Hello! World"));
}
XXửử lý khi menu item đư CCáác thông đi
lý khi menu item đượợc chc chọọn n a menu c thông điệệp cp củủa menu
•• TTạạo pop
up menu o pop--up menu
– Sử dụng ClassWizard để thêm xử lý cho thông điệp WM_CONTEXTMENU
BOOL CMenu::TrackPopupMenu(UINT nFlags, int x, int y,
CWnd* pWnd, LPCRECT lpRect=0);
• nFlags: cờ vị trí trên màn hình (TPM_CENTERALIGN ,
TPM_LEFTALIGN , TPM_RIGHTALIGN), cờ chỉ phím nhấn của chuột (TPM_LEFTBUTTON, TPM_RIGHTBUTTON)
57
– Hàm xử lý CWnd::OnContextMenu – Hiển thị một menu pop-up nổi
XXửử lý khi menu item đư CCáác thông đi
lý khi menu item đượợc chc chọọn n a menu c thông điệệp cp củủa menu
– Viết hàm xử lý
void CDialogDemoDlg::OnContextMenu(CWnd* pWnd, CPoint
point)
{
// TODO: Add your message handler code here CMenu menu; menu.LoadMenu(IDR_MENU1); menu.GetSubMenu(1)-> TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
up menu o pop--up menu •• TTạạo pop
XXửử lý khi menu item đư lý khi menu item đượợc chc chọọn n Thay đổổi tri trạạng th Thay đ
i menu ng tháái menu
•• CCáác vc víí ddụụ::
– Khi user chọn chức năng vẽ Circle cần thể hiện 1 dấu check ((cid:59)) phía trước
– Chức năng Cut/Copy/Delete chỉ được kích hoạt khi user đánh dấu chọn 1 đoạn text
– Chức năng Paste chỉ được kích hoạt khi clipboard khác rỗng
58
– ...
XXửử lý khi menu item đư lý khi menu item đượợc chc chọọn n Thay đổổi tri trạạng th Thay đ
i menu ng tháái menu
•• CCáách xch xửử lý:lý:
void CDialogDemoDlg::OnHelpTest2() {
// TODO: Add your command handler code here CMenu *pMenu; pMenu = GetMenu(); pMenu->CheckMenuItem(ID_HELP_TEST2, MF_CHECKED | MF_BYCOMMAND); MessageBox(_T("Hello! Test 2"));
}
lý khi menu item đượợc chc chọọn n
XXửử lý khi menu item đư NhNhóóm lm lệệnhnh
•• LLàà 1 nh1 nhóóm menu item ho m menu item hoạạt đt độộng theo nguyên t i 1 thờời đi ng theo nguyên tắắc c ““ChChỉỉ ccóó i điểểmm”” 1 ph1 phầần tn tửử đư đượợc chc chọọn tn tạại 1 th – VD. Chức năng vẽ hình “Line / Circle / Rectangle”
– Cách 1: map tất cả xử lý của các menu item này vào chung 1
•• CCáách th ch thứức xc xửử lý ?lý ?
hàm xử lý
– Cách 2: dùng macro ON_COMMAND_RANGE
59
lý khi menu item đượợc chc chọọn n
XXửử lý khi menu item đư NhNhóóm lm lệệnhnh
c menu item nàày vy vàào o ch 1: map tấất ct cảả xxửử lý clý củủa ca cáác menu item n
m_nCurrentDraw = (UINT) LOWORD ( GetCurrentMessage()->
wParam);
•• CCáách 1: map t chung 1 hààm xm xửử lýlý chung 1 h // Định nghĩa Message map ON_COMMAND (ID_DRAW_LINE, Draw) ON_COMMAND (ID_DRAW_CIRCLE, Draw) ON_COMMAND (ID_DRAW_RECTANGLE, Draw) – // Hàm xử lý chung, xác định item hiện hành void CAAADlg::Draw () {
}
lý khi menu item đượợc chc chọọn n
XXửử lý khi menu item đư NhNhóóm lm lệệnhnh
•• CCáách 2: d ch 2: dùùng macro ON_COMMAND_RANGE ng macro ON_COMMAND_RANGE
– Lưu ý: các ID đặt trong macro này phải có giá trị liên tục // Định nghĩa Message map ON_COMMAND_RANGE (ID_DRAW_LINE,
ID_DRAW_RECTANGLE, Draw)
– // Hàm xử lý chung, xác định item hiện hành void CAAADlg::Draw (UINT nID) {
m_nCurrentDraw = nID;
}
60
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
•• TTạạo o ứứng dng dụụng bng bằằng MFC ng MFC ng SDI AppWizard dạạng SDI AppWizard d (Single Document) (Single Document)
•• BBỏỏ check Document/View check ““Document/View architecture support?”” architecture support?
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
61
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
•• XXửử lý l
a menu item lý lệệnh cnh củủa menu item
– Thêm vào các menu item cho popup menu File: New, Open, Save
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
void CMainFrame::OnFileNew() void CMainFrame::OnFileNew() {{
// TODO: Add your command handler code here // TODO: Add your command handler code here MessageBox(_T("Ban nhan vao menu New"), _T("Thong bao")); MessageBox(_T("Ban nhan vao menu New"), _T("Thong bao"));
}}
void CMainFrame::OnFileOpen() void CMainFrame::OnFileOpen() {{
// TODO: Add your command handler code here // TODO: Add your command handler code here MessageBox(_T("Ban nhan vao menu Open"), _T("Thong bao")); MessageBox(_T("Ban nhan vao menu Open"), _T("Thong bao"));
}}
void CMainFrame::OnFileSave() void CMainFrame::OnFileSave() {{
// TODO: Add your command handler code here // TODO: Add your command handler code here MessageBox(_T("Ban nhan vao menu Save"), _T("Thong bao")); MessageBox(_T("Ban nhan vao menu Save"), _T("Thong bao"));
}}
62
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
•• XXửử lý nh
lý nhóóm lm lệệnhnh
– Tạo một menu pop-up mới (New Menu) – Thêm các menu item (Menu 1, Menu 2, Menu 3, Menu 4)
– Người dụng nhấn chọn một menu sẽ nhận được một thông báo: “Ban vua nhan menu thu …”
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
•• XXửử lý nh
lý nhóóm lm lệệnhnh
ON_COMMAND_RANGE(IDM_MENU1, IDM_MENU4,
OnMenu)
– Thêm vào message map:
– Viết xử lý cho hàm OnMenu: void CMainFrame::OnMenu(UINT nID) {
CString str; str.Format(_T("Ban vua nhan vao menu thu %d"), nID - IDM_MENU1 + 1); MessageBox(str,_T("Dung nhom lenh"));
63
}
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
– Hiển thị menu popup Edit – Viết hàm xử lý:
void CMainFrame::OnContextMenu (CWnd* pWnd, CPoint point) {
// TODO: Add your message handler code here CMenu *pMenu; pMenu = GetMenu(); (pMenu->GetSubMenu(1))->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
menu: o context--menu: •• TTạạo context
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
64
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
p menu cho dialog: •• TTạạo lo lậập menu cho dialog:
– Tạo một tài nguyên menu cho ứng dụng – Chọn menu cần gắn vào dialog trong hộp thoại Dialog Properties.
XXửử lý menu lý menu VVíí ddụụ minh ho
minh hoạạ
65
HHẾẾT T –– CCẢẢM ƠNM ƠN
GIGIẢẢI ĐI ĐÁÁP THP THẮẮC MC MẮẮCC
66