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