10 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com
CHƯƠNG 2:
Thư vin MFC ca microsoft
& ng dng cơ bn trong windows
2.1 THƯ VIN MFC (MICROSOFT FOUNDATION CLASS):
Thư vin MFC ca Microsoft bao gm các lp cơ bn, cài đặt bng
ngôn ng C++, h tr vic lp trình trong môi trường windows. T các lp
này, MFC xác lp nn tng hình thành ng dng ca windows, bao gm
vic định nghĩa b khung ng dng, các công c chun và ph biến để
b sung vào b khung nói trên nhm to ra ng dng hoàn chnh. Vi
MFC, công vic ca người lp trình ch còn là vic la chn các thành
phn cn thiết, điu chnh và phi hp chúng hp lý đểđược ng
dng kết qu mong mun.
Lp trình windows vi MFC và MicroSoft Visual C++ 6.0 (VC) đạt
được hiu qu cao bi không ch khai thác được phiên bn mi nht ca
MFC mà còn nhn được nhiu tin nghi lp trình mà VC cung cp. Ðây là
con đường ngn và đơn gin, đặc bit vi người t hc, để viết ng dng
windows.
2.2 TIP CN MFC:
MFC là thư vin khng l vi khong 200 lp đối tượng mà vic hiu
rõ và vn dng chúng trong mt khong thi gian ngn là không th
được. Mc tiêu ca chúng ta là hiu và vn dng nhng thành phn ph
biến nht ca thư vin để xây dng ng dng thông thường. Khi đã có
kh năng nht định v s dng MFC thì vi tài liu MSDN, s chng khó
khăn gì trong vic m rng khai thác thư vin để ng dng tr nên mnh
m và tinh tế hơn.
Trong nhng phn trình bày sau, chúng ta s ln lượt tiếp nhn h
thng ni dung hơi nng tính lý thuyết để đảm bo cu trúc kiến thc, và
phn thc hành phi hp s giúp chúng ta kim nghim và hiu rõ vn
đề.
2.3 TO NG DNG WINDOWS VI MFC NHƯ TH NÀO ?:
Theo mô hình kiến trúc ng dng windows mc (1.8), vic gii quyết
vn đề trên chính là vic thc hin tr li các câu hi sau đây:
Làm thế nào to đối tượng tiu trình chính ca ng dng ?
Làm thế nào to đối tượng giao din ca ng dng ?
Qun lý tương tác gia đối tượng ng dng và đối tượng giao din ?
Bng vic xem xét các lp MFC liên quan s giúp ln lượt lý gii các
câu hi được đặt ra. Tiếp theo, chúng ta tìm hiu xem nhng lp nào
ca MFC giúp khai báo đối tượng tiu trình trong ng dng.
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 11
2.4 LP QUN LÝ TIU TRÌNH CWinThread:
CWinThread là mt lp ca MFC, lp đối tượng qun lý tiu trình được
to ra trong tiến trình ca mt ng dng đang được thc hin. Tiu trình
được qun lý có th là là tiu trình giao din hoc tiu trình x lý ni. Các
dch v cơ bn phc v cho qun lý tiu trình do CWinThread cung cp
thông qua các thuc tính và hành vi ca nó.
DWORD
m_nThreadID
: Thuc tính lưu s hiu ca tiu trình.
CWnd*
m_pMainWnd
: Lưu con tr đối tượng ca s giao din
chính ca tiu trình. Khi ca s giao din chính chm dt hot
động, tiu trình liên quan s kết thúc. Nếu tiu trình thuc loi tiu
trình x lý ni thì giá tr này kế tha t tiu trình giao din cp cao
hơn.
CWinThread( ); Hành vi to lp (constructor) đối tượng tiu trình.
virtual BOOL InitInstance( ); Khi to thông s cho đối tượng tiu
trình và đảm nhn các x lý b sung khác ca ng dng. Ði vi
tiu trình giao din, hành vi này được dùng để khi to đối tượng
ca s giao din và gán địa ch ca đối tượng ca s cho
m_pMainWnd
.
virtual int ExitInstance( ); Hành vi kết thúc ca đối tượng tiu trình.
Thông qua hành vi này, đối tượng qun lý tiu trình thc hin hoàn
tr các tài nguyên ca h thng mà nó đã đăng ký s dng.
virtual int Run( ); Hành vi dành riêng cho tiu trình giao din, nó
thc hin vòng lp nhn message, chuyn message cho hành vi
PreTranslateMessage ca lp. Nếu hành vi này tr v giá tr 0 thì
message s tiếp tc được chuyn đến các hàm din dch phím
TranslateMessage và hàm điu phi message DispatchMessage.
virtual BOOL PreTranslateMessage(MSG *
pMsg
); Hành vi cho
phép can thip trước trên các message nhn được t message
queue ca ng dng. Thông qua đó, tiu trình giao din có th thc
hin các tin x lý message đặc trưng nhm đáp ng yêu cu đặt
ra cho ng dng.
)
Khi CWinThread được dùng để qun lý đối tượng tiu trình chính thì
hàm WinMain (cài sn bên trong lp bi thư vin MFC) t động thc
hin các hành vi
InitInstance(), Run()ExitInstance() theo th t.
12 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com
2.5 LP QUN LÝ TIU TRÌNH GIAO DIN CHÍNH CWinApp:
CWinApp, kế tha t CWinThread, là lp đối tượng chuyên dùng qun
lý tiu trình giao din chính ca ng dng. ng dng windows ch được
phép s dng mt đối tượng thuc lp này. Ngoài các thuc tính, hành vi
kế tha public t CWinThread, CWinApp có các thuc tính và hành vi b
sung sau:
const char*
m_pszAppName
: Lưu chui tên ca ng dng.
LPTSTR
m_lpCmdLine
: Lưu ni dung chui tham s dòng lnh.
Tham s dòng lnh là toàn b phn ni dung mà người dùng gõ
vào ngay sau chui đường dn và tên chương trình ng dng khi
h thc hin ng dng. Ði vi ng dng có nhiu chế độ hot
động khác nhau thì vic s dng tham s dòng lnh là mt cơ chế
xác lp các giao ước gia ng dng và người dùng để chn chế độ
s dng ng dng thích hp.
int
m_nCmdShow
: Lưu giá tr thông s đã được dùng để kích hot
ca s giao din chính ca ng dng.
CWinApp( ); To lp đối tượng tiu trình chính.
HCURSOR LoadCursor( int
nID
); Np cursor t resource ca ng
dng vào b nh (nếu cursor chưa được np).
nID
là s hiu ca
cursor. Hàm tr v giá tr handle qun lý cursor. Giá tr này có kiu
HCURSOR (handle of cursor) mà windows dùng để qun lý cursor.
HICON LoadIcon ( int
nID
); Np icon t resource ca ng dng
vào b nh.
nID
là s hiu ca icon. Hàm tr v giá tr handle qun
lý icon. Giá tr này có kiu HICON (handle of icon).
Hành vi hin th hp thông báo và ch nhn ý kiến người dùng:
virtual int DoMessageBox (
LPCTSTR
lpszPrompt
, // Ni dung thông báo
UINT
nType
, // Dng hp thông báo
UINT
hlpIndex = 0
// S hiu mc giúp đỡ (WinHelp)
);
Hành vi này được kích hot vi tham s tương ng mi khi trong
chương trình s dng hàm AfxMessageBox để hin th hp thông
báo.
int AfxMessageBox (
LPCTSTR
lpszPrompt
, UINT
nType
, UINT
hlpIndex = 0
);
nType
: n định dng hp thông báo. Giá tr này là s kết hp gia
thông s qui định biu tượng hin th và các nút chn b trí trong
hp.
Các thông s qui định các nút chn b trí trong hp thông báo
:
Giá tr thông s Nút chn b trí trong hp
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 13
MB_OK OK
MB_OKCANCEL OK - Cancel
MB_YESNO Yes - No
MB_YESNOCANCEL Yes - No - Cancel
MB_ABORTRETRYIGNORE Abort - Retry - Ignore
MB_RETRYCANCEL Retry - Cancel
Các thông s qui định biu tượng dùng trong nút chn
:
Giá tr thông s Biu tượng
MB_ICONHAND, MB_ICONSTOP,
MB_ICONERROR
MB_ICONQUESTION
MB_ICONEXCLAMATION, MB_ICONWARNING
MB_ICONASTERISK, MB_ICONINFORMATION
S hiu các nút chn được s dng trong hp thông báo
:
S hiu Nút chn S hiu Nút chn
IDABORT Abort IDOK OK
IDCANCEL Cancel IDRETRY Retry
IDIGNORE Ignore IDYES Yes
IDNO No
Hành vi DoMessageBox ch người s dng tr li bng cách
chn mt nút chn xác định trong hp thông báo. Hành vi kết
thúc vi giá tr tr v là s hiu ca nút được chn. Kế tha hành
vi này để chn và thc hin xđặc trưng (s dng dng hp
thông báo riêng) cho tt c các li gi AfxMessageBox trong
ng dng.
Hàm AfxMessageBox s dng DoMessageBox để hin th hp
thông báo và ly giá tr ca hành vi này làm kết qu tr v ca
nó.
Ví d: AfxMessageBox( "Chao Ban", MB_ICONSTOP | MB_OK, 0 );
) Hàm trên thc hin hin th hp thông báo vi ni dung là
"Chao Ban" , biu tượng đi kèm, và nút chn OK kết thúc.
14 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com
2.6 THC HIN NG DNG ÐƠN GIN:
Trong phn này, chúng ta thc hin ng dng vi đối tượng thuc lp
CWinApp qun lý tiu trình chính. Ðt tên cho d án ca ng dng là
VD0.
Các bước thc hin d án VD0 như sau:
Khi động windows vi h điu hành Win95 hoc bn mi hơn.
To mi mt thư mc để cha các d án. Ví d C:\VC6.
Thc hin ng dng Microsoft Visual C++ 6.0 (VC).
Chn mc File / New t h thng menu ca VC.
Trong hp hi thoi
New
, chn trang
Projects
:
-
Win32 Application
: Loi ng dng thc hin.
-
Location
: Ðường dn thư mc ca d án.
-
Project Name
: Tên d án.
Sau đó chn
OK
.
Tiếp theo, trong hp hi thoi
Step 1 of 1
.
-
An empty project
: To d án rng.
-
Finish
: Hoàn tt vic khi to d án.
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 15
VC hin th hp hi thoi
New Project Information
để thông báo
các thông tin liên quan đến d án va to. Chn
OK
.
)
Mt d án đã được to ra trên đĩa. Vi thông tin nhp như trên,
d án mi to ra có tên là VD0, toàn b phn chương trình
ngun ca d án được lưu trong thư mc VD0 thuc thư mc
C:\VC6.
Tiếp tc thc hin các bước sau để hoàn tt d án theo yêu cu.
Ðăng ký s dng lp CWinApp ca thư vin MFC: Lp CWinApp
được khai báo trong
afxwin.h
ca MFC. B sung tp tin
stdafx.h
vào d án và dùng tp tin này đăng ký các thư vin cn thiết ca
MFC.
Vic b sung tp tin
stdafx.h
vào d án được tiến hành như sau:
Chn mc File / New t h thng menu ca VC.
Trong hp hi thoi
New
, chn trang
Files
:
-
C/C++ Header File
: Loi ni dung tp tin (.h).
-
Add To Project
: B sung tp tin vào d án VD0.
-
File Name
: Tên tp tin (
StdAfx.h
)
Chn
OK
, tiếp tc thc hin các công vic sau.
Son tho tp tin
stdafx.h
, nhp các định hướng biên dch và
các ch th s dng thư vin MFC cn cho d án:
16 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com
#if !defined( _DU_AN_0_ )
#define _DU_AN_0_
// _DU_AN_0_ giúp trình dch không thc hin lp ch th
#include
#include <afxwin.h> // thư vin chun ca MFC
#endif
Sau khi nhp xong ni dung tp tin
stdafx.h
, chn mc File /
Save (hoc click biu tung trên thanh công c) để lưu tp tin.
To tp tin
Resource Script
ca d án: Tp tin này cha khai báo
ca các resource được s dng trong ng dng. Khi biên dch, các
resource này s được nhúng vào tp tin chương trình (.EXE). Các
bước to tp tin
Resource Script
trong d án như sau:
Chn mc File / New. Trong hp hi thoi
New
, chn trang
Files
.
-
Resource Script
: Loi ni dung tp tin (.rc).
-
Add To Project
: B sung tp tin vào d án.
-
File Name
: Tên tp tin, trùng vi tên ca d án.
Sau đó chn
OK
.
Ðăng ký các h tr ca MFC cho thao tác trên resource: Vic
đăng ký này là cơ s to quan h gia các ni dung ca
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 17
resource và đối tượng lp trình tương ng ca MFC trong d án.
Thc hin như sau:
- Right-click trên mc tên resource (
VD0 Resource
):
- Chn mc
Properties
:
Chn các mc như trên, gõ phím
Enter
để kết thúc.
Son tho resource: D án VD0 chưa cn s dng resource, tp
tin resource script s tm thi b trng. Chn mc File / Save,
đóng màn hình son tho resource để kết thúc bước này.
Chn phiên bn biên dch: Có hai phiên bn biên dch chương
trình.
Debug version
: Biên dch chương trình vi thông tin
debug.
Release version
: Phiên bn đem giao, không cha thông
tin debug.
Chn mc Build / Set Active Configurations:
Chn phiên bn biên dch ( chng hn
Win32 Debug
). Chn
OK
.
18 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com
n định biên dch vi thư vin MFC: Chn mc Project / Setting.
Trong hp hi thoi
Project Settings
,
-
Setting For
: : Chn phiên bn n định (ví d: Win32 Debug ),
-
General
: Các n định chung cho d án.
Microsoft Foundation Classes
: Cách liên kết thư vin MFC vào
ng dng. Có th tùy chn mt trong hai cách sau:
à Use MFC in Shared DLL: Chương trình s dng thư vin
MFC theo cơ chế liên kết động. Tp tin chương trình có kích
thước nh nhưng khi thc hin cn có các tp tin thư vin
(DLL) ca MFC trong thư mc h thng ca windows.
à Use MFC in Static Library: Thư vin MFC được nhúng vào
chương trình trong lúc biên dch. Tp tin chương trình có kích
thước ln hơn nhưng ng dng có th hot động độc lp.
Sau khi n định xong, chn
OK
.
Khai báo đối tượng thuc lp CWinApp: Dùng bt k tp tin CPP
nào ca d án để thc hin công vic này. Vì d án VD0 đang thc
hin đây chưa có tp tin CPP, chúng ta to mi tp tin CPP cho
d án. Gi s tp tin CPP này có tên là MAIN.CPP. Cách thc hin
như sau:
Chn mc File / New. Trong hp hi thoi New, chn trang
Files
:
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 19
-
C++ Source File
: Loi ni dung tp tin (.cpp).
-
Add To Project
: B sung tp tin vào d án.
-
File Name
: Tên tp tin (MAIN). Sau đó chn
OK
.
Trong màn hình son tho ca
main.cpp
, nhp ni dung tp tin:
#include "stdafx.h" // Tp tin cha đăng ký thư vin ca MFC
CWinApp
theApp
; // Ði tượng qun lý tiu trình chính
Sau khi nhp xong, chn mc File / Save để lưu tp tin.
Biên dch chương trình: Chn mc Build / Build <project name>.exe
hoc chn mc trên thanh công c.
Ta đã thc hin xong mt ng dng đơn gin trong môi trường
windows. Tp tin chương trình được lưu trong thư mc DEBUG
(phiên bn biên dch debug) hoc RELEASE (phiên bn biên dch
release).
Chy chương trình: Có th chy chương trình trc tiếp trong VC
bng cách nhn phím F5 hoc click chn trên thanh công c.
Nhn xét: ng dng VD0 không thc hin mt giao tác hay công vic
gì c bi nó ch là mt ng dng khung - được xây dng hoàn toàn t
lp CWinApp ca MFC mà không có mt x lý b sung nào.
2.7 THC HIN NG DNG GIAO TÁC ÐƠN GIN: