1
L
L
ậ
ậ
p tr
p tr
ì
ì
nh trên môi trư
nh trên môi trư
ờ
ờ
ng Windows
ng Windows
K
K
Ỹ
Ỹ
THU
THU
Ậ
Ậ
T L
T L
Ậ
Ậ
P TRÌNH VISUAL C++
P TRÌNH VISUAL C++
(MFC)
(MFC)
N
N
ộ
ộ
i dung tr
i dung tr
ì
ì
nh b
nh b
à
à
y
y
•
•
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
•
•
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
•
•
X
X
ử
ử
lý Mouse v
lý Mouse v
à
à
Keyboard
Keyboard
•
•
M
M
ộ
ộ
t s
t s
ố
ố
l
l
ớ
ớ
p thư
p thư
ờ
ờ
ng g
ng g
ặ
ặ
p: CWnd, CString,..
p: CWnd, CString,..
•
•
C
C
á
á
c control thư
c control thư
ờ
ờ
ng g
ng g
ặ
ặ
p
p
•
•
C
C
á
á
c dialog thư
c dialog thư
ờ
ờ
ng g
ng g
ặ
ặ
p
p
•
•
X
X
ử
ử
lý menu
lý menu
2
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
•
•
MFC l
MFC l
à
à
g
g
ì
ì
?
?
•
•
M
M
ộ
ộ
t s
t s
ố
ố
t
t
í
í
nh năng c
nh năng c
ủ
ủ
a MFC qua t
a MFC qua t
ừ
ừ
ng version
ng version
•
•
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a 1
a 1
ứ
ứ
ng d
ng d
ụ
ụ
ng trong VC++
ng trong VC++
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
MFC l
MFC l
à
à
g
g
ì
ì
?
?
•
•
L
L
à
à
m
m
ộ
ộ
t thư vi
t thư vi
ệ
ệ
n c
n c
á
á
c l
c l
ớ
ớ
p hư
p hư
ớ
ớ
ng đ
ng đ
ố
ố
i tư
i tư
ợ
ợ
ng d
ng d
ù
ù
ng cho vi
ng cho vi
ệ
ệ
c l
c l
ậ
ậ
p tr
p tr
ì
ì
nh trên
nh trên
Windows.
Windows.
•
•
Đư
Đư
ợ
ợ
c xây d
c xây d
ự
ự
ng trên cơ s
ng trên cơ s
ở
ở
c
c
á
á
c h
c h
à
à
m thư vi
m thư vi
ệ
ệ
n API c
n API c
ủ
ủ
a Windows
a Windows
•
•
Version 6 c
Version 6 c
ó
ó
kho
kho
ả
ả
ng 200 l
ng 200 l
ớ
ớ
p
p
•
•
Gi
Gi
ú
ú
p cho ngư
p cho ngư
ờ
ờ
i l
i l
ậ
ậ
p tr
p tr
ì
ì
nh c
nh c
ó
ó
th
th
ể
ể
xây d
xây d
ự
ự
ng
ng
ứ
ứ
ng d
ng d
ụ
ụ
ng nhanh v
ng nhanh v
à
à
í
í
t t
t t
ố
ố
n
n
công s
công s
ứ
ứ
c hơn so v
c hơn so v
ớ
ớ
i vi
i vi
ệ
ệ
c s
c s
ử
ử
d
d
ụ
ụ
ng đơn thu
ng đơn thu
ầ
ầ
n c
n c
á
á
c h
c h
à
à
m thư vi
m thư vi
ệ
ệ
n API
n API
c
c
ủ
ủ
a Windows
a Windows
•
•
Ta v
Ta v
ẫ
ẫ
n c
n c
ó
ó
th
th
ể
ể
g
g
ọ
ọ
i c
i c
á
á
c h
c h
à
à
m Windows API trong c
m Windows API trong c
á
á
c
c
ứ
ứ
ng d
ng d
ụ
ụ
ng MFC
ng MFC
3
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
MFC l
MFC l
à
à
g
g
ì
ì
?
?
•
•
Trong 1
Trong 1
ứ
ứ
ng d
ng d
ụ
ụ
ng MFC,
ng MFC,
ta thư
ta thư
ờ
ờ
ng không g
ng không g
ọ
ọ
i h
i h
à
à
m
m
Windows API tr
Windows API tr
ự
ự
c ti
c ti
ế
ế
p, m
p, m
à
à
s
s
ẽ
ẽ
t
t
ạ
ạ
o c
o c
á
á
c đ
c đ
ố
ố
i tư
i tư
ợ
ợ
ng t
ng t
ừ
ừ
nh
nh
ữ
ữ
ng
ng
l
l
ớ
ớ
p c
p c
ủ
ủ
a MFC, v
a MFC, v
à
à
g
g
ọ
ọ
i phương th
i phương th
ứ
ứ
c c
c c
ủ
ủ
a đ
a đ
ố
ố
i tư
i tư
ợ
ợ
ng đ
ng đ
ó
ó
•
•
Đa s
Đa s
ố
ố
c
c
á
á
c phương th
c phương th
ứ
ứ
c c
c c
ủ
ủ
a nh
a nh
ữ
ữ
ng l
ng l
ớ
ớ
p MFC c
p MFC c
ó
ó
c
c
ù
ù
ng tên
ng tên
v
v
ớ
ớ
i nh
i nh
ữ
ữ
ng h
ng h
à
à
m Windows API
m Windows API
•
•
MFC t
MFC t
ạ
ạ
o ra m
o 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
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
M
M
ộ
ộ
t s
t s
ố
ố
t
t
í
í
nh năng c
nh năng c
ủ
ủ
a MFC
a MFC
•
•
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
4
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
M
M
ộ
ộ
t s
t s
ố
ố
t
t
í
í
nh năng c
nh năng c
ủ
ủ
a MFC
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
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
M
M
ộ
ộ
t s
t s
ố
ố
t
t
í
í
nh năng c
nh năng c
ủ
ủ
a MFC
a MFC
•
•
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
5
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u v
u v
ề
ề
MFC
MFC
M
M
ộ
ộ
t s
t s
ố
ố
t
t
í
í
nh năng c
nh năng c
ủ
ủ
a MFC
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
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u
u
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a 1
a 1
ứ
ứ
ng d
ng d
ụ
ụ
ng
ng
6
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
•
•
T
T
ạ
ạ
o
o
ứ
ứ
ng d
ng d
ụ
ụ
ng b
ng b
ằ
ằ
ng c
ng c
á
á
ch s
ch s
ử
ử
d
d
ụ
ụ
ng MFC
ng MFC
AppWizard
AppWizard
•
•
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
T
T
ạ
ạ
o
o
ứ
ứ
ng d
ng d
ụ
ụ
ng b
ng b
ằ
ằ
ng MFC AppWizard
ng MFC AppWizard
Visual Studio 6.0
7
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
T
T
ạ
ạ
o
o
ứ
ứ
ng d
ng d
ụ
ụ
ng b
ng b
ằ
ằ
ng MFC AppWizard
ng MFC AppWizard
Visual Studio 2005
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
T
T
ạ
ạ
o
o
ứ
ứ
ng d
ng d
ụ
ụ
ng b
ng b
ằ
ằ
ng MFC AppWizard
ng MFC AppWizard
Visual Studio 6.0
8
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
T
T
ạ
ạ
o
o
ứ
ứ
ng d
ng d
ụ
ụ
ng b
ng b
ằ
ằ
ng MFC AppWizard
ng MFC AppWizard
Visual Studio 2005
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
•
•
C
C
á
á
c file chương tr
c file chương tr
ì
ì
nh: (xxx l
nh: (xxx l
à
à
tên project)
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
9
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
Visual Studio 6.0 Visual Studio 2005
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
•
•
CWinApp: l
CWinApp: l
ớ
ớ
p ch
p ch
í
í
nh c
nh c
ủ
ủ
a MFC đ
a MFC đ
ể
ể
qu
qu
ả
ả
n lý
n lý
ứ
ứ
ng d
ng d
ụ
ụ
ng. Ch
ng. Ch
ứ
ứ
a đ
a đ
ự
ự
ng vòng l
ng vòng l
ặ
ặ
p
p
nh
nh
ậ
ậ
n message v
n message v
à
à
phân ph
phân ph
ố
ố
i message đ
i message đ
ế
ế
n c
n c
á
á
c c
c c
ử
ử
a s
a s
ổ
ổ
c
c
ủ
ủ
a
a
ứ
ứ
ng d
ng d
ụ
ụ
ng
ng
•
•
CDemoApp: l
CDemoApp: l
ớ
ớ
p k
p k
ế
ế
th
th
ừ
ừ
a t
a t
ừ
ừ
l
l
ớ
ớ
p CWinApp.
p CWinApp.
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()
};
};
10
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
•
•
InitInstance(): h
InitInstance(): h
à
à
m kh
m kh
ở
ở
i t
i t
ạ
ạ
o
o
ứ
ứ
ng d
ng d
ụ
ụ
ng, override lên h
ng, override lên h
à
à
m chu
m chu
ẩ
ẩ
n c
n c
ủ
ủ
a l
a l
ớ
ớ
p
p
CWinApp
CWinApp
BOOL
BOOL
CxxxApp
CxxxApp
::
::
InitInstance
InitInstance
()
()
{
{
CDemoDlg dlg;
CDemoDlg dlg;
m_pMainWnd = &dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
if (nResponse == IDOK)
{
{
// TODO: Place code here to handle when the dialog is dismissed
// TODO: Place code here to handle when the dialog is dismissed
with OK
with OK
}
}
else if (nResponse == IDCANCEL)
else if (nResponse == IDCANCEL)
{
{
}
}
// Since the dialog has been closed, return FALSE so that we exi
// Since the dialog has been closed, return FALSE so that we exi
t the
t the
// application, rather than start the application's message pum
// application, rather than start the application's message pum
p.
p.
return FALSE
return FALSE
;
;
}
}
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
•
•
CWnd: l
CWnd: l
ớ
ớ
p ch
p ch
í
í
nh c
nh c
ủ
ủ
a MFC đ
a MFC đ
ể
ể
qu
qu
ả
ả
n lý c
n lý c
á
á
c lo
c lo
ạ
ạ
i c
i c
ử
ử
a
a
s
s
ổ
ổ
giao di
giao di
ệ
ệ
n. C
n. C
ó
ó
nhi
nhi
ề
ề
u l
u l
ớ
ớ
p đư
p đư
ợ
ợ
c k
c k
ế
ế
th
th
ừ
ừ
a t
a t
ừ
ừ
l
l
ớ
ớ
p
p
n
n
à
à
y đ
y đ
ể
ể
qu
qu
ả
ả
n lý c
n lý c
á
á
c lo
c lo
ạ
ạ
i c
i c
ử
ử
a s
a s
ổ
ổ
kh
kh
á
á
c nhau
c nhau
(CTreeCtrl, CListBox, CEdit,
(CTreeCtrl, CListBox, CEdit,
…
…
)
)
•
•
CDialog k
CDialog k
ế
ế
th
th
ừ
ừ
a t
a t
ừ
ừ
l
l
ớ
ớ
p CWnd, l
p CWnd, l
à
à
l
l
ớ
ớ
p cơ b
p cơ b
ả
ả
n đư
n đư
ợ
ợ
c
c
d
d
ù
ù
ng đ
ng đ
ể
ể
hi
hi
ể
ể
n th
n th
ị
ị
c
c
á
á
c dialog trên m
c dialog trên m
à
à
n h
n h
ì
ì
nh.
nh.
11
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
•
•
M
M
ỗ
ỗ
i dialog s
i dialog s
ẽ
ẽ
c
c
ó
ó
tương
tương
ứ
ứ
ng m
ng m
ộ
ộ
t l
t l
ớ
ớ
p CxxxDlg k
p CxxxDlg k
ế
ế
th
th
ừ
ừ
a t
a t
ừ
ừ
CDialog.
CDialog.
class
class
CMFC01Dlg
CMFC01Dlg
: public
: public
CDialog
CDialog
{
{
// 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:
virtual void DoDataExchange(CDataExchange* pDX);
virtual void DoDataExchange(CDataExchange* pDX);
// DDX/DDV support
// DDX/DDV support
// 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()
};
};
Chương tr
Chương tr
ì
ì
nh MFC đ
nh MFC đ
ầ
ầ
u tiên
u tiên
C
C
á
á
c th
c th
à
à
nh ph
nh ph
ầ
ầ
n c
n c
ủ
ủ
a chương tr
a chương tr
ì
ì
nh
nh
•
•
M
M
ộ
ộ
t s
t s
ố
ố
h
h
à
à
m c
m c
ủ
ủ
a l
a l
ớ
ớ
p CDemoDlg:
p CDemoDlg:
– OnInitDialog:
•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
– OnPaint:
• Đượ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.
12
Message Map
Message Map
•
•
L
L
à
à
m sao đ
m sao đ
ể
ể
x
x
ử
ử
lý
lý
1 t
1 t
hô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
•
•
M
M
ỗ
ỗ
i thông đi
i thông đi
ệ
ệ
p s
p s
ẽ
ẽ
đư
đư
ợ
ợ
c x
c x
ử
ử
lý b
lý b
ở
ở
i 1 h
i 1 h
à
à
m th
m th
à
à
nh ph
nh ph
ầ
ầ
n
n
tương
tương
ứ
ứ
ng
ng
BEGIN_MESSAGE_MAP(CMFC01Dlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
•
•
ON_WM_PAINT l
ON_WM_PAINT l
à
à
1
1
macro đư
macro đư
ợ
ợ
c đ
c đ
ị
ị
nh ngh
nh ngh
ĩ
ĩ
a trong
a trong
Afxmsg_.h, m
Afxmsg_.h, m
ặ
ặ
c nhiên liên k
c nhiên liên k
ế
ế
t thông đi
t thông đi
ệ
ệ
p WM_PAINT v
p WM_PAINT v
ớ
ớ
i
i
h
h
à
à
m OnPaint
m OnPaint
13
X
X
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p
p
•
•
Thêm x
Thêm x
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p WM_LBUTTONDOWN
p WM_LBUTTONDOWN
– 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);
}
X
X
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p
p
•
•
S
S
ử
ử
d
d
ụ
ụ
ng ClassWizard
ng ClassWizard
(Ctrl
(Ctrl
-
-
W)
W)
•
•
Click chu
Click chu
ộ
ộ
t ph
t ph
ả
ả
i, ch
i, ch
ọ
ọ
n
n
ClassWizard
ClassWizard
Visual Studio 6.0
14
X
X
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p
p
•
•
Ch
Ch
ọ
ọ
n ph
n ph
ầ
ầ
n
n
Messages
Messages
trong h
trong h
ộ
ộ
p tho
p tho
ạ
ạ
i
i
Properties
Properties
.
.
•
•
Ch
Ch
ọ
ọ
n đ
n đ
ú
ú
ng thông đi
ng thông đi
ệ
ệ
p c
p c
ầ
ầ
n
n
x
x
ử
ử
lý.
lý.
Visual Studio 2005
X
X
ử
ử
lý mouse v
lý mouse v
à
à
keyboard
keyboard
•
•
X
X
ử
ử
lý mouse
lý mouse
– Thông điệp của mouse
– Ví dụ: Vẽ hình bằng mouse
•
•
X
X
ử
ử
lý keyboard
lý keyboard
– Thông điệp của keyboard
15
X
X
ử
ử
lý mouse
lý mouse
C
C
á
á
c thông đi
c thông đi
ệ
ệ
p c
p c
ủ
ủ
a mouse
a mouse
•
•
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
X
X
ử
ử
lý mouse
lý mouse
C
C
á
á
c thông đi
c thông đi
ệ
ệ
p c
p c
ủ
ủ
a mouse
a mouse
•
•
V
V
ớ
ớ
i m
i m
ỗ
ỗ
i thông đi
i thông đi
ệ
ệ
p c
p c
ủ
ủ
a chu
a chu
ộ
ộ
t, Windows g
t, Windows g
ở
ở
i k
i k
è
è
m 2
m 2
tham s
tham s
ố
ố
wParam v
wParam v
à
à
lParam
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
16
X
X
ử
ử
lý mouse
lý mouse
C
C
á
á
c thông đi
c thông đi
ệ
ệ
p c
p c
ủ
ủ
a mouse
a mouse
OnMouseMove
OnMouseMove
ON_WM_MOUSEMOVE
ON_WM_MOUSEMOVE
WM_MOUSEMOVE
WM_MOUSEMOVE
OnRButtonDblClk
OnRButtonDblClk
ON_WM_RBUTTONDBLCLK
ON_WM_RBUTTONDBLCLK
WM_RBUTTONDBLCLK
WM_RBUTTONDBLCLK
OnRButtonUp
OnRButtonUp
ON_WM_RBUTTONUP
ON_WM_RBUTTONUP
WM_RBUTTONUP
WM_RBUTTONUP
OnRButtonDown
OnRButtonDown
ON_WM_RBUTTONDOWN
ON_WM_RBUTTONDOWN
WM_RBUTTONDOWN
WM_RBUTTONDOWN
OnMButtonDblClk
OnMButtonDblClk
ON_WM_MBUTTONDBLCLK
ON_WM_MBUTTONDBLCLK
WM_MBUTTONDBLCLK
WM_MBUTTONDBLCLK
OnMButtonUp
OnMButtonUp
ON_WM_MBUTTONUP
ON_WM_MBUTTONUP
WM_MBUTTONUP
WM_MBUTTONUP
OnMButtonDown
OnMButtonDown
ON_WM_MBUTTONDOWN
ON_WM_MBUTTONDOWN
WM_MBUTTONDOWN
WM_MBUTTONDOWN
OnLButtonDblClk
OnLButtonDblClk
ON_WM_LBUTTONDBLCLK
ON_WM_LBUTTONDBLCLK
WM_LBUTTONDBLCLK
WM_LBUTTONDBLCLK
OnLButtonUp
OnLButtonUp
ON_WM_LBUTTONUP
ON_WM_LBUTTONUP
WM_LBUTTONUP
WM_LBUTTONUP
OnLButtonDown
OnLButtonDown
ON_WM_LBUTTONDOWN
ON_WM_LBUTTONDOWN
WM_LBUTTONDOWN
WM_LBUTTONDOWN
H
H
à
à
m x
m x
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p
p
Message
Message
-
-
Map Macro
Map Macro
Thông đi
Thông đi
ệ
ệ
p
p
X
X
ử
ử
lý mouse
lý mouse
C
C
á
á
c thông đi
c thông đi
ệ
ệ
p c
p c
ủ
ủ
a mouse
a mouse
•
•
C
C
á
á
c h
c h
à
à
m x
m x
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p cho mouse c
p cho mouse c
ó
ó
d
d
ạ
ạ
ng:
ng:
afx_msg void On
afx_msg void On
MsgName
MsgName
(UINT nFlags, CPoint
(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
Ctrl, Alt.
17
X
X
ử
ử
lý mouse
lý mouse
C
C
á
á
c thông đi
c thông đi
ệ
ệ
p c
p c
ủ
ủ
a mouse
a mouse
•
•
S
S
ử
ử
d
d
ụ
ụ
ng ph
ng ph
é
é
p to
p to
á
á
n
n
&
&
đ
đ
ể
ể
ki
ki
ể
ể
m tra m
m tra m
ộ
ộ
t tr
t tr
ạ
ạ
ng th
ng th
á
á
i
i
c
c
ó
ó
t
t
ồ
ồ
n t
n t
ạ
ạ
i không
i không
– Ví dụ: nFlags & MK_CONTROL khác 0 kiểm tra phím
Ctrl được nhấn
Ph
Ph
í
í
m Shift đư
m Shift đư
ợ
ợ
c nh
c nh
ấ
ấ
n
n
MK_SHIFT
MK_SHIFT
Ph
Ph
í
í
m Ctrl đư
m Ctrl đư
ợ
ợ
c nh
c nh
ấ
ấ
n
n
MK_CONTROL
MK_CONTROL
Ph
Ph
í
í
m ph
m ph
ả
ả
i chu
i chu
ộ
ộ
t đư
t đư
ợ
ợ
c nh
c nh
ấ
ấ
n
n
MK_RBUTTON
MK_RBUTTON
Ph
Ph
í
í
m gi
m gi
ữ
ữ
a chu
a chu
ộ
ộ
t đư
t đư
ợ
ợ
c nh
c nh
ấ
ấ
n
n
MK_MBUTTON
MK_MBUTTON
Ph
Ph
í
í
m tr
m tr
á
á
i chu
i chu
ộ
ộ
t
đư
t đư
ợ
ợ
c nh
c nh
ấ
ấ
n
n
MK_LBUTTON
MK_LBUTTON
Ý ngh
Ý ngh
ĩ
ĩ
a
a
Gi
Gi
á
á
tr
tr
ị
ị
X
X
ử
ử
lý mouse
lý mouse
V
V
í
í
d
d
ụ
ụ
minh h
minh h
ọ
ọ
a
a
•
•
V
V
í
í
d
d
ụ
ụ
: V
: V
ẽ
ẽ
h
h
ì
ì
nh b
nh b
ằ
ằ
ng mouse
ng mouse
•
•
Mô t
Mô t
ả
ả
: k
: k
hi ngư
hi ngư
ờ
ờ
i s
i s
ử
ử
d
d
ụ
ụ
ng nh
ng nh
ấ
ấ
n gi
n gi
ữ
ữ
n
n
ú
ú
t tr
t tr
á
á
i chu
i chu
ộ
ộ
t & di
t & di
chuy
chuy
ể
ể
n v
n v
ẽ
ẽ
1
1
đư
đư
ờ
ờ
ng th
ng th
ẳ
ẳ
ng
ng
18
X
X
ử
ử
lý mouse
lý mouse
V
V
í
í
d
d
ụ
ụ
minh h
minh h
ọ
ọ
a
a
•
•
C
C
á
á
c x
c x
ử
ử
lý c
lý c
ầ
ầ
n thi
n thi
ế
ế
t:
t:
– WM_LBUTTONDOWN : OnLButtonDown
– WM_MOUSEMOVE : OnMouseMove
•
•
C
C
á
á
c bư
c bư
ớ
ớ
c th
c th
ự
ự
c hi
c hi
ệ
ệ
n:
n:
– Định nghĩa 2 biến m_PrevX, m_PrevY trong class CxxxDlg
– Định nghĩa hàm xử lý message WM_LBUTTONDOWN trong
class CxxxDlg
– Định nghĩa hàm xử lý message WM_MOUSEMOVE trong
class CxxxDlg
X
X
ử
ử
lý mouse
lý mouse
V
V
í
í
d
d
ụ
ụ
minh h
minh h
ọ
ọ
a
a
•
•
Vi
Vi
ế
ế
t code cho h
t code cho h
à
à
m x
m x
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p nh
p nh
ấ
ấ
n tr
n tr
á
á
i chu
i chu
ộ
ộ
t
t
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);
}
19
X
X
ử
ử
lý mouse
lý mouse
V
V
í
í
d
d
ụ
ụ
minh h
minh h
ọ
ọ
a
a
void CMouseProcessingDlg::OnMouseMove(UINT nFlags, CPoint point)
void CMouseProcessingDlg::OnMouseMove(UINT nFlags, CPoint point)
{
{
// TODO: Add your message handler code here and/or call default
// TODO: Add your message handler code here and/or call default
//Chu
//Chu
ộ
ộ
t đang di chuy
t đang di chuy
ể
ể
n v
n v
ớ
ớ
i ph
i ph
í
í
m tr
m tr
á
á
i đang nh
i đang nh
ấ
ấ
n
n
if ((nFlags & MK_LBUTTON) == MK_LBUTTON) {
if ((nFlags & MK_LBUTTON) == MK_LBUTTON) {
// L
// L
ấ
ấ
y ng
y ng
ữ
ữ
c
c
ả
ả
nh thi
nh thi
ế
ế
t b
t b
ị
ị
đ
đ
ể
ể
v
v
ẽ
ẽ
CClientDC dc(this);
CClientDC dc(this);
// V
// V
ẽ
ẽ
m
m
ộ
ộ
t đư
t đư
ờ
ờ
ng th
ng th
ẳ
ẳ
ng t
ng t
ừ
ừ
đi
đi
ể
ể
m trư
m trư
ớ
ớ
c đ
c đ
ó
ó
đ
đ
ế
ế
n đi
n đi
ể
ể
m hi
m hi
ệ
ệ
n t
n t
ạ
ạ
i
i
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
Lưu đi
ể
ể
m hi
m hi
ệ
ệ
n t
n t
ạ
ạ
i l
i l
ạ
ạ
i
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);
}
}
X
X
ử
ử
lý mouse
lý mouse
V
V
í
í
d
d
ụ
ụ
minh h
minh h
ọ
ọ
a
a
•
•
Biên d
Biên d
ị
ị
ch v
ch v
à
à
ch
ch
ạ
ạ
y th
y th
ử
ử
20
X
X
ử
ử
lý keyboard
lý keyboard
•
•
Thông đi
Thông đi
ệ
ệ
p c
p c
ủ
ủ
a keyboard
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,…)
X
X
ử
ử
lý keyboard
lý keyboard
•
•
C
C
á
á
c h
c h
à
à
m x
m x
ử
ử
lý thông đi
lý thông đi
ệ
ệ
p liên quan đ
p liên quan đ
ế
ế
n b
n b
à
à
n ph
n ph
í
í
m
m
c
c
ó
ó
d
d
ạ
ạ
ng:
ng:
afx_msg void On
afx_msg void On
MsgName
MsgName
(UINT nChar, UINT
(UINT nChar, UINT
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)
21
X
X
ử
ử
lý keyboard
lý keyboard
•
•
Mã ph
Mã ph
í
í
m
m
ả
ả
o
o
Esc
Esc
VK_ESCAPE
VK_ESCAPE
Pause
Pause
VK_PAUSE
VK_PAUSE
Alt
Alt
VK_MENU
VK_MENU
Ctrl
Ctrl
VK_CONTROL
VK_CONTROL
Shift
Shift
VK_SHIFT
VK_SHIFT
Ph
Ph
í
í
m s
m s
ố
ố
5 (Num Lock t
5 (Num Lock t
ắ
ắ
t)
t)
VK_CLEAR
VK_CLEAR
Tab
Tab
VK_TAB
VK_TAB
Backspace
Backspace
VK_BACK
VK_BACK
Enter
Enter
VK_RETURN
VK_RETURN
Ctrl
Ctrl
-
-
Break
Break
VK_CANCEL
VK_CANCEL
Ph
Ph
í
í
m s
m s
ố
ố
0
0
,..,
,..,
9 (
9 (
Numlock đư
Numlock đư
ợ
ợ
c b
c b
ậ
ậ
t)
t)
VK_NUMPAD0,
VK_NUMPAD0,
…
…
,VK_NUMPAD9
,VK_NUMPAD9
Ph
Ph
í
í
m ch
m ch
ứ
ứ
c năng F
c năng F
1_F12
1_F12
VK_F1,
VK_F1,
…
…
,VK_F12
,VK_F12
Ph
Ph
í
í
m tương
m tương
ứ
ứ
ng
ng
Mã ph
Mã ph
í
í
m
m
ả
ả
o
o
X
X
ử
ử
lý keyboard
lý keyboard
•
•
Mã ph
Mã ph
í
í
m
m
ả
ả
o
o
Delete v
Delete v
à
à
Del
Del
VK_DELETE
VK_DELETE
Insert v
Insert v
à
à
Ins
Ins
VK_INSERT
VK_INSERT
Print Screen
Print Screen
VK_SNAPSHOT
VK_SNAPSHOT
Down arrow
Down arrow
VK_DOWN
VK_DOWN
Right arrow
Right arrow
VK_RIGHT
VK_RIGHT
Up arrow
Up arrow
VK_UP
VK_UP
Left arrow
Left arrow
VK_LEFT
VK_LEFT
Home
Home
VK_HOME
VK_HOME
End
End
VK_END
VK_END
Page Down v
Page Down v
à
à
PgDn
PgDn
VK_NEXT
VK_NEXT
Page Up v
Page Up v
à
à
PgUp
PgUp
VK_PRIOR
VK_PRIOR
Spacebar
Spacebar
VK_SPACE
VK_SPACE
Ph
Ph
í
í
m tương
m tương
ứ
ứ
ng
ng
Mã ph
Mã ph
í
í
m
m
ả
ả
o
o
22
X
X
ử
ử
lý keyboard
lý keyboard
•
•
Mã ph
Mã ph
í
í
m
m
ả
ả
o
o
Ph
Ph
í
í
m Menu
m Menu
VK_APPS
VK_APPS
Ph
Ph
í
í
m Windows (ph
m Windows (ph
ả
ả
i)
i)
VK_RWIN
VK_RWIN
Ph
Ph
í
í
m Windows (tr
m Windows (tr
á
á
i)
i)
VK_LWIN
VK_LWIN
Scroll Lock
Scroll Lock
VK_SCROLL
VK_SCROLL
Num Lock
Num Lock
VK_NUMLOCK
VK_NUMLOCK
Caps Lock
Caps Lock
VK_CAPITAL
VK_CAPITAL
Ph
Ph
í
í
m / (bên ph
m / (bên ph
ả
ả
i)
i)
VK_DIVIDE
VK_DIVIDE
Ph
Ph
í
í
m . (bên ph
m . (bên ph
ả
ả
i)
i)
VK_DECIMAL
VK_DECIMAL
Ph
Ph
í
í
m
m
–
–
(bên ph
(bên ph
ả
ả
i)
i)
VK_SUBTRACT
VK_SUBTRACT
Ph
Ph
í
í
m + (bên ph
m + (bên ph
ả
ả
i)
i)
VK_ADD
VK_ADD
Ph
Ph
í
í
m * (bên ph
m * (bên ph
ả
ả
i)
i)
VK_MULTIPLY
VK_MULTIPLY
Ph
Ph
í
í
m tương
m tương
ứ
ứ
ng
ng
Mã ph
Mã ph
í
í
m
m
ả
ả
o
o
X
X
ử
ử
lý keyboard
lý keyboard
•
•
C
C
á
á
c ph
c ph
í
í
m A
m A
-
-
Z, a
Z, a
-
-
z, 0
z, 0
-
-
9 c
9 c
ó
ó
mã ph
mã ph
í
í
m
m
ả
ả
o mang gi
o mang gi
á
á
tr
tr
ị
ị
ANSI c
ANSI c
ủ
ủ
a ph
a ph
í
í
m.
m.
– 0x41 – 0x5A : A-Z
– 0x61 – 0x7A : a-z
– 0x30 – 0x39 : 0-9
23
X
X
ử
ử
lý keyboard
lý keyboard
•
•
L
L
ấ
ấ
y tr
y tr
ạ
ạ
ng th
ng th
á
á
i c
i c
á
á
c ph
c ph
í
í
m Ctrl, Shift, Num Lock, CapsLock,
m Ctrl, Shift, Num Lock, CapsLock,
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
M
M
ộ
ộ
t s
t s
ố
ố
l
l
ớ
ớ
p thư
p thư
ờ
ờ
ng g
ng g
ặ
ặ
p
p
•
•
L
L
ớ
ớ
p CWnd
p CWnd
•
•
L
L
ớ
ớ
p CString
p CString
24
L
L
ớ
ớ
p CWnd
p CWnd
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u
u
•
•
Đây l
Đây l
à
à
m
m
ộ
ộ
t l
t l
ớ
ớ
p t
p t
ổ
ổ
ng qu
ng qu
á
á
t v
t v
à
à
g
g
ặ
ặ
p r
p r
ấ
ấ
t nhi
t nhi
ề
ề
u l
u l
ầ
ầ
n
n
trong qu
trong qu
á
á
tr
tr
ì
ì
nh l
nh l
à
à
m vi
m vi
ệ
ệ
c trên dialog n
c trên dialog n
ó
ó
i riêng v
i riêng v
à
à
trên c
trên c
á
á
c
c
ứ
ứ
ng d
ng d
ụ
ụ
ng MFC n
ng MFC n
ó
ó
i chung.
i chung.
•
•
L
L
ớ
ớ
p CWnd cung c
p CWnd cung c
ấ
ấ
p c
p c
á
á
c ch
c ch
ứ
ứ
c năng cơ b
c năng cơ b
ả
ả
n cho
n cho
t
t
ấ
ấ
t c
t c
ả
ả
c
c
á
á
c l
c l
ớ
ớ
p c
p c
ử
ử
a s
a s
ổ
ổ
(c
(c
á
á
c control, mainframe,
c control, mainframe,
view, dialog
view, dialog
…
…
) t
) t
rong thư vi
rong thư vi
ệ
ệ
n MFC.
n MFC.
L
L
ớ
ớ
p CWnd
p CWnd
C
C
á
á
c h
c h
à
à
m cơ b
m cơ b
ả
ả
n c
n c
ủ
ủ
a l
a l
ớ
ớ
p CWnd
p CWnd
•
•
GetDlgItem
GetDlgItem
•
•
EnableWindow
EnableWindow
•
•
GetFocus
GetFocus
•
•
SetFocus
SetFocus
•
•
GetClientRect
GetClientRect
•
•
MoveWindow
MoveWindow
•
•
GetDlgCtrlID
GetDlgCtrlID
•
•
GetDlgItemInt
GetDlgItemInt
•
•
GetDlgItemText
GetDlgItemText
•
•
SetDlgItemText
SetDlgItemText
•
•
GetWindowText
GetWindowText
•
•
SetWindowText
SetWindowText
25
C
C
á
á
c h
c h
à
à
m cơ b
m cơ b
ả
ả
n c
n c
ủ
ủ
a l
a l
ớ
ớ
p CWnd
p CWnd
H
H
à
à
m CWnd::GetDlgItem
m CWnd::GetDlgItem
•
•
CWnd*
CWnd*
GetDlgItem
GetDlgItem
(int nID ) const;
(int nID ) const;
– Trả về con trỏ CWnd* của một cửa sổ con trên 1
dialog.
– Ví dụ :
CWnd *pWnd;
pWnd = this->GetDlgItem(IDC_EDIT1);
C
C
á
á
c h
c h
à
à
m cơ b
m cơ b
ả
ả
n c
n c
ủ
ủ
a l
a l
ớ
ớ
p CWnd
p CWnd
H
H
à
à
m CWnd::EnableWindow
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
– Ví dụ:
CWnd* pWnd = this->GetDlgItem(edt1);
pWnd->EnableWindow(FALSE);
pWnd = this->GetDlgItem(stc3);
pWnd->EnableWindow(TRUE);