Thứ Hai, 17 tháng 2, 2014

Tài liệu Lập trình Windows với MFC Visual C++ 6.0 pdf


x}(|y

Ngôn ngữ lập trình C++ được biết đến như là một trong những ngôn ngữ
lập trình mạnh nhất nhờ khả năng của nó trong việc triển khai phần mềm
ở các mức độ khác nhau. Từ mức hệ thống đến mức ứng dụng, từ lập trình
cấu trúc đến lập trình hướng đối tượng, từ lập trình dựa trên thuật giải đến
lập trình trí tuệ nhân tạo, và từ lập trình cơ sở dữ liệu đến lập trình cơ sở
tri thức…, bất cứ đâu, khi mà người lập trình muốn thể hiện ý tưởng khoa
học và nghệ thuật của mình trên máy tính thì C++ là một điều nghó đến
trước tiên.

Nhưng dù ý tưởng có bay bổng thế nào đi nữa thì cũng không thể bỏ qua
vấn đề cài đặt mà môi trường cho ứng dụng là điều phải quan tâm. Với xu
hướng sử dụng hệ điều hành Microsoft Windows như hiện nay, chúng ta
buộc phải nghó đến việc cài đặt ứng dụng của mình trong môi trường này
và khai thác nó sao cho ứng dụng hoạt động hiệu quả nhất.

Microsoft Visual C++, sản phẩm của Microsoft, với khả năng biên dòch ưu
việt và lối khai thác hệ thống rộng mở nhờ tập hợp lớp thư viện MFC cho
C++ có đầy đủ các tiện ích giúp chúng ta vét được mọi ngõ ngách của
Windows hầu phục vụ cho ứng dụng của mình.

Từ những nhận đònh nói trên, cuốn sách này được thực hiện để cùng các
bạn bắt đầu làm quen lập trình trong Windows áp dụng kỹ thuật lập trình
hướng đối tượng với C++, nhằm khai thác hiệu quả thư viện MFC và từng
bước du nhập vào thế giới tuyệt vời này thông qua các ứng dụng được sắp
xếp theo các cấp độ tiến triển phù hợp.


Trong lần xuất bản đầu tiên, cuốn sách này chắc không tránh khỏi thiếu
sót. Chúng tôi rất mong tiếp thu ý kiến đóng góp và trao đổi cùng bạn đọc.
Cuối cùng, chúng tôi xin chân thành cảm ơn bạn bè, đồng nghiệp đã cung
cấp những nhận xét và kiến thức q báu để thực hiện cuốn sách này. Xin
cảm ơn các bạn học viên-sinh viên, những người đã cùng làm việc với
chúng tôi qua nội dung này và đã có những ý kiến khách quan giúp chỉnh
sửa cuốn sách kòp thời.
Thành phố Hồ Chí Minh, ngày 19.11.2002
Tác giả


[1]
,
Windows 95 - Win32 Programming API-BIBLE
,
Waite Group Press 1996.
[2]
,
Programming Windows 95 with MFC
, Microsoft Press.
[3]
,
Professional Visual C++ ISAPI Programming
, Wrox Press.
[4]
,
Microsoft Developer Network - MSDN
,
Microsoft Corporation Software.
[5]
,
Visual C++ Windows Shell Programming
, Wrox Press.

xw(vy

:
- Microsoft Visual C++ 6.0 hoặc Microsoft Visual C++ .NET.
- MSDN ( Microsoft Developer Network ), bản tháng 10/2003.

:
Source Code của các ví dụ minh họa trong cuốn sách này và của một số
chương trình trò chơi mà chúng tôi mong muốn chia xẻ cùng bạn đọc
được lưu trong đóa mềm đính kèm, và có thể download từ đòa chỉ:


http://thanh.andisw.com/?id=16&id2=85

:
Source Code đặc sắc của nhiều tác giả trên thế giới có thể download:
- http://msdn.microsoft.com

- http://www.codeguru.com

- http://www.codeproject.com

- http://www.softechsoftware.it
- http://www.flipcode.com

- http://nps.vnet.ee


:
- Tác giả: Lê Ngọc Thạnh
- Cơ quan: Khoa Tin Học Quản Lý, Trường ĐHKT TP.HCM
Đòa chỉ
: 279 Nguyễn Tri Phương Q10, TP.HCM.
- Đòa chỉ e-mail: lntmail@yahoo.com

emp@ueh.edu.vn
Một số khái niệm lập trình trong môi trường Windows 1
:

M
   

1.1
:
Chng trình máy tính là tp hp các ch th ụiu khin hot ụng ca
máy, ục b trí theo mt trình t logic nhm phi hp thc hin mt
cơng vic xác ụnh. Các ch th ục th hin di dng mã ngun
(source code) hay mã máy (machine code). Chng trình mã máy có th
thc hin ục trên máy có b lnh tng thích, vi chng trình mã
ngun thì phi s dng mt ng dng chun dng ụ chuyn sang mã
máy trc khi thc hin.
Vic chuyn các ch th dng mã ngun sang ch th mã máy ụ thc
hin ục tin hành bng mt trong hai c ch sau:
̇ Thơng dch
: Mi ch th mã ngun ục chuyn sang ch th mã máy
tng ng và ục thc hin ngay, sau ụó tip tc vi ch th k tip.
̇ Biên dch
: Tt c các ch th mã ngun ục chuyn sang các ch th
mã máy tng ng. Tp hp các ch th mã máy này gi là chng
trình mã máy. Chng trình mã máy ục lu li trong tp tin chng
trình và v sau ta có th thc hin chúng mt cách ục lp trên máy.

1.2 
 :
Khi mt chng trình ục cài ụt trên máy tính ụ s dng, ta gi ụó
là ng dng, ví d nh ng dng NotePad, ng dng Microsoft Word,
Trong mơi trng windows, mi ng dng có th ục thi hành nhiu
ln thành nhiu bn khác nhau. Mi bn ụang thc hin ca mt ng
dng gi là th hin (instance) ca ng dng ụó.

1.3
 :
Tin trình là khái nim ch mt instance ụang hot ụng ca ng
dng. Khi ta double-click trên biu tng NotePad ụ chy ng dng
này, ta có mt tin trình ca ng dng NotePad.

1.4
 :
Tiu trình là mt nhánh x lý ục lp trong tin trình. Khi mt ng
dng ục thc hin ta có thêm mt tin trình. Do bn cht chng trình
làm nên ng dng ụó bao gm chng trình chính (
hay )
và các chng trình con mà tin trình ng vi nó có th tách thành các
nhánh x lý: mt nhánh x lý chính (primary thread), các nhánh x lý ph
(other threads). Các nhánh x lý này gi là các tiu trình. Có hai loi tiu
trình:
2 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
̇ Tiu trình giao din (user-interface thread): Có nhim v x lý các u
cu ca ngi dùng trong q trình giao tác vi h.
̇ Tiu trình x lý ni (worker thread)
: Có nhim v thc hin các x lý
tính tốn bên trong, khơng trc tip nhn u cu ca ngi dùng.
Q Thc ra, có th xem tiu trình giao din nh là mt tiu trình x lý ni
nhng có tính nng giao tác vi ngi s dng.

1.5
 :
Thơng ụip (message) là giá tr phn ánh mt ni dung giao tip hay
u cu x lý gia h thng (windows) và ng dng, gia các ng dng
vi nhau hoc gia các thành phn trong cùng mt ng dng.
1.5.1
 
:
C windows và ng dng ụu có th phát sinh message.
̇ Windows phát sinh message khi cn thơng tin cho ng dng các
hot ụng nhp-xut (hot ụng gõ phím, di chuyn hay click chut,
. ca ngi dùng), các thay ụi ca h thng (font ch, ch ụ phân
gii màn hình, màu sc, ) hoc nhng bin ụi khác liên quan ụn
ng dng.
̇ ng dng phát sinh message khi x lý ụiu khin các thành phn
bên trong ng dng phi hp th
c hin chc nng giao tip vi ngi
dùng, hoc khi ng dng thc hin giao tip vi windows hay vi các
ng dng khác ụang thc hin trong cùng h thng.

1.5.2
 :
̇
Message ục ụnh ngha bi h thng
: Là các message do h ụiu
hành windows to ra nhm phc v hot ụng ụiu khin tồn b h
thng, x lý thơng tin vào-ra hoc các thơng tin khác cho ng dng.
Khi có nhu cu, ng dng có th s dng nhng message này ụ
phát ụng mt chc nng ụiu khin nào ụó ca windows.
̇
Message ục ụnh ngha bi ngi dùng
: Là các message do ngi
vit ng dng ụnh ngha nhm to kênh liên lc ục thù gia các
thành phn trong ng dng, gia ng dng vi windows hoc vi
các ng dng khác ụang thc hin trong cùng h thng.
Một số khái niệm lập trình trong môi trường Windows 3
1.5.3 S  :
Có rt nhiu message khác nhau ục s dng trong mơi trng
windows. ng vi mi message xác ụnh, windows s dng mt giá tr
ngun khơng âm ụ ục t, giá tr này gi là s hiu message.
Các message do windows ụnh ngha có s hiu ục khai báo sn
và duy nht vi các hng s xác ụnh và tên gi gi nh ca chúng có
dng WM_
xxx
. Các messges do ngi dùng ụnh ngha cng phi ụng
ký s hiu. S hiu ụng ký khơng ục trùng lp và có giá tr nh nht
bng WM_USER (mt hng s do windows ụnh ngha).
S hiu message là c s ụ phân bit các message ln nhau.

1.5.4 Ð
  :
Ð ụi tng nhn message có thêm thơng tin v hồn cnh phát
sinh và ý ngha c th ca message, windows cho phép message ục
nhn thơng qua mt cu trúc cha s hiu message và các thơng s
kèm theo. Cu trúc này ục khai báo thành kiu MSG vi ni dung nh
sau:

typedef struct
{
HWND
hwnd
; // Giá tr có kích thc 4 bytes (long)
UINT
message
; // S hiu ca message
WPARAM
wParam
; // Giá tr khơng âm có kích thc 2 bytes
LPARAM
lParam
; // Giá tr khơng âm có kích thc 4 bytes
DWORD
time
; // Thi ụim sinh ra messsge
POINT
pt
; // Ta ụ cursor khi message ục gi.
} ;

Trng
hwnd
(window handle) ca cu trúc cha th (handle) qun lý
ca s giao din liên quan ụn message.
wParam

lParam
là hai tham
s gi kèm theo message làm nhim v cha thơng tin b sung. Hai
tham s này ục dùng khi message có nhiu ý ngha thc t khác nhau.
H Windows s dng giá tr có kích thc 4 bytes ụ qun lý các ụi
tng ca nó. Giá tr này gi là th qun lý ụi tng (object handle).
ng vi mi loi ụi tng c th, windows s dng mt kiu handle
riêng. HWND là kiu handle dùng qun lý ụi tng ca s giao din
trong windows.

1.6 C
      :
Ca s giao din là thành phn quan trng trong vic to ra mơi
trng giao din ụ ha ca các ng dng trong windows. Cùng vi s
phát trin ca h ụiu hành windows, hình nh ca s giao din cng
thay ụi theo vi chiu hng sinh ụng hn v hình thc và phong phú
hn v chc nng. Ðiu ụó khơng ch góp phn tng tính thm m mà
4 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
còn to s gn gi hn gia giao din ca ng dng trong windows vi
ngi dùng.
Dng thơng thng ca mt ca s giao din trong windows:

̇
System Menu Box
: Cha biu tng ca ng dng, là nút m hp
menu h thng vi các mc di chuyn, thay ụi kích thc hoc ụóng
ca s.
̇
Caption bar
: Thanh tiêu ụ ca ng dng.
̇
Menu bar
: H thng menu vi các mc la chn x lý.
̇
Minimize / Maximize Box
: Nút ụiu khin thu nh / phóng to ca s.
̇
Restore Box
: Nút khơi phc kích thc trc ụó ca ca s.
̇
Border
: Ðng vin bao quanh ca s.
̇
Client area
: Vùng làm vic ca ca s, dùng ụ hin th thơng tin.
̇
Scroll bar
: Thanh cun ni dung vùng làm vic ca ca s.
̇
Window Procedure
: Ngồi giao din ụ ha, ca s ca windows có
kh nng tip nhn và x lý message. Kh nng này ục thc hin
thơng qua hàm x lý message mà ta ụã gn cho ca s. Hàm x lý
này có khai báo nh sau:
LRESULT CALLBACK
(
HWND
hwnd
, // Tham s cha Handle ca ca s liên
quan
UINT
uMsg
, // Tham s cha s hiu message
WPARAM
wParam
, // Tham s b sung th nht kiu WORD
LPARAM
lParam
// Tham s b sung th hai kiu LONG
) ; Hàm tr v mt giá tr có kích thc là 32 bits.
Khi mt u cu x lý ục chuyn ụn ca s di dng message,
hàm
WindowProc
gn vi ca s s cn c trên s hiu message
(uMsg) ụ chn x lý phù hp. Theo ngun tc, nu message ục
x lý hồn tt thì hàm tr v giá tr 0, ngc li (message khơng thuc
Một số khái niệm lập trình trong môi trường Windows 5
kh nng x lý ca ca s) hàm phi chuyn message cho windows
x lý thơng qua li gi hàm x lý message mc nhiên ca windows.
Hàm x lý này có tên gi là
DefWindowProc
vi khai báo nh sau:

LRESULT
( // Default Window Procedure
HWND
hWnd
, // Vi các tham s có ý ngha nh trên
UINT
Msg
,
WPARAM
wParam
,
LPARAM
lParam

) ;
Khi ụó, kt qu tr v ca
DefWindowProc
ục dùng làm kt qu
ca hàm
WindowProc
. Qui tc nói trên cn phi ục ụm bo, nu
khơng, ng dng có th làm ri lon hot ụng ca h ụiu hành
windows.

1.7
:
Message queue là danh sách th t các message do windows to ra
và ục dùng ụ cha các message ụang ch ục x lý. Message
queue hot ụng theo ngun tc FIFO (First-In, First-Out: vào trc, ra
trc). Có hai loi message queue trong windows:
̇
Message queue ca h thng (system queue)
: Ðc windows dùng
riêng cho vic lu tr các messge ục t thơng tin nhp-xut liên quan
ụn thit b phn cng trong q trình h thng giao tác vi ngi
dùng.
̇
Message queue ca ng dng (application queue)
: Ðc windows to
ra và cp cho các th hin ca ng dng. Windows t ụng ụiu phi
các message t system queue sang application queue mt cách phù
hp, nh ụó mi ng dng có th tip nhn và thc hin các u cu
x lý ca ngi dùng thơng qua h thng. C ch này ngn các ng
dng trong windows quyn truy cp trc tip các thit b phn cng
ca máy tính.

Q Vic truy cp message queue ca ng dng ục thc hin vi s h
tr ca các hàm liên quan do windows cung cp nh sau:
̇ Ch và ly mt message t message queue ca ng dng
:
BOOL
(
LPMSG
lpMsg
, // Con tr ụn bin MSG nhn thơng tin
HWND
hWnd
, // Handle ca ca s liên quan
UINT
wMsgFilterMin
, // S hiu message nh nht nhn ục
UINT
wMsgFilterMax
// S hiu message ln nht nhn ục

);
Hàm t ụng ch ụn khi phát hin có message cn x lý trong
message queue. Khi ụó, message vào trc nht s ục ly ra khi
hàng ch và thơng tin ca nó ục ụin vào bin kiu MSG ch bi
6 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
con tr tham s
plMSG
. Khi ụã ly ục mt message, hàm kt thúc
và tr v mt giá tr ngun. Nu message nhn ục là message kt
thúc ng dng (s hiu WM_QUIT) thì hàm tr v giá tr 0. Ngc li,
hàm tr v giá tr khác 0.

̇ Kim tra và ly mt message trong message queue ca ng dng
:
BOOL
(
LPMSG
lpMsg
; // . Nh
HWND
hWnd
;
UINT
wMsgFilterMin
;
UINT
wMsgFilterMax
;
UINT
wRemoveMsg
; // Có thc hin xóa message khơng ?
// PM_NOREMOVE: khơng xóa
);
Hàm tr v giá tr 0 nu message queue rng. Ngc li, hàm tr v
mt giá tr khác khơng và thơng tin v message ục ụin vào bin
kiu MSG ục ch bi tham s kiu con tr
lpMSG
.

̇ Din dch message ca bàn phím sang mã phím ASCII
:
BOOL
(
CONST MSG *
lpMsg
; // con tr ụn bin cha message
);
Tham s
lpMsg
là con tr ch ụn bin kiu MSG cha ni dung ục
t message ục ly t message queue và cn din dch.

Hàm tr v giá tr khác 0 nu message nhn ục tng ng vi mt
thao tác trên bàn phím (nhn phím: WM_KEYDOWN,
WM_SYSKEYDOWN; thơi nhn phím: WM_KEYUP,
WM_SYSKEYUP) hoc mt message có ý ngha tng ụng mà
vic din dch sang mã phím ASCII là thành cơng. Khi ụó hàm t ụng
to message WM_CHAR cho phím din dch ục. Trong các trng
hp khác, hàm tr v giá tr 0.
Một số khái niệm lập trình trong môi trường Windows 7
̇ Ðiu phi message ụn ca s giao din chính:
Ca s giao din chính ca ng dng có th tip nhn và x lý
message thơng qua hàm
ca nó (1.6). Nh vy, ta có
th ụiu phi message ly t message queue ca ng dng ụn cho
ca s chính x lý. Vic ụiu phi ục thc hin thơng qua hàm sau:
LRESULT
(
CONST MSG *
lpmsg
; // Con tr ụn bin cha message
);
Tham s
lpMSG
ch ụn bin kiu MSG cha thơng tin ục t
message ục ụiu phi. Hàm ụiu phi s ch ụn khi hàm x lý
message WindowProc ca ca s chính x lý xong messge, và ly
giá tr kt thúc ca hàm này làm giá tr tr v ca chính nó.

H Q trình tip nhn và ụiu phi x lý message t message queue
ca ng dng ục tin hành liên tc cho ụn khi nhn ục message
kt thúc ng dng (WM_QUIT). Q trình này có tên gi là vòng lp
nhn và ụiu phi message (MessageLoop). Ðon chng trình nhn
và ụiu phi message trong ng dng ục cài ụt nh sau:
MSG
; // bin cha ni dung ục t message nhn ục
while( GetMessage( &msg, NULL, 0, 0 ) != 0 ) {
// Nu message nhn ục khơng phi là WM_QUIT
TranslateMessage(&msg); // Din dch nu là phím
DispatchMessage(&msg); // Ðiu phi cho ca s chính.
}

1.8
     :
Khi ng dng ục thc hin, windows to thêm mt tin trình cho th
hin mi ca ng dng, ụng thi xây dng mt message queue dùng
riêng cho th hin này. Tiu trình chính ca tin trình ục to ra có
nhim v thc hin MessageLoop trên message queue dành cho ng
dng, ụng thi khi to các giao din và tiu trình h tr (nu cn).
Q Các cách x lý ca tiu trình chính khi nm quyn ụ
iu khin ng
dng:
̇ Khơng thc hin x lý nào c: ng dng kt thúc.
̇ Thc hin MessageLoop nhng khơng to ca s giao din chính:
ng dng ch nhn message nhng ngi dùng khơng giao tác ục.
̇ Khi to mt ca s vi hàm x lý message WindowProc và chn ca
s này làm ca s giao din chính: Hàm WindowProc ca ca s s
tip nhn và x lý message ục ụiu phi t MessageLoop ca tiu
trình chính. Ngi dùng có th giao tác và kt thúc ng dng ục.
̇ Nh mc th ba, ụng thi to ra các tiu trình phc v: ng dng có
kh nng tip nhn và thc hin ụng thi nhiu u cu x lý.

8 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
    




1.9
  
Ði vi mt chng trình trong windows, ngồi phn mã lnh ca các
hàm x lý, resource là mt thành phn khơng kém phn quan trng cha
các ni dung h tr cho vic trang trí hoc phc v cho mt mc ụích ục
bit ca ng dng. Các ni dung ph bin trong resource nh sau:
̇
nh nh ục t v trí làm vic ca thit b liên quan nh
mouse, pen, trackball. Khi ngi dùng tác ụng lên nhng thit b này
thì windows s dng cursor ụ phn ánh hin tng ụó.
̇
: Tp nh ụim (pixels) ca mt nh. Các nh ụim này b trí
theo các dòng và phi hp làm nên hình nh ca ụi tng.
̇
: Thơng tin mơ t khung giao din vi các ụi tng nhp liu
bên trong, là c s ụ to ra các hp hi thoi trong ng dng.
̇
: nh nh ục dùng ụ ục t chc nng ca mt ụi tng,
ng dng hay mt ni dung d liu.
̇
(Hypertext Markup Language): Ngơn ng dùng to ra nhng tài
liu dng vn bn vi nhng ký pháp và k thut ụnh dng mà trình
duyt tng ng có th th hin mt cách xúc tích.
Một số khái niệm lập trình trong môi trường Windows 9
̇ : Mt danh sách các la chn x lý mà ngi dùng có th chn
nhm thc hin mt x lý xác ụnh
̇
: Bng cha các chui ục ụánh du phân bit bi các
s hiu và ục s dng nh các thơng báo trong chng trình. Vic
s dng
String Table
giúp ng dng d dàng thay ụi ngơn ng giao
din ca nó mà khơng cn phi có s chnh sa trên phn mã lnh.
̇
: Tp các nh con xác ụnh các nút ục cài ụt trên
thanh cơng c ca ca s hay hp hi thoi trong ng dng. Mi nút
này là mt mc chn (có th thay th mc chn ca menu) giúp to ra
các message lnh (WM_COMMAND) vi s hiu phân bit ụ có th
n ụnh x lý cn thit.
̇
: Phn khai báo các thơng tin liên quan ụn ng dng, tác gi.
̇
: Cha thơng tin v b font ch ục lu trong tp tin .
̇
: Bao gm các ni dung khơng thuc các loi ni
dung resource chun nói trên. Ngi dùng có th tùy ý cài vào
resource ca ng dng, ụng thi phi t cài ụt x lý thích hp cho
các resource này trong chng trình.

10 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
:

  
   

2.1
 
:
Th vin MFC ca Microsoft bao gm các lp c bn, cài ụt bng
ngơn ng C++, h tr vic lp trình trong mơi trng windows. T các lp
này, MFC xác lp nn tng hình thành ng dng ca windows, bao gm
vic ụnh ngha b khung ng dng, các cơng c chun và ph bin ụ
b sung vào b khung nói trên nhm to ra ng dng hồn chnh. Vi
MFC, cơng vic ca ngi lp trình ch
 còn là vic la chn các thành
phn cn thit, ụiu chnh và phi hp chúng hp lý ụ có ục ng
dng kt qu mong mun.

Lp trình windows vi MFC và MicroSoft Visual C++ 6.0 (VC) ụt
ục hiu qu cao bi khơng ch khai thác ục phiên bn mi nht ca
MFC mà còn nhn ục nhiu tin nghi lp trình mà VC cung cp. Ðây là
con ụng ngn và ụn gin, ục bit vi ngi t hc, ụ vit ng dng
windows.

2.2
  :
MFC là th vin khng l vi khong 200 lp ụi tng mà vic hiu
rõ và vn dng chúng trong mt khong thi gian ngn là khơng th
ục. Mc tiêu ca chúng ta là hiu và vn dng nhng thành phn ph
bin nht ca th vin ụ xây dng ng dng thơng thng. Khi ụã có
kh nng nht ụnh v s dng MFC thì vi tài liu MSDN, s ch
ng khó
khn gì trong vic m rng khai thác th vin ụ ng dng tr nên mnh
m và tinh t hn.

Trong nhng phn trình bày sau, chúng ta s ln lt tip nhn h
thng ni dung hi nng tính lý thuyt ụ ụm bo cu trúc kin thc, và
phn thc hành phi hp s giúp chúng ta kim nghim và hiu rõ vn
ụ.

2.3 T
      :
Theo mơ hình kin trúc ng dng windows  mc (1.8), vic gii quyt
vn ụ trên chính là vic thc hin tr li các câu hi sau ụây:
̇ Làm th nào to ụi tng tiu trình chính ca ng dng ?
̇ Làm th nào to ụi tng giao din ca ng dng ?
̇ Qun lý tng tác gia ụi tng ng dng và ụi tng giao din ?
Bng vic xem xét các lp MFC liên quan s giúp ln lt lý gii các
câu hi ục ụt ra. Tip theo, chúng ta tìm hiu xem nhng lp nào
ca MFC giúp khai báo ụi tng tiu trình trong ng dng.
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 11

2.4 L
   :
CWinThread là mt lp ca MFC, lp ụi tng qun lý tiu trình ục
to ra trong tin trình ca mt ng dng ụang ục thc hin. Tiu trình
ục qun lý có th là là tiu trình giao din hoc tiu trình x lý ni. Các
dch v c bn phc v cho qun lý tiu trình do CWinThread cung cp
thơng qua các thuc tính và hành vi ca nó.
̇ DWORD

: Thuc tính lu s hiu ca tiu trình.
̇ CWnd*
: Lu con tr ụi tng ca s giao din
chính ca tiu trình. Khi ca s giao din chính chm dt hot
ụng, tiu trình liên quan s kt thúc. Nu tiu trình thuc loi tiu
trình x lý ni thì giá tr này k tha t tiu trình giao din cp cao
hn.
̇
( ); Hành vi to lp (constructor) ụi tng tiu trình.
̇ virtual BOOL
( ); Khi to thơng s cho ụi tng ti
u
trình và ụm nhn các x lý b sung khác ca ng dng. Ði vi
tiu trình giao din, hành vi này ục dùng ụ khi to ụi tng
ca s giao din và gán ụa ch ca ụi tng ca s cho
.
̇ virtual int
( ); Hành vi kt thúc ca ụi tng tiu trình.
Thơng qua hành vi này, ụi tng qun lý tiu trình thc hin hồn
tr các tài ngun ca h thng mà nó ụã ụng ký s dng.
̇ virtual int
( ); Hành vi dành riêng cho tiu trình giao din, nó
thc hin vòng lp nhn message, chuyn message cho hành vi
PreTranslateMessage ca lp. Nu hành vi này tr v giá tr 0 thì
message s tip tc ục chuyn ụn các hàm din dch phím
TranslateMessage và hàm ụiu phi message DispatchMessage.
̇ virtual BOOL
(MSG *
pMsg
); Hành vi cho
phép can thip trc trên các message nhn ục t message
queue ca ng dng. Thơng qua ụó, tiu trình giao din có th thc
hin các tin x lý message ục trng nhm ụáp ng u cu ụt
ra cho ng dng.

H
Khi CWinThread ục dùng ụ qun lý ụi tng tiu trình chính thì
hàm WinMain (cài sn bên trong lp bi th vin MFC) t ụng thc
hin các hành vi
InitInstance(), Run() và ExitInstance() theo th t.

12 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
2.5 L    :
CWinApp, k tha t CWinThread, là lp ụi tng chun dùng qun
lý tiu trình giao din chính ca ng dng. ng dng windows ch ục
phép s dng mt ụi tng thuc lp này. Ngồi các thuc tính, hành vi
k tha public t CWinThread, CWinApp có các thuc tính và hành vi b
sung sau:
̇ const char*
: Lu chui tên ca ng dng.
̇ LPTSTR

: Lu ni dung chui tham s dòng lnh.
Tham s dòng lnh là tồn b phn ni dung mà ngi dùng gõ
vào ngay sau chui ụng dn và tên chng trình ng dng khi
h thc hin ng dng. Ði vi ng dng có nhiu ch ụ hot
ụng khác nhau thì vic s dng tham s dòng lnh là mt c ch
xác lp các giao c gia ng dng và ngi dùng ụ chn ch
ụ
s dng ng dng thích hp.
̇ int
: Lu giá tr thơng s ụã ục dùng ụ kích hot
ca s giao din chính ca ng dng.
̇
( ); To lp ụi tng tiu trình chính.
̇ HCURSOR
( int
nID
); Np cursor t resource ca ng
dng vào b nh (nu cursor cha ục np).
nID
là s hiu ca
cursor. Hàm tr v giá tr handle qun lý cursor. Giá tr này có kiu
HCURSOR (handle of cursor) mà windows dùng ụ qun lý cursor.
̇ HICON
( int
nID
); Np icon t resource ca ng dng
vào b nh.
nID
là s hiu ca icon. Hàm tr v giá tr handle qun
lý icon. Giá tr này có kiu HICON (handle of icon).
̇ Hành vi hin th hp thơng báo và ch nhn ý kin ngi dùng:
virtual int
(
LPCTSTR
lpszPrompt
, // Ni dung thơng báo
UINT
nType
, // Dng hp thơng báo
UINT
hlpIndex = 0
// S hiu mc giúp ụ (WinHelp)
);
Hành vi này ục kích hot vi tham s tng ng mi khi trong
chng trình s dng hàm AfxMessageBox ụ hin th hp thơng
báo.
int
(
LPCTSTR
lpszPrompt
, UINT
nType
, UINT
hlpIndex = 0

);

nType
: n ụnh dng hp thơng báo. Giá tr này là s kt hp gia
thơng s qui ụnh biu tng hin th và các nút chn b trí trong
hp.

   
:
Giá tr thơng s Nút chn b trí trong hp
Thư viện MFC của Microsoft & ứng dụng cơ bả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


  n
:


Giá tr thơng s Biu tng
MB_ICONHAND, MB_ICONSTOP,
MB_ICONERROR

MB_ICONQUESTION

MB_ICONEXCLAMATION, MB_ICONWARNING

MB_ICONASTERISK, MB_ICONINFORMATION



S     
:

S hiu Nút chn S hiu Nút chn
IDABORT Abort IDOK OK
IDCANCEL Cancel IDRETRY Retry
IDIGNORE Ignore IDYES Yes
IDNO No

• Hành vi DoMessageBox ch ngi s dng tr li bng cách
chn mt nút chn xác ụnh trong hp thơng báo. Hành vi kt
thúc vi giá tr tr v là s hiu ca nút ục chn. K tha hành
vi này ụ chn và thc hin x lý ục trng (s dng dng hp
thơng báo riêng) cho tt c các li gi AfxMessageBox trong
ng dng.
• Hàm AfxMessageBox s dng DoMessageBox ụ hin th hp
thơng báo và ly giá tr ca hành vi này làm kt qu tr v ca
nó.

Ví d
: AfxMessageBox( "Chao Ban" MB_ICONSTOP | MB_OK, 0 );
H Hàm trên thc hin hin th hp thơng báo vi ni dung là
"Chao Ban" , biu tng
ụi kèm, và nút chn OK kt thúc.
14 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
2.6      N:
Trong phn này, chúng ta thc hin ng dng vi ụi tng thuc lp
CWinApp qun lý tiu trình chính. Ðt tên cho d án ca ng dng là
VD0.

Các bc thc hin d án VD0 nh sau:

̇ Khi ụng windows vi h ụiu hành Win95 hoc bn mi hn.
̇ To mi mt th mc ụ cha các d án. Ví d
.
̇ Thc hin ng dng Microsoft Visual C++ 6.0 (VC).
̇ Chn mc
/ t h thng menu ca VC.
̇ Trong hp hi thoi
, chn trang
Projects
:



-
: Loi ng dng thc hin.
-
: Ðng dn th mc ca d án.
-
: Tên d án.
Sau ụó chn
.

̇ Tip theo, trong hp hi thoi
.
-
: To d án rng.
-
: Hồn tt vic khi to d án.
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 15
̇ VC hin th hp hi thoi ụ thơng báo
các thơng tin liên quan ụn d án va to. Chn
.
H
Mt d án ụã ục to ra trên ụa. Vi thơng tin nhp nh trên,
d án mi to ra có tên là VD0, tồn b phn chng trình
ngun ca d án ục lu trong th mc VD0 thuc th mc
C:\VC6.


Tip tc thc hin các bc sau ụ hồn tt d án theo u cu.

̇ Ðng ký s dng lp CWinApp ca th vin MFC: Lp CWinApp
ục khai báo trong
ca MFC. B sung tp tin
vào d án và dùng tp tin này ụng ký các th vin cn thit ca
MFC.
Vic b sung tp tin
stdafx.h
vào d án ục tin hành nh sau:
• Chn mc
/ t h thng menu ca VC.
• Trong hp hi thoi
, chn trang :



-
: Loi ni dung tp tin (.h).
-
: B sung tp tin vào d án VD0.
-
: Tên tp tin ( )
Chn , tip tc thc hin các cơng vic sau.

• Son tho tp tin
, nhp các ụnh hng biên dch và
các ch th s dng th vin MFC cn cho d án:
16 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com

#if !defined( _DU_AN_0_ )
#define _DU_AN_0_

// _DU_AN_0_ giúp trình dch khơng thc hin lp ch th
#include


#include <afxwin.h> // th vin chun ca MFC
#endif
Sau khi nhp xong ni dung tp tin , chn mc /
(hoc click biu tung
trên thanh cơng c) ụ lu tp tin.
̇ To tp tin
ca d án: Tp tin này cha khai báo
ca các resource ục s dng trong ng dng. Khi biên dch, các
resource này s ục nhúng vào tp tin chng trình (.EXE). Các
bc to tp tin
trong d án nh sau:
• Chn mc
/ . Trong hp hi thoi , chn trang
.

-
: Loi ni dung tp tin (.rc).
-
: B sung tp tin vào d án.
- : Tên tp tin, trùng vi tên ca d án.
Sau ụó chn .
• Ðng ký các h tr ca MFC cho thao tác trên resource: Vic
ụng ký này là c s to quan h gia các ni dung ca
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 17
resource và ụi tng lp trình tng ng ca MFC trong d án.
Thc hin nh sau:
- Right-click trên mc tên resource (
):



- Chn mc
:


Chn các mc nh trên, gõ phím
ụ kt thúc.
• Son tho resource: D án
cha cn s dng resource, tp
tin resource script s tm thi b trng. Chn mc
/ ,
và ụóng màn hình son tho resource ụ kt thúc bc này.
̇ Chn phiên bn biên dch: Có hai phiên bn biên dch chng
trình.

: Biên dch chng trình vi thơng tin
debug.

: Phiên bn ụem giao, khơng cha thơng
tin debug.
Chn mc
/ :

Chn phiên bn biên dch ( chng hn
). Chn .

Không có nhận xét nào:

Đăng nhận xét