Title: L?P TR
1L?P TRÌNH WINDOWS
- Gi?i thi?u v? MFC, Visual C 6.0
2N?i dung
Gi?i thi?u v? MFC Chuong trình MFC d?u
tiên X? lý chu?t và bàn phím Message Box
3N?i dung
Gi?i thi?u v? MFC Chuong trình MFC d?u
tiên X? lý chu?t và bàn phím Message Box
4Gi?i thi?u v? MFC
Microsoft Foundation Class là m?t thu vi?n
các l?p (class, OOP) trong ngôn ng? Visual C,
du?c s? d?ng d? xây d?ng các ?ng d?ng trên
Windows Ðu?c xây d?ng trên co s? các hàm thu
vi?n API c?a Windows Version 6 có kho?ng 200
class Giúp cho ngu?i l?p trình có th? xây
d?ng ?ng d?ng nhanh và ít t?n công s?c hon so v?i
vi?c s? d?ng don thu?n các hàm thu vi?n API c?a
Windows Trong m?t ?ng d?ng MFC, ta s? không
g?i tr?c ti?p các hàm Windows API mà s? t?o các
object t? nh?ng l?p c?a MFC, sau dó g?i các hàm
c?a object này Ta v?n có th? g?i các hàm
Windows API trong MFC
5Gi?i thi?u v? MFC
Ða s? các phuong th?c c?a MFC class có cùng
tên v?i nh?ng hàm Windows API MFC t?o ra m?t
Application Framework, giú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 di nhi?u ph?n chi ti?t mà Windows
API dòi h?i, giúp developer th?nh thoi hon
6Các thành ph?n trong ?ng d?ng Visual C
7Chuong trình MFC d?u tiên
?? ?ng d?ng don gi?n dùng Application
Framework ?? ?ng d?ng ph?c t?p hon (Dialog-based
App)
8Chuong trình MFC d?u tiên
?ng d?ng don gi?n
?? T?o ?ng d?ng ?? Các thành ph?n c?a chuong trình
9Chuong trình MFC d?u tiên
t?o ?ng d?ng
?? Ch?n menu File ? New ?? Ch?n tab Projects ??
Ch?n lo?i project Win32 Application ?? Ð?t tên
project và xác d?nh du?ng d?n thu m?c trong ô
Location ?? Ch?n lo?i ?ng
d?ng An empty project ??Nh?n Finish d? k?t thúc
10Chuong trình MFC d?u tiên
t?o ?ng d?ng
- ?? Add các file Hello.h và Hello.cpp vào project
- ?? Ch?n menu Project ? Settings
- Ch?n project trong c?a s? bên trái
- Ch?n tab General
- Ch?n Use MFC In A Shared DLL
11Chuong trình MFC d?u tiên
Hello.h
class CMyApp public CWinApp public virtual
BOOL InitInstance () class CMainWindow
public CFrameWnd public CMainWindow
() protected afx_msg void OnPaint
() DECLARE_MESSAGE_MAP ()
12Chuong trình MFC d?u tiên
Hello.cpp
include ltafxwin.hgt include "Hello.h" CMyApp
myApp ///////////////////////////////////////////
/////////////// // CMyApp member functions BOOL
CMyAppInitInstance () m_pMainWnd new
CMainWindow m_pMainWnd-gtShowWindow
(m_nCmdShow) m_pMainWnd-gtUpdateWindow () return
TRUE //////////////////////////////////////////
////////////////
13Chuong trình MFC d?u tiên
Hello.cpp(tt)
// CMainWindow message map and member
functions BEGIN_MESSAGE_MAP (CMainWindow,
CFrameWnd) ON_WM_PAINT () END_MESSAGE_MAP
() CMainWindowCMainWindow () Create (NULL,
_T ("The Hello Application")) void
CMainWindowOnPaint () CPaintDC dc
(this) CRect rect GetClientRect
(rect) dc.DrawText (_T ("Hello, MFC"), -1,
rect, DT_SINGLELINE
DT_CENTER DT_VCENTER)
14Chuong trình MFC d?u tiên
k?t qu?
15Chuong trình MFC d?u tiên
các class c?a ?ng d?ng
16Chuong trình MFC d?u tiên
các thành ph?n
- CWinApp l?p chính c?a MFC d? qu?n lý ?ng d?ng.
Ch?a d?ng vòng l?p nh?n message và phân ph?i
message d?n các c?a s? c?a ?ng d?ng - CMyApp l?p k? th?a t? l?p CWinApp
- class CMyApp public CWinApp
- public
- virtual BOOL InitInstance ()
-
17Chuong trình MFC d?u tiên
các thành ph?n
- InitInstance() hàm kh?i t?o ?ng d?ng, override
lên hàm chu?n c?a l?p CWinApp - BOOL CMyAppInitInstance ()
- m_pMainWnd new CMainWindow
- m_pMainWnd-gtShowWindow (m_nCmdShow)
- m_pMainWnd-gtUpdateWindow ()
- return TRUE
18Chuong trình MFC d?u tiên
các thành ph?n
- CWnd l?p chính c?a MFC d? qu?n lý các lo?i c?a
s? giao di?n. Có nhi?u l?p du?c k? th?a t? l?p
này d? qu?n lý các lo?i c?a s? khác nhau
(CTreeCtrl, CListBox, Cedit,) - CFrameWnd l?p k? th?a t? l?p CWnd, d? qu?n lý
c?a s? giao di?n chính c?a ?ng d?ng
19Chuong trình MFC d?u tiên
các thành ph?n
- CMainWindow l?p k? th?a t? l?p CFrameWnd
- class CMainWindow public CFrameWnd
- public
- CMainWindow ()
- protected
- afx_msg void OnPaint ()
- DECLARE_MESSAGE_MAP ()
20Chuong trình MFC d?u tiên
các thành ph?n
- CMainWindow() hàm kh?i t?o c?a s? giao di?n c?a
?ng d?ng, override lên hàm chu?n c?a l?p
CFrameWnd - CMainWindowCMainWindow ()
- Create (NULL, _T ("The Hello Application"))
-
- OnPaint hàm thành ph?n c?a l?p CMainWindow,
du?c g?i khi c?n c?p nh?t n?i dung c?a s?. Hàm
này du?c d?nh nghia ch?ng lên hàm chu?n c?a l?p
CFrameWnd. - void CMainWindowOnPaint ()
- CPaintDC dc(this)
- CRect rect
- GetClientRect (rect)
- dc.DrawText (_T ("Hello, MFC"), -1, rect,
DT_SINGLELINE DT_CENTER DT_VCENTER) -
21Chuong trình MFC d?u tiên
các bu?c th?c thi ?ng d?ng
22Chuong trình MFC d?u tiên
dang ký l?p c?a s?
23Chuong trình MFC d?u tiên
t?o l?p c?a s?
24Chuong trình MFC d?u tiên
Hàm l?p c?a s?
25Chuong trình MFC d?u tiên
Hàm l?p c?a s? - tham s?
26Chuong trình MFC d?u tiên Hàm l?p c?a
s? - các ki?u dáng c?a s?
27Chuong trình MFC d?u tiên
Hi?n th? c?a s?
28Chuong trình MFC d?u tiên
Vòng l?p và x? lý thông di?p
29Chuong trình MFC d?u tiên
Message Map Ánh x? thông di?p
- MFC dùng Message Map d? liên k?t các message v?i
nh?ng hàm thành ph?n c?a l?p c?a s? - Ánh x? thông di?p là b?ng tuong quan gi?a thông
di?p và các hàm thành ph?n qu?n lý các thông di?p
dó - Ánh x? thông di?p du?c khai báo nhu các thành
ph?n l?p khác trong khai báo l?p
class CMainWindow public CFrameWnd public CMai
nWindow () protected afx_msg void OnPaint
() DECLARE_MESSAGE_MAP ()
30Chuong trình MFC d?u tiên
Message Map Ánh x? thông di?p
- M?i message s? du?c x? lý b?i 1 hàm thành ph?n
tuong ?ng - Nh?ng thông di?p v?i ti?n t? WM_XYZ s? du?c cài
d?t tuong ?ng v?i hàmtheo qui t?c - WM_ du?c chuy?n thành On
- XYZ du?c chuy?n thành ch? thu?ng tr? ký t? d?u
- Ví d?
- WM_PAINT s? du?c chuy?n thành OnPaint
- WM_MOUSEMOVE s? du?c chuy?n thành OnMouseMove
- WM_LBUTTONDOWN s? du?c chuy?n thành
OnLButtonDown
31Chuong trình MFC d?u tiên
Message Map Ánh x? thông di?p
class CMainWindow public CFrameWnd
public CMainWindow () protected afx_msg
void OnPaint () afx_msg void
OnLButtonDown(UINT, CPoint) afx_msg void
OnMouseMove(UINT, CPoint) DECLARE_MESSAGE_MAP
()
BEGIN_MESSAGE_MAP (CMainWindow,
CFrameWnd) ON_WM_PAINT () ON_WM_LBUTTONDOWN() END_
MESSAGE_MAP () void CMainWindowOnPaint()
void CMainWindowOnLButtonDown(UINT nFlags,
CPoint point)
32Chuong trình MFC d?u tiên
Message Map Ánh x? thông di?p
33Chuong trình MFC d?u tiên
X? lý thêm message WM_LBUTTONDOWN
- B? sung thêm 1 hàm thành ph?n vào khai báo c?a
l?p CMainWindow - afx_msg void OnLButtonDown(UINT nFlags, CPoint
point) - B? sung thêm 1 macro vào khai báo Message Map
- ON_WM_LBUTTONDOWN ()
- Ð?nh nghia hàm thành ph?n OnLButtonDown
- void CMainWindowOnLButtonDown(UINT nFlags,
CPoint point) -
- MessageBox("Left button clicked !", "Mouse",
MB_OK)
34T?o ?ng d?ng MFC b?ng APPWizard
- Ch?n menu File ? New
- Ch?n Tab Projects
- Ch?n lo?i project MFC AppWizard (exe)
- Ð?t tên project trong ô Project name
- Xác d?nh du?ng d?n thu m?c trong Location
- Step 1 Ch?n lo?i ?ng d?ng Single Document
- Nh?n Next d?n Step 4 of 6
35T?o ?ng d?ng MFC b?ng APPWizard
Ch?n lo?i project MFC AppWizard (EXE)
36T?o ?ng d?ng MFC b?ng APPWizard
Ch?n option Single document
37T?o ?ng d?ng MFC b?ng APPWizard
Ch?n option None
38T?o ?ng d?ng MFC b?ng APPWizard
Ch?n option Next
39T?o ?ng d?ng MFC b?ng APPWizard
Ch?n option Next
40T?o ?ng d?ng MFC b?ng APPWizard
Ch?n Finish
41X? lý thông di?p chu?t
42Message Map và ClassWizard
43Hàm x? lý thông di?p chu?t tuong ?ng
void CMouseViewOnLButtonDown(UINT nFlags,
CPoint point) // TODO Add your message handler
code here and/or call default CViewOnLButtonDown
(nFlags, point) void CMouseViewOnLButtonUp(U
INT nFlags, CPoint point) // TODO Add your
message handler code here and/or call
default CViewOnLButtonUp(nFlags,
point) void CMouseViewOnMouseMove(UINT
nFlags, CPoint point) // TODO Add your message
handler code here and/or call default CViewOnMou
seMove(nFlags, point)
44Hàm x? lý thông di?p chu?t tuong ?ng
void CMouseViewOnLButtonDown(UINT nFlags,
CPoint point) // TODO Add your message handler
code here and/or call default m_nStartX
point.x m_nStartY point.y CViewOnLButtonDown
(nFlags, point) void CMouseViewOnLButtonUp(U
INT nFlags, CPoint point) // TODO Add your
message handler code here and/or call
default CClientDC dc(this) dc.MoveTo(m_nStartX,m_
nStartY) dc.LineTo(point.x,point.y) CViewOnLBu
ttonUp(nFlags, point)
45K?t qu?
46Hàm x? lý thông di?p chu?t tuong ?ng
void CMouseViewOnLButtonDown(UINT nFlags,
CPoint point) // TODO Add your message handler
code here and/or call default m_nStartX
point.x m_nStartY point.y CViewOnLButtonDown
(nFlags, point) void CMouseViewOnMouseMove(U
INT nFlags, CPoint point) // TODO Add your
message handler code here and/or call
default CClientDC dc(this) dc.MoveTo(m_nStartX,m_
nStartY) dc.LineTo(point.x,point.y) CViewOnLBu
ttonUp(nFlags, point)
47K?t qu?
48X? lý Keyboard -
Thông di?p c?a keyboard
- WM_KEYDOWN / WM_KEYUP phát sinh khi 1 phím
(không ph?i là phím h? th?ng) du?c nh?n xu?ng/th?
ra - Hàm x? lý tuong ?ng CWndOnKeyDown,
CWndOnKeyUp - 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 du?c (printed
character) dã du?c t?o ra - Hàm x? lý tuong ?ng CWndOnChar
- 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,)
49X? lý Keyboard
- Ví d?
- Ví d? X? lý phím nh?n
- Mô t? khi user nh?n m?t phím ? hi?n th? 1
MessageBox thông báo - Các x? lý c?n thi?t
- WM_KEYDOWN ? OnKeyDown
- Ð?nh nghia hàm x? lý message WM_KEYDOWN
50X? lý Menu
?? M?t vài khái ni?m ?? T?o l?p menu ?? Load và
hi?n th? menu ?? X? lý khi menu item du?c ch?n ??
Thay d?i tr?ng thái menu ?? Ví d?
51X? 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 - Drop-down menu 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,
- Menu item tuong ?ng v?i 1 l?nh c?a chuong
trình. M?i menu item du?c xác d?nh b?ng 1 s?
nguyên phân bi?t, g?i là item ID hay command ID. - VD. Open, Save,
- Popup menu gi?ng nhu drop-down menu, nhung có
th? xu?t hi?n ? v? trí b?t k? trên màn hình
(thu?ng khi nh?n nút ph?i mouse) - System menu ch?a các l?nh h? th?ng di?u khi?n
c?a s?. - VD. Minimize, Maximize, Close,
52X? lý Menu - T?o l?p menu
- Thu?ng có 2 cách chính d? t?o menu
- T?o menu ? d?ng resource c?a ?ng d?ng, và load
vào khi ch?y - T?o tr?c ti?p b?ng các hàm khi ?ng d?ng dang
ch?y. - L?p s? d?ng d? qu?n lý menu CMenu
- Các hàm thành ph?n CreateMenu, InsertMenu,
53X? lý Menu - T?o l?p menu
File xxx.rc IDR_MAINFRAME MENU PRELOAD
DISCARDABLE BEGIN POPUP "File" BEGIN MENUITEM
"New\tCtrlN", ID_FILE_NEW MENUITEM
"Open...\tCtrlO", ID_FILE_OPEN MENUITEM
SEPARATOR MENUITEM "Exit", ID_APP_EXIT END POPU
P "Edit" BEGIN MENUITEM "Undo\tCtrlZ",
ID_EDIT_UNDO MENUITEM SEPARATOR MENUITEM
"Cut\tCtrlX", ID_EDIT_CUT MENUITEM
"Copy\tCtrlC", ID_EDIT_COPY MENUITEM
"Paste\tCtrlV", ID_EDIT_PASTE END END
54X? lý Menu - Load và hi?n th? menu
Xác d?nh menu bar khi t?o c?a s? Create(NULL,
_T("My Application"), WS_OVERLAPPEDWINDOW,
rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME))
Thay d?i menu bar CMenu menu menu.LoadMenu(ID
R_MAINFRAME) SetMenu(menu) menu.Detach()
55Message Box
- H?p thông báo du?c s? d?ng d? thông báo, trao
d?i gi?a ?ng d?ng v?i ngu?i dùng
- Ð? t?o l?p h?p thông báo, ta s? d?ng hàm
MessageBox
CWndint MessageBox (LPCTSTR lpszText,
LPCTSTR lpszCaption
NULL, UINT nType
MB_OK)
56Các ki?u h?p thông báo và giá tr? tr? v? tuong ?ng
Type Buttons Return Codes
MB_ABORTRETRYIGNORE Abort, Retry, Ignore IDABORT, IDRETRY, IDIGNORE
MB_OK OK IDOK
MB_OKCANCEL OK, Cancel IDOK, IDCANCEL
MB_RETRYCANCEL Retry, Cancel IDRETRY, IDCANCEL
MB_YESNO Yes, No IDYES, IDNO
MB_YESNOCANCEL Yes, No, Cancel IDYES, IDNO, IDCANCEL
57Message Box - Ví d?
Ð? t?o l?p h?p thông báo trên ta s? d?ng hàm
MessageBox nhu sau
int nRes MessageBox (Are you sure you want to
delete these 2 items?, Confirm Multiple File
Delete, MB_YESNO)
- Ch?n Yes ? nRes IDYES
- Ch?n No ? nRes IDNO
58Message Box - Ví d?
Ð? t?o l?p h?p thông báo trên ta s? d?ng hàm
MessageBox nhu sau
int nRes MessageBox (Do you want to save the
changes to Document1, Microsoft Office Word ,
MB_YESNOCANCEL)
- Ch?n Yes ? nRes IDYES
- Ch?n No ? nRes IDNO
- Ch?n Cancel ? nRes IDCANCEL
59Message Box - Các ki?u bi?u tu?ng trong h?p
thông báo
60Message Box - Ví d?
Ð? t?o l?p h?p thông báo trên ta s? d?ng hàm
MessageBox nhu sau
int nRes MessageBox (Do you want to continue,
My Application, MB_YESNO MB_ICONQUESTION)
- Ch?n Yes ? nRes IDYES
- Ch?n No ? nRes IDNO
61Message Box - Ví d?
Ð? t?o l?p h?p thông báo trên ta s? d?ng hàm
MessageBox nhu sau
int nRes MessageBox (Do you want to save the
changes to Document1 , Microsoft Office Word,
MB_YESNOCANCEL MB_ICONEXCLAMATION)
- Ch?n Yes ? nRes IDYES
- Ch?n No ? nRes IDNO
- Ch?n Cancel ? nRes IDCANCEL