You are on page 1of 213

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

L P TRNH C TRN WINDOWS

Trang 1

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Chng 1 T NG QUAN L P TRNH C TRN WINDOWS


1.1. M U
l p trnh trn Microsoft Windows, chng ta c n n m c cc c i m c b n nh t c a h i u hnh ny. Chng ny s gi i thi u khi qut cc c i m h i u hnh Microsoft Windows, cc v n lin quan n l p trnh b ng ngn ng C, ng th i a ra m t chng trnh m u lm s n cho cc chng trnh c vi t sau ny. Trong ph n u, chng ta tm hi u s l c l ch s pht tri n c a h Windows v nh ng c i m n n t ng c a Windows. i u hnh Microsoft

Ph n ti p theo s trnh by nh ng khi ni m v yu c u cn b n c a vi c l p trnh C trn Windows. Ngoi ra, ph n ny cng gi i thi u cc c ch v cc cng c m h i u hnh cung c p cho ng i l p trnh hay ng i pht tri n cc ng d ng trn Windows. Cu i chng l ph n xy d ng m t chng trnh n gi n nh t trn Windows. Chng trnh ny c xem nh l khun m u c a m t chng trnh ng d ng i n hnh, v h u h t cc o n chng trnh c vi t minh h a trong sch u l y chng trnh ny lm khung s n pht tri n cho ph h p v i t ng yu c u. Thm vo , m t s ki u d li u m i c nh ngha trn Windows v nh ng qui c v cch t tn bi n cng c gi i thi u trong ph n ny. Ph n chi ti t v chuyn su hn c a vi c l p trnh b ng ngn ng C trn mi tr ng Windows s c trnh by trong cc chng ti p theo.

1.2. H

I U HNH MICROSOFT WINDOWS

1.2.1. Gi i thi u
Gi a th p nin 80, cng ty ph n m m my tnh Microsoft cng b phin b n u tin c a dng h i u hnh Windows l Microsoft Windows 1.0. y l h i u hnh dng giao di n h a khc v i giao di n k t (text hay console) c a MS-DOS. Tuy nhin ph i n phin b n th hai (Windows 2.0 - thng 11 nm 1987) th m i c b c c i ti n ng k , l s m r ng giao ti p gi a bn phm v thi t b chu t v giao di n h a (GUI-Graphic User Interface) nh trnh n (menu) v h p tho i (dialog). Trong phin b n ny Windows ch yu c u b vi x l Intel 8086 hay 8088 ch y real-mode truy xu t 1 megabyte b nh . Thng 5 nm 1990, Microsoft cng b phin b n ti p theo l Windows 3.0. S thay i l n trong phin b n ny l Windows 3.0 h tr protected-mode 16 bit c a cc b vi x l 286, Trang 2

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ 386, v 486 c a Intel. S thay i ny cho php cc ng d ng trn Windows truy xu t 16 megabyte b nh . Ti p b c v i s pht tri n l phin b n Windows 3.1 ra i nm 1992, Microsoft a cng ngh Font TrueType, m nh c (multimedia), lin k t v nhng i t ng (OLE- Object Linking and Embedding), v a ra cc h p tho i chung c chu n ha. Trong s pht tri n m nh m c a nh ng th p nin 90, Microsoft cng b ti p dng h i u hnh Windows v i ng d ng cng ngh m i (1993). H i u hnh ny l y tn l Windows NT (Windows New Technology), y l phin b n h i u hnh u tin c a Windows h tr 32 bit cho b x l 386, 486 v Pentium. Trong h i u hnh ny th cc ng d ng ph i truy xu t b nh v i a ch l 32-bit v cc t p l nh hay ch th 32-bit. Ngoi ra Windows NT cng c thi t k ch y cc b vi x l (CPU) khc ngoi Intel v c th ch y trn cc my tr m (workstation). H i u hnh Windows 95 c cng b nm 1995 cng l m t h i u hnh 32-bit cho Intel 386 tr v sau. Tuy thi u tnh b o m t nh Windows NT v vi c thch nghi v i my tr m cng ngh RISC, nhng b l i h i u hnh ny yu c u ph n c ng khng cao. Song song v i s pht tri n ph n m m th cng ngh ph n c ng cng pht tri n khng km. t n d ng s c m nh c a ph n c ng th cc th h Windows ti p theo ngy cng hon thi n hn. Nh Windows 98 pht tri n t Window 95 v c nhi u c i thi n nh hi u nng lm vi c, h tr cc thi t b ph n c ng t t hn, v cu i cng l vi c tch h p ch t ch v i Internet v Word Wide Web. Windows 2000 l h i u hnh c xem l n nh v t t c a dng Windows, phin b n ny tng c ng cc tnh nng b o m t thch h p trong m i tr ng m ng v giao di n p.

1.2.2.

c i m chung c a h

i u hnh Microsoft Windows

Windows l m t h i u hnh s d ng giao ti p ng i dng h a (GUI), hay cn g i l h i u hnh tr c quan (Visual interface). GUI s d ng h a d a trn mn hnh nh nh phn (Bitmapped video display). Do t n d ng c ti nguyn th c c a mn hnh, v cung c p m t mi tr ng giu tnh tr c quan v sinh ng. Windows khng n i u nh MS-DOS (hay m t s h i u hnh giao di n console) m mn hnh c s d ng ch th hi n chu i k t , do ng i dng g t bn phm (keyboard) hay xu t thng tin d ng vn b n. Trong giao di n ng i dng h a, mn hnh giao ti p v i ng i s d ng a d ng hn, ng i dng c th nh p d li u thng qua chu t b ng cch nh n vo cc nt nh n (button) cc hp ch n (combo box)thi t b by gi c nh p, c th l bn phm v thi t b chu t (mouse device). Thi t b chu t l m t thi t b nh v trn mn hnh, s d ng thi t b chu t ng i dng c th nh p d li u m t cch tr c quan b ng cch kch ho t m t nt l nh, hay lm vi c v i cc i t ng h a lin quan n t a trn mn hnh. giao ti p trong mi tr ng h a, Windows a ra m t s cc thnh ph n g i l cc i u khi n chung (common control), cc i u khi n chung l cc i t ng c a vo trong

Trang 3

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ h p tho i giao ti p v i ng i dng. Bao g m : h p vn b n (text box), nt nh n (button), nt ch n (check box), h p danh sch (list box), h p ch n (combo box) Th t ra m t ng d ng trn Windows khng ph i l qu ph c t p v chng c hnh th c chung. Chng trnh ng d ng thu ng chi m m t ph m vi hnh ch nh t trn mn hnh g i l m t c a s . Trn cng c a m i c a s l thanh tiu (title bar). Cc ch c nng c a chng trnh th c li t k trong th c n l a ch n c a chng trnh (menu) , hay xu t hi n d i d ng tr c quan hn l cc thanh cng c (toolbar). Cc thanh cng c ny ch a cc ch c nng c s d ng th ng xuyn trong th c n gi m th i gian cho ng i dng ph i m th c n v ch n. Thng th ng khi c n l y thng tin hay cung c p thng tin cho ng i dng th m t ng d ng s a ra m t h p tho i, trong h p tho i ny s ch a cc i u khi n chung giao ti p v i ng i dng. Windows cng ra t o m t s cc h p tho i chu n nh Open Files, v m t s h p tho i tng t nh nhau. Windows l m t h i u hnh a nhi m, ty thu c vo b nh m ta c th ch y nhi u ng d ng cng m t lc, v cng c th ng th i chuy n qua l i gi a cc ng d ng v th c thi chng. Trong cc phin b n c a Windows 98 v NT tr v sau, cc chng trnh ng d ng t b n thn chng chia thnh nhi u ti u trnh (thread) x l v v i t c x l nhanh t o c m gic nh ng chng trnh ng d ng ny ch y ng th i v i nhau. Trong Windows, chng trnh ng d ng khi th c thi c chia s nh ng th t c m Windows cung c p s n, cc t p tin cung c p nh ng th t c trn c g i l th vi n lin k t ng (Dynamic Link Libraries - DLL). Windows c c ch lin k t nh ng chng trnh ng d ng v i cc th t c c cung c p trong th vi n lin k t ng. Kh nng tng thch c a Windows cng r t cao. Cc chng trnh ng d ng c vi t cho Windows khng truy xu t tr c ti p ph n c ng c a nh ng thi t b ho nh mn hnh v my in. M thay vo , h i u hnh cung c p m t ngn ng l p trnh h a (g i l Giao ti p thi t b ho - Graphic Device Interface - GDI) cho php hi n th nh ng i t ng h a m t cch d dng. Nh v y m t ng d ng vi t cho Windows s ch y v i b t c thi t b mn hnh no hay b t k my in, mi n l ci t trnh i u khi n thi t b h tr cho Windows. Chng trnh ng d ng khng quan tm n ki u thi t b k t n i v i h th ng. Nh gi i thi u ph n trn khi ni m lin k t ng l thnh ph n quan tr ng c a Windows, n c xem nh l h t nhn c a h i u hnh, v b n thn c a Windows l cc t p th vi n lin k t ng. Windows cung c p r t nhi u hm cho nh ng chng trnh ng d ng ci t giao di n ng i dng v hi n th vn b n hay h a trn mn hnh. Nh ng hm ny c ci t trong th vi n lin k t ng hay cn g i l DLL. l cc t p tin c d ng ph n m r ng l *.DLL hay *.EXE, h u h t c ch a trong th m c \Windows\System, \Windows\system32 c a Windows 98 v cc th m c \WinNT\System, \WinNT\System32 c a Windows NT. Trong cc phin b n sau ny, h th ng lin k t ng c t o ra r t nhi u, tuy nhin, h u h t cc hm c g i trong th vi n ny phn thnh 3 n v sau: Kernel, User, v GDI.

Trang 4

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Kernel cung c p cc hm v th t c m m t h t nhn h i u hnh truy n th ng qu n l, nh qu n l b nh , xu t nh p t p tin v tc v . Th vi n ny c ci t trong t p tin KRNL386.EXE 16 bit v KERNEL32.DLL 32 bit. User qu n l giao di n ng i dng, ci t t t c khung c a s m c lu n l. Th vi n User c ci t trong t p tin USER.EXE 16 bit v USER32.DLL 32 bit. GDI cung c p ton b giao di n thi t b ho (Graphics Device Interface), cho php chng trnh ng d ng hi n th vn b n v ho trn cc thi t b xu t ph n c ng nh mn hnh v my in. Trong Windows 98, th vi n lin k t ng ch a kho ng vi ngn hm, m i hm c tn c t , v d CreateWindow, hm ny dng t o m t c a s cho ng d ng. Khi s d ng cc hm m Windows cung c p cho th cc ng d ng ph i khai bo trong cc t p tin tiu .h hay .hpp (header file). Trong m t chng trnh Windows, c s khc bi t khi ta g i m t hm c a th vi n C v m t hm c a Windows hay th vi n lin k t ng cung c p. l khi bin d ch m my, cc hm th vi n C s c lin k t thnh m chng trnh. Trong khi cc hm Windows s c g i khi chng trnh c n dng n ch khng lin k t vo chng trnh. th c hi n c cc l i g i ny th m t chng trnh Windows *.EXE lun ch a m t tham chi u n th vi n lin k t ng khc m n c n dng. Khi , m t chng trnh Windows c n p vo b nh s t o con tr tham chi u n nh ng hm th vi n DLL m chng trnh dng, n u th vi n ny cha c n p vo b nh tr c th by gi s c n p.

1.3. L P TRNH TRN MICROSOFT WINDOWS 1.3.1. c i m chung

Windows l h i u hnh h a tr c quan, do d cc ti nguyn c a h th ng cung c p r t a d ng i h i ng i l p trnh ph i nghin c u r t nhi u pht hay h t s c m nh c a h i u hnh. Theo nh nh ng m c ch ti p c n c a cc nh l p trnh th cc ng d ng trn Windows ph i h t s c thn thi n v i ng i dng thng qua giao di n h a s n c c a Windows. V l thuy t th m t ng i dng lm vi c c v i m t ng d ng c a Windows th c th lm vi c c v i nh ng ng d ng khc. Nhng trong th c t s d ng m t ng d ng cho t hi u qu cao trong Windows th c n ph i c m t s hu n luy n tr gip hay t i thi u th ph i cho bi t chng trnh ng d ng lm vi c nh th no. a s cc ng d ng trong Windows u c chung m t giao di n tng tc v i ng i dng gi ng nhau. V d nh cc ng d ng trong Windows a s u c thanh th c n ch a cc m c nh : File, Edit, Tool, Help V trong h p tho i th th ng ch a cc ph n t i u khi n chung nh : Edit Control, Button Control, Checkbox.

Trang 5

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

1.3.2. S khc bi t v i l p trnh trn MS-DOS


Khi m i b c vo l p trnh trn Windows a s ng i h c r t l l m, nh t l nh ng ng i t ng lm vi c v i MS-DOS. Do MS-DOS l h i u hnh n nhi m v giao ti p qua giao di n console. Nn khi vi t chng trnh khng ph c t p. Cn i v i Windows ng i l p trnh s lm vi c v i b cng c l p trnh h a a d ng cng v i cch x l a nhi m, a lu ng c a Windows. V v y vi c l p trnh trn Windows s gip cho ng i l p trnh nhm chn v i giao di n console c a MS-DOS. Vi c c g ng pht huy cc s c m nh ti nguyn c a Windows s lm cho nh ng ng d ng cng m nh m , a d ng, thn thi n, v d s d ng.

1.3.3. M t s yu c u

i v i ng i l p trnh

i u tr c tin c a ng i h c l p trnh C trn Windows l ph i bi t l p trnh C, sch ny khng c tham v ng h ng d n ng i h c c th thng th o l p trnh C trn Windows m cha qua m t l p hu n luy n C no. Tuy nhin, khng nh t thi t ph i hon ton thng th o C m i h c c l p trnh Windows. c th l p trnh trn n n Windows ngoi yu c u v vi c s d ng cng c l p trnh, ng i h c cn c n ph i c cn b n v Windows, t i thi u th cng dng qua m t s ng d ng trong Windows. Th t s yu c u ny khng qu kh khn i v i ng i h c v hi n t i h u nh Windows qu quen thu c v i m i ng i, nh ng ng i m s d ng my tnh. Ngoi nh ng yu c u trn, i khi ng i l p trnh trn Windows cng c n c khi u th m m , v cch trnh by cc hnh nh, cc i u khi n trn cc h p tho i t t th s lm cho ng d ng cng ti n l i, r rng, v thn thi n v i ng i dng.

1.3.4. B cng c giao di n l p trnh ng d ng API


H i u hnh Windows cung c p hng trm hm cho nh ng ng d ng c th s d ng truy c p cc ti nguyn trong h th ng. Nh ng hm ny c g i l giao di n l p trnh ng d ng API (Application Programming Interface). Nh ng hm trn c ch a trong cc th vi n lin k t ng DLL c a h th ng. Nh c c u trc ng ny m i ng d ng u c th truy c p n cc hm . Khi bin d ch chng trnh, n o n m g i hm API th chng trnh d ch khng thm m hm ny vo m th c thi m ch thm tn DLL ch a hm v tn c a chnh hm . Do m cc hm API th c t khng c s d ng khi xy d ng chng trnh, v n ch c thm vo khi chng trnh c n p vo b nh th c thi. Trong API c m t s hm c ch c nng duy tr s c l p thi t b h a, v cc hm ny g i l giao di n thi t b h a GDI (Graphics Device Interface). Do s c l p thi t b nn cc hm GDI cho php cc ng d ng c th lm vi c t t v i nhi u ki u thi t b h a khc nhau.

1.3.5. C ch thng i p
Trang 6

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Khng gi ng nh cc ng d ng ch y trn MS-DOS, cc ng d ng Win32 th x l theo cc s ki n (event - driven), theo c ch ny cc ng d ng khi c vi t s lin t c ch cho h i u hnh truy n cc d li u nh p vo. H th ng s m nhi m vi c truy n t t c cc d li u nh p c a ng d ng vo cc c a s khc nhau c a ng d ng . M i m t c a s s c ring m t hm g i l hm x l c a s th ng c t tn l WndProc, h th ng s g i hm ny khi c b t c d li u nh p no c truy n n c a s , hm ny s x l cc d li u nh p v tr quy n i u khi n v cho h th ng. H th ng truy n cc d li u nh p vo th t c x l c a c a s thng qua m t hnh th c g i l thng i p (message). Thng i p ny c pht sinh t ng d ng v h th ng. H th ng s pht sinh m t thng i p khi c m t s ki n nh p vo (input even), v d nh khi ng i dng nh n m t phm, di chuy n thi t b chu t, hay kch vo cc i u khi n (control) nh thanh cu n, Ngoi ra h th ng cng pht sinh ra thng i p ph n ng l i m t s thay i c a h th ng do m t ng d ng mang n, i u ny x y ra khi ng d ng lm c n ki t ti nguyn hay ng d ng t thay i kch th c c a c a s . M t ng d ng c th pht sinh ra thng i p khi c n yu c u cc c a s c a n th c hi n m t nhi m v no hay dng thng tin gi a cc c a s . H th ng g i thng i p vo th t c x l c a s v i b n tham s : nh danh c a c a s , nh danh c a thng i p, v hai tham s cn l i c g i l tham s c a thng i p (message parameters). nh danh c a c a s xc nh c a s m thng i p c ch nh. H th ng s dng nh danh ny xc nh c n ph i g i thng i p n th t c x l c a c a s . nh danh thng i p l m t h ng s th hi n m c ch c a thng i p. Khi th t c x l c a s nh n thng i p th n s dng nh danh ny bi t hnh th c c n th c hi n. V d , khi m t thng i p c truy n n th t c c a s c nh danh l WM_PAINT th c ngha r ng c a s vng lm vi c thay i v c n ph i v l i vng ny. Tham s thng i p lu gi tr hay v tr c a d li u, c dng b i th t c c a s khi x l thng i p. Tham s ny ph thu c vo lo i thng i p c truy n n, n c th l s nguyn, m t t p cc bit dng lm c hi u, hay m t con tr n m t c u trc d li u no , Khi m t thng i p khng c n dng n tham s th h th ng s thi t l p cc tham s ny c gi tr NULL. M t th t c c a s ph i ki m tra xem v i lo i thng i p no c n dng tham s quy t nh cch s d ng cc tham s ny. C hai lo i thng i p : Thng i p c nh ngha b i h th ng (system-defined messages) :

D ng thng i p ny c h th ng nh ngha cho cc c a s , cc i u khi n, v cc ti nguyn khc trong h th ng. Th ng c b t u v i cc ti n t sau : WM_xxx, LB_xxx, CB_xxx,

Trang 7

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Thng i p c nh ngha b i ng d ng (application-defined message) : M t ng d ng c th t o ring cc thng i p truy n thng tin gi a cc c a s trong ng d ng. s d ng b i nh ng c a s c a n hay

N u m t ng d ng nh ngha cc thng i p ring th th t c c a s nh n c thng i p ny ph i cung c p cc hm x l tng ng. i v i thng i p h th ng, th c cung c p gi tr nh danh t 0x0000 nh ng ng d ng khng c nh ngha thng i p c gi tr trong kho ng ny. Thng i p c ng d ng nh ngha c gi tr nh danh t 0x0400 n 0x03FF,

n 0x7FFF.

L trnh c a thng i p t lc g i i

n lc x l c hai d ng sau:

Thng i p c g i vo hng i thng i p ch x l (queue message): bao g m cc ki u thng i p c pht sinh t bn phm, chu t nh thng i p : WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, v WM_CHAR. Thng i p c g i tr c ti p n th t c x l khng qua hng i (nonqueue message), bao g m cc thng i p th i gian, thng i p v , v thng i p thot nh WM_TIMER, WM_PAINT, v WM_QUIT. X l thng i p : M t ng d ng ph i xa v x l nh ng thng i p c g i t i hng i c a ng d ng . i v i m t ng d ng n ti u trnh th s d ng m t vng l p thng i p (message loop) trong hm WinMain nh n thng i p t hng i v g i t i th t c x l c a s tng ng. V i nh ng ng d ng nhi u ti u trnh th m i m t ti u trnh c t o c a s th s c m t vng l p thng i p x l thng i p c a nh ng c a s trong ti u trnh .

1.4. CCH VI T M T

NG D NG TRN MICROSOFT WINDOWS

1.4.1. Cc thnh ph n c b n t o nn m t ng d ng
1.4.1.1. C a s Trong m t ng d ng h a 32-bit, c a s (window) l m t vng hnh ch nh t trn mn hnh, ni m ng d ng c th hi n th thng tin ra v nh n thng tin vo t ng i s d ng. Do u tin c a m t ng d ng h a 32-bit l t o m t c a s . v y, nhi m v M t c a s s chia s mn hnh v i cc c a s khc trong cng m t ng d ng hay cc ng d ng khc. Ch m t c a s trong m t th i i m nh n c thng tin nh p t ng i dng. Ng i s d ng c th dng bn phm, thi t b chu t hay cc thi t b nh p li u khc tng tc v i c a s v ng d ng.

Trang 8

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ T t c cc c a s u c t o t m t c u trc c cung c p s n g i l l p c a s (window class). C u trc ny l m t t p m t cc thu c tnh m h th ng dng nh khun m u t o nn cc c a s . M i m t c a s ph i l thnh vin c a m t l p c a s . T t c cc l p c a s ny u c x l ring bi t. 1.4.1.2. H p tho i v cc i u khi n H p tho i (Dialog) dng tng tc v i ng i dng trong m t chng trnh ng d ng. M t h p tho i th ng ch a nhi u cc u khi n nh nh p vn b n (edit text), nt b m (button), ghi ch (static control), h p danh sch (list box) Nt b m (button): g m c Push Button dng kch ho t m t thao tc, Check Box dng ch n m t trong hai tr ng thi (TRUE hay FALSE), Radio Button cng gi ng nh Check Box nhng m t nhm cc Radio Button ph i c ch n lo i tr nhau. Ch thch (static): dng ch a cc ghi ch trong h p tho i, ngoi ra n i dung c th thay i trong qu trnh s d ng h p tho i. H p li t k (list box): Ch n m t hay nhi u d li u c li t k trong danh sch, n u h p ch a nhi u dng v h p khng hi n th h t cc m u thng tin th ph i km theo m t thanh cu n (scroll bar). nh p vn b n (edit text): Dng nh p vn b n, n u c nhi u dng th th ng km theo thanh cu n. Thanh cu n (scroll bar): ngoi vi c dng km v i list box hay edit box th thanh cu n cn c th s d ng c l p nh m t o cc th c o Th c n (menu): l m t danh sch ch a cc thao tc v i m t nh danh m ng i dng c th ch n. H u h t cc ng d ng c c a s th khng th thi u th c n. Thanh cng c (toolbar): y l m t d ng menu nhng ch ch a cc thao tc c n thi t d i d ng cc bi u t ng c trng. Ngoi ra cn r t nhi u cc i u khi n m cc cng c l p trnh cung c p cho ng i l p trnh hay t h t o ra d a trn nh ng thnh ph n c cung c p s n. 1.4.1.3. ng d ng i n hnh trn Windows xy d ng m t ng d ng trn Windows

1.4.1.4. Cc ki u t p tin Chng trnh ngu n

Tng t nh cc chng trnh C chu n, bao g m cc t p tin tiu (header) ch a trong t p tin *.h, *.hpp. Cn m ngu n (source code) ch a trong t p tin *.c hay *.cpp. T p tin nh ngha

T p tin ny c ph n m r ng l *.def, dng nh ngha cc i u khi n do chng trnh t o ra khi vi t ng d ng t o DLL, ngoi ra cn dng khai bo vng nh heap khi ch y chng

Trang 9

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ trnh. Lc tr c do v n tng thch v i Windows 3.1 nn t p tin ny th ng c dng, cn ngy nay chng t c dng n. Cc file ch a ti nguyn c a ng d ng Cc file *.ico l cc bi u t ng (icon) c dng trong chng trnh. Thng th ng cc cng c l p trnh trn Windows u c cc tool t o cc nh ny. Con tr chu t c a ng d ng c th c v l i d i d ng cc bi u t ng v lu trn a v i d ng file *.cur. Cc file d ng nh bitmap dng minh h a c lu d ng file *.bmp. T p tin ti nguyn *.rc l ph n khai bo cc ti nguyn nh th c n, h p tho i, v cc nh danh ch n cc t p tin d ng *.ico, *.cur, *.bmp,... 1.4.1.5. Cc ki u d li u m i Cc ki u d li u trn Windows th ng c nh ngha nh ton t typedef trong t p tin windows.h hay cc t p tin khc. Thng th ng cc t p tin nh ngha ny do Microsoft vi t ra ho c cc cng ty vi t trnh bin d ch C t o ra, nh t thi t n ph i tng thch v i h i u hnh Windows 98, hay NT d a trn ki n trc 32-bit. M t vi ki u d li u m i c tn vi t t t r t d hi u nh UINT l m t d li u th ng c dng m n gi n l ki u unsigned int, trong Windows 9x ki u ny c kch th c l 32-bit. i v i ki u chu i th c ki u PSTR ki u ny l m t con tr n m t chu i tng t nh char*. Tuy nhin, cng c m t s ki u c khi bo tn thi u r rng nh WPARAM v LPARAM. Tn ny c t v c ngu n ng c l ch s su xa. Khi cn h i u hnh Windows 16-bit th tham s th 3 c a hm WndProc c khai bo l ki u WORD, v i kch th c 16-bit , cn tham s th 4 c ki u LONG l 32-bit. y l l do ng i ta thm ti n t "W", "L" vo t "PARAM". Tuy nhin, trong phin b n Windows 32-bit, th WPARAM c nh ngha nh l UINT v LPARAM th c nh ngha nh m t ki u LONG, do c hai tham s ny u c gi tr l 32-bit. i u ny l m t s nh m l n v WORD v n l gi tr 16-bit trong Window 98. c Trong th t c x l c a s WndProc gi tr tr v l ki u LRESULT. Ki u ny n gi n nh ngha nh l ki u LONG.

Ngoi ra, c m t ki u th ng xuyn dng l ki u HANDLE l m t s nguyn 32-bit c s d ng nh m t ki u nh danh. C nhi u ki u nh danh nhng nh t thi t t t c ph i c cng kch th c v i HANDLE. B ng sau m t m t s ki u d li u m i: Ki u HANDLE ngha S nguyn 32-bit, Trang 10 nh danh.

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam nh danh.

____________________________________________________________________________________ HWND BYTE WORD DWORD UINT LONG BOOL LPSTR LPCSTR WPARAM LPARAM BSTR LPVOID LPTSTR LPCTSTR S nguyn 32-bit,

Gi tr 8-bit khng d u. S nguyn 16-bit khng d u. S nguyn 32-bit khng d u. S nguyn khng d u 32-bit. long 32-bit. Bool. Con tr chu i. H ng con tr chu i. 32-bit. 32-bit. Gi tr 32-bit tr Con tr 32-bit n k t . n m t ki u khng xc nh.

Gi ng nh LPSTR nhng c th chuy n sang d ng Unicode v DBCS. Gi ng nh LPCTSTR nhng c th chuy n sang d ng Unicode v DBCS.
B ng 1.1 M t cc ki u d li u m i

1.4.2. Khun m u chung t o m t ng d ng


M t ng d ng n gi n nh t c a Windows bao g m c hai hm l WinMain v x l c a s WinProc. Do hai hm ny l quan tr ng v khng th thi u trong cc ng d ng Windows. Hm WinMain th c hi n cc ch c nng sau : nh ngha l p c a s ng d ng. ng k l p c a s v a nh ngha. T o ra th hi n c a s c a l p cho. Hi n th c a s . Trang 11

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Kh i ng chu trnh x l thng i p. Hm x l WinProc c ch c nng x l t t c cc thng i p c lin quan nc as .

1.4.3. Hm WinMain
Hm chnh c a m t ng d ng ch y trn Windows l hm WinMain, c khai bo nh sau: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow); Chng ta s tm hi u m t hm WinMain m u sau y. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); // tn ng d ng HWND hwnd; MSG msg; WNDCLASS wndclass; // bi n /* nh ngha ki u c a s */ nh ngha m t c a s

wndclass.style = SC_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; // Hm th t c c a s wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; // nh danh ng d ng

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCusor (NULL, IDC_ARROW); Trang 12

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; // Khng c menu wndclass.lpszClassName = szAppName; // tn ng d ng /* ng k l p c a s */ if (!RegisterClass(&wndclass)) return 0; /* T o l p c a s */ hwnd = CreateWindow (szAppName, // Tn c a s "Hello Program", // Tiu WS_OVERLAPPEDWINDOW, // Ki u c a s CW_USEDEFAULT, // T a CW_USEDEFAULT, // T a x y

CW_USEDEFAULT, // Chi u r ng CW_USEDEFAULT, // Chi u di NULL, // C a s cha NULL, // Khng c menu hInstacne, // nh danh ng d ng

NULL); // Tham s b sung /* Hi n th c a s */ ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); /* Chu trnh x l cc thng i p*/ while (GetMessage (&msg, NULL, 0, 0)) { Trang 13

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } nh ngha m t l p c a s : u tin c a vic xy d ng m t ng d ng Windows l ph i nh ngha m t l p c a s cho ng d ng. Windows cung c p m t c u trc WNDCLASS g i l l p c a s , l p ny ch a nh ng thu c tnh t o thnh m t c a s . typedef struct _WNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASS, *PWNDCLASS; ngha thu c tnh c a c u trc WNDCLASS c m t trong b ng sau : Thu c tnh ngha ghi ch

Trang 14

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam K t h p nhi u ki u gi tr khc nhau b ng ton t OR.

____________________________________________________________________________________ style lpfnWndProc cbClsExtra cbWndExtra hInstance hIcon hCursor hbrBackground lpszMenuName Con tr Ki u l p n th t c window M c M c nh nh

S byte c c p pht thm sau c u trc window-class S byte c c p pht thm sau m t instance c a window nh danh ch a th t c c a s c a l p window nh danh c a bi u t ng nh danh c a con tr chu t nh danh c a ch i t n n Tn th c n

Dng hm LoadIcon Dng hm LoadCursor Dng hm GetStockObject Tn th c n g n v i c a s , th c dn ny c khai bo trong t p tin ti nguyn.

lpszClassName

Tn l p
B ng 1.2 M t thu c tnh c a l p c a s

ng k l p c a s : Sau khi nh ngha m t l p c a s , ph i ng k l p c a s b ng hm RegisterClass :

ATOM RegisterClass( CONST WNDCLASS * lpWndClass ); T oc as : L pc as nh ngha nh ng c tnh chung c a c a s , cho php t o ra nhi u c a s d a trn m t l p. Khi t o ra m t c a s c a hm CreateWindow, ta ch nh cc c tnh ring c a c a s ny, v phn bi t n v i cc c a s khc t o ra cng m t l p. Khai bo hm t o c a s : HWND CreateWindow( LPCSTR lpClassName, // Tn l p c a s ng k

Trang 15

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ LPCSTR lpwindowName, // Tn c a c a s DWORD dwStyle, // Ki u c a c a s int x, // V tr ngang ban int y, // V tr d c ban int nWidth, // int nHeight, // u u u nh danh c a c a s cha u

r ng ban cao ban

HWND hWndParent, // MENU hMenu, //

nh dang c a th c n nh danh th hi n ng d ng u

INSTANCE hInstance, //

PVOID lpParam // Cc tham s ban ); Hi n th c a s :

Sau khi g i hm CreateWindow, m t c a s c t o ra bn trong Windows, i u ny c ngha l Windows cp pht m t vng nh lu gi t t c cc thng tin v c a s c ch nh trong hm CreateWindow. Nh ng thng s ny s c Windows tm l i khi c n thi t d a vo nh danh m hm t o c a s tr v . Tuy nhin, lc ny c a s cha xu t hi n trn mn hnh Windows, xu t hi n c n ph i g i hm ShowWindow. Hm ShowWindow c khai bo nh sau: BOOL ShowWindow( HWND hWnd, // nh danh c a c a s c n th hi n

int nCmdShow // Tr ng thi hi n th ); M t s tr ng thi c a tham s nCmdShow: SW_HIDE : n c a s . SW_MAXIMIZE : Phng c a s ra ton b mn hnh. SW_MINIMIZE : thu nh thnh bi u t ng trn mn hnh. Trang 16

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ SW_RESTORE : Hi n th d i d ng chu n.

1.4.4. Hm x l c a s WndProc
M t chng trnh Windows c th ch a nhi u hn m t hm x l c a s . M t hm x l c a s lun k t h p v i m t l p c a s c th. Hm x l c a s th ng c t tn WndProc. Hm WndProc c ch c nng giao ti p v i bn ngoi, t c l v i Windows, ton b cc thng i p g i n c a s i u c x l qua hm ny. Hm ny th ng c khai bo nh sau : LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); u tin l nh danh c a c a s , tham s th 2 l nh danh thng Trong tham s i p, v cu i cng l 2 tham s WPARAM v LPARAM b sung thng tin km theo thng i p. Chng ta s tm hi u m t hm x l c a s WndProc sau:

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; /*X l cc thng i p c n thi t v i ng d ng*/ switch (msg) { case WM_CREATE: /*Vi t o n m khi t o c a s */ return 0;

Trang 17

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
case WM_PAINT: /*Vi t o n m khi t v l i c a s */ hdc = BeginPaint ( hwnd, &ps); GetClientRect (hwnd, &rect); DrawText(hdc, "Hello", -1, &rect, DT_SINGLELINE| DT_CENTER| DT_VCENTER); EndPaint ( hwnd, &ps); return 0; case WM_SIZE: /*Vi t o n m khi kch th c c a s thay return 0; case WM_DESTROY: /*C a s b ng*/ i*/

PostQuitMessage (0); return 0; } return DefWindowProc ( hwnd, msg, wParam, lParam); }

Thng th ng chng ta ch ch n x l cc thng i p c n thi t c lin quan n ch c nng c a ng d ng. Cc thng i p khc th giao cho hm x l m c nh lm vi c (hm DefWindowProc).

1.4.5. X l thng i p
Sau khi c a s c hi n th trn mn hnh, th chng trnh ph i c cc thng tin nh p c a ng i dng t bn phm hay thi t b chu t. Windows s duy tr m t hng i thng i p cho m i chng trnh ch y trn n. Khi m t s ki n nh p thng tin xu t hi n, Windows s d ch s ki n ny thnh d ng thng i p v a n vo hng i thng i p c a ng d ng tng ng. Trang 18

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ M t ng d ng nh n cc thng i p t hng i thng i p b ng cch th c thi m t o n m sau:


while ( GetMessage(&msg, NULL, 0 ,0) ) { TranslateMessage (&msg); DispatchMessage (&msg); }

Trong msg l m t bi n c u trc ki u MSG c WINUSER.H. typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG; Ki u d li u POINT l m t ki u c u trc khc, c WINDEF.H, v c m t : typedef struct tagPOINT { LONG x; LONG y;

nh ngha trong t p tin tiu

nh ngha trong t p tin tiu

Trang 19

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ } POINT, *PPOINT; ngha c a cc tr ng trong c u trc MSG hwnd : nh danh c a c a s m thng i p pht sinh. message : nh danh c a thng i p, v d nh thng i p pht sinh khi b m nt chu t tri l WM_LBUTTONDOWN c gi tr 0x0201. wParam : Tham s 32-bit ch a cc thng tin ph thu c vo t ng thng i p c th . lParam : Tham s 32-bit ph thu c vo thng i p. time : Th i gian t thng i p trong hng i. pt : T a c a chu t khi t thng i p vo hng i Hm GetMessage s tr v 0 n u msg ch a thng i p c nh danh WM_QUIT (0x0012), khi vng l p thng i p ngng v ng d ng k t thc. Ng c l i th hm s tr v m t gi tr khc 0 v i cc thng i p khc.

1.4.6. Xy d ng m t ng d ng

u tin

M t ng d ng th ng c giao di n n n t ng l m t khung c a s , t o c c a s ny c a s tng chng ta th c hi n b ng cch khai bo m t l p c a s v ng k l p c a s . tc c th chng ta ph i vi t hm x l c a s WndProc khi t t c cc thng i p lin quan n c a s s c truy n vo cho hm ny. o n chng trnh sau l khung s n cho cc chng trnh vi t trn Windows, bao g m 2 hm chnh l : WinMain : hm chnh c a chng trnh th c hi n cc ch c nng : Khai bo l p c a s . ng k l p c a s v a khai bo. T o v hi n th l p c a s trn. Vng l p nh n thng i p. nc as .

WndProc : Hm x l thng i p g i
/* HELLOWORLD.C */

#include <windows.h> LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) {

Trang 20

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
static TCHAR szAppName [] = TEXT ("HelloWorld"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon ( NULL, IDI_APPLICATION ); wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ); wndclass.hbrBackground = ( HBRUSH ) GetStockObject ( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if ( !RegisterClass ( &wndclass ) ) { MessageBox(NULL, TEXT (" The program requires Windows"), szAppName, MB_ICONERROR ); return 0; } hwnd = CreateWindow ( szAppName, // Tn l p c a s TEXT (" The Hello World Program"), // Tiu WS_OVERLAPPEDWINDOW, // Ki u c a s c as

Trang 21

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam


x y

____________________________________________________________________________________
CW_USEDEFAULT, // T a CW_USEDEFAULT, // T a

CW_USEDEFAULT, // Chi u ngang CW_USEDEFAULT, // Chi u d c NULL, // C a s cha NULL, // Th c n hInstance, // nh danh

NULL ); // Tham s ShowWindow ( hwnd, iCmdShow ); UpdateWindow ( hwnd ); while ( GetMessage ( &msg, NULL, 0, 0) ) { TranslateMessage (&msg); DispatchMessage (&msg) ; } return msg.wParam; } // End WinMain LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch ( msg )

Trang 22

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
{ case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint ( hwnd, &ps); GetClientRect ( hwnd, &rect ); DrawText( hdc, TEXT("Hello World"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER ); EndPaint ( hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } // End switch return DefWindowProc ( hwnd, msg, wParam, lParam); }

B ng d i y li t k ngha c a cc hm c s d ng trong 2 hm WinMain v WndProc c a chng trnh HELLOWORLD.C. Tn hm LoadIcon trnh. LoadCursor GetStockObject RegisterClass Nap m t con tr chu t cho chng trnh. Nh n m t i t ng h a, trong tr ng h p c a chng trnh th l y m t ch i t t l i n n c a c a s . ng k m t l p c a s cho c a s Trang 23 ng d ng trong ngha N p m t bi u t ng s d ng trong chng

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ chng trnh. MessageBox CreateWindow ShowWindow UpdateWindow GetMesssage TranslateMessage DispatchMessage BeginPaint GetClientRect DrawText EndPaint PostQuitMessage DefWindowProc Hi n th m t thng i p. T o m t c a s d a trn m t l p c a s . Hi n th c a s ln mn hnh. Yu c u c a s v l i chnh b n thn n. Nh n m t thng i p t hng D ch thng i p bn phm. G i thng i p n hm x l c a s . i thng i p.

Kh i t o ch c nng v c a c a s . L y hnh ch nh t lu vng lm vi c. Hi n th m t chu i vn b n. K t thc vi c v c a s . a thng i p thot vo hng Th c hi n vi c x l m c i thng i p.

nh cc thng i p.

B ng 1.3 M t cc hm c s d ng trong chng trnh minh h a

1.4.7. M t s qui c

t tn bi n

Khi vi t m t chng trnh ng d ng l n v i nhi u ki u khai bo bi n khc nhau, n u vi c khai bo cc tn bi n khng thch h p s lm cho chng trnh ph c t p thm, i khi lm kh ngay c ng i vi t ra cc m ngu n . V v y cc l p trnh vin th ng qui c sao cho m t tn bi n v a g i c ch c nng c a n v a xc nh c ki u lo i. C r t nhi u phong cch t tn, trong s th c phong cch t tn theo c php Hungary (Hungarian Notation) l c dng nhi u nh t. Qui c r t n gi n l b t u tn bi n th vi t ch th ng v cc ch u th hi n ki u d li u c a bi n, v c g i l cc ti n t . V d nh bi n szCmdLine l m t bi n lu chu i nh p t dng l nh, sz l th hi n cho bi n ki u chu i k t thc k t 0, ngoi ra ta hay th y hInstance v hPrevInstance, trong h vi t t t cho ki u handle, ki u d li u nguyn th ng c khai bo d ng ti n t l ch i. C php Hungary ny gip cho ng i l p trnh r t nhi u trong khu ki m tra l i c a chng trnh, v khi nhn vo hai bi n ta c th d dng nh n bi t c s khng tng thch gi a hai ki u d li u th hi n trong tn c a hai bi n. Trang 24

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ B ng m t m t s ti n t khi t tn bi n c a cc ki u d li u : Ti n t c by n i x,y b w l dw s sz h p Lpsz Ki u d li u char, WCHAR, TCHAR BYTE short int bi n lu t a BOOL WORD long DWORD string chu i k t thc b i k t 0 handle pointer con tr di chu i k t k t thc k t 0
B ng 1.4 M t ki u t tn bi n

x, y

Trang 25

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Chng 2 H P THO I V THANH TRNH N


2.1. M U
H p tho i (dialog) v thanh trnh n (menu) l cc thnh ph n khng th thi u trong vi c t ch c giao ti p gi a ng i s d ng v chng trnh. H p tho i c xem nh l m t lo i c as c bi t, l cng c m m d o, linh ho t a thng tin vo chng trnh m t cch d dng. Trong khi menu l cng c gip ng i dng th c hi n cc thao tc n gi n hn, thng qua cc nhm ch c nng th ng s d ng.

2.2. H P THO I
H p tho i ph i h p gi a ng i s d ng v i chng trnh b ng m t s ph n t i u khi n m cc ph n t ny nh n nhi m v thu nh n thng tin t ng i dng v cung c p thng tin n ng i dng khi ng i dng tc ng n cc ph n t i u khi n. Cc ph n t i u khi n ny nh n c a s cha l m t h p tho i. Cc ph n t i u khi n th ng l cc Button, List Box, Combo Box, Check Box, Radio Button, Edit Box, Scroll Bar, Static. Tng t nh cc thng i p g i n th t c WndProc c a c a s chnh.Windows s g i cc thng i p x l h p tho i n th t c x l h p tho i DlgProc. Hai th t c WndProc v th t c DlgProc tuy cch lm vi c gi ng nhau nhng gi a chng c nh ng i m khc bi t c n lu . Bn trong th t c x l h p tho i b n c n kh i t o cc ph n t i u khi n bn trong h p tho i b ng thng i p WM_INITDIALOG, cu i cng l ng h p tho i, cn th t c x l WndProc th khng c. C ba lo i h p tho i c b n. H p tho i tr ng thi (modal), h p tho i khng tr ng Trang 26

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ thi (modeless) v h p tho i thng d ng (common dialog) m chng ta s c p c th trong cc ph n d i.

2.2.1. H p tho i tr ng thi


H p tho i tr ng thi (modal) l lo i h p tho i th ng dng trong cc ng d ng c a chng ta. Khi h p tho i tr ng thi c hi n th th b n khng th chuy n i u khi n n cc c a s khc, i u ny c ngha b n ph i ng h p tho i hi n hnh tr c khi mu n chuy n i u khi n n cc c a s khc. 2.2.1.1. Cch t o h p tho i n gi n Sau y l chng trnh t o ra m t h p tho i n gi n. H p tho i c t o ra c n i dung nh sau. Khi h p tho i hi n ln c xu t hi n dng ch "HELLO WORLD", bn trn h p tho i c m t bi u t ng c a h p tho i l m t icon, v pha d i h p tho i l m t nt b m (Button) c tn l OK, khi nh p chu t vo nt OK th h p tho i "HELLO WORLD" c ng l i.

Hnh 2.1 H p tho i n gi n

o n code chng trnh nh sau (V d 2.1): DIALOG.CPP (trch d n)


LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HINSTANCE hInstance ;

Trang 27

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
switch (message) { case WM_CREATE : hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; return 0 ; case WM_COMMAND : switch (LOWORD (wParam)) { case IDC_SHOW : DialogBox (hInstance, TEXT ("DIALOG1"), hwnd, DialogProc) ; break; } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } /*----------------------hm x l thng i p h p tho i-------------------------------*/ BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message)

Trang 28

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
{ case WM_INITDIALOG : return TRUE ; case WM_COMMAND : switch (LOWORD (wParam)) { case IDOK : EndDialog (hDlg, 0) ; return TRUE ; } break ; } return FALSE ; }

DIALOG1.RC (trch d n)
/*---------------------------------------dialog--------------------------------------------*/ DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 89 STYLE DS_MODALFRAME | WS_POPUP FONT 9, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,54,65,50,14 CTEXT "HELLO WORLD ",IDC_STATIC,53,38,72,10 ICON IDI_ICON1,IDC_STATIC,68,9,20,20 END /* -----------------------------------------Menu------------------------------------------*/

Trang 29

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
MENU1 MENU DISCARDABLE BEGIN POPUP "Dialog1" BEGIN MENUITEM "&Show", IDC_SHOW END END

2.2.1.2. H p tho i v t o m u template cho h p tho i Trong v d 2.1 trn, ta t o h p tho i b ng cch dng cc cu l nh ch a trong file ti nguyn DIALOG1.RC. Cch lm ny gip ta hi u c u trc l nh c a Windows, tuy nhin cng c Visual C++ Developer Studio, ta c th thi t l p m t h p tho i tr c quan hn nh sau : Ch n Insert t th c n Resource View thm m t h p tho i, mn hnh c th hi n nh trong hnh 2.2. Miscrosoft s hi n th h p tho i tr c quan cng v i thanh cng c b n c th thm cc thnh ph n i u khi n vo h p tho i. Chng ta c th i u ch nh cc thu c tnh c a h p tho i nh tn h p tho i, ID h p tho i, v tr hi n th c a h p tho i trn c a s chnh, kch th c ch v ki u ch th hi n trn h p tho i...vv b ng cch nh n chu t ph i trn h p tho i th c a s Properties c a h p tho i c hi n th (hnh 2.3).

Hnh 2.2 Thm m t Dialog trong Resource View

Trang 30

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Hnh 2.3 H p tho i Properties c a Dialog

tiu

Trong c a s Properties ny ch n tab Styles, b m c ch n Title Bar v khng c n t o cho c a s . Sau ng c a s Properties c a h p tho i l i.

By gi b t u thi t k di n m o cho h p tho i. Xa nt Cancel v khng c n n nt ny. thm m t bi u t ng vo h p tho i ta nh n nt Picture ln thanh cng c v kch chu t vo h p tho i r i ko khung ch nh t theo kch th c mong mu n. y l ni m bi u t ng c hi n th . Nh n chu t ph i vo khung ch nh t v a t o, ch n Properties t trnh n xu t hi n v nguyn nh danh c a bi u t ng l IDC_STATIC. nh danh ny s c Windowns t khai bo trong file Resource.h v i gi tr -1. Gi tr -1 l gi tr c a t t c cc nh danh m chng trnh khng c n tham chi u n. Ti p n l ch n i t ng Icon trong trong m c Type, r i g nh danh c a Icon c n thm vo trong m c Image. N u t o ra bi u t ng Icon tr c th ch vi c ch n Icon t danh sch cc Icon trong m c Image. thm dng ch "HELLO WORLD" vo h p tho i, ch n Static Text t b ng cng c v t i t ng vo h p tho i. Nh n chu t ph i hi n th Properties c a Static Text, sau vo m c caption nh dng ch "HELLO WORD" vo y. D ch v ch y chng trnh sau xem file DIALOG1.RC d i d ng text, n i dung h p tho i c Windows pht sinh nh sau : DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90 STYLE DS_MODALFRAME | WS_POPUP FONT 9, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,54,65,50,14 CTEXT "HELLO WORLD ",IDC_STATIC,53,38,72,10 ICON IDI_ICON1,IDC_STATIC,68,9,21,20

Trang 31

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ END Dng u tin l tn c a h p tho i "DIALOG1" k ti p l t kha DIALOG, DISCARDABLE v ti p sau l 4 s nguyn. Hai s nguyn u tin ch v tr dng, c t c a h p tho i s c hi n th trn c a s chnh. Hai s nguyn ti p theo xc nh kch th c c a h p tho i theo th t c t v dng. Lu : Cc thng s nh t a v kch th c c a h p tho i khng tnh theo n v Pixel m tnh theo kch c c a Font ch . S o c a t a x v chi u r ng d a trn 1/4 n v r ng trung bnh c a Font ch . S o c a t a y v chi u cao d a trn 1/8 n v cao trung bnh c a Font ch . Theo sau l nh STYLE l cc thu c tnh c a h p tho i m b n c n thm vo. Thng th ng h p tho i modal s d ng cc h ng WS_POPUP v DS_MODALFRAME ngoi ra cn c cc h ng WS_CAPTION, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUP, WS_VSCROLL, WS_HSCROLL, WS_SYSMENU, .... L nh BEGIN v l nh END c th c thay b ng { v }. Trong v d trn, h p tho i s d ng 3 ki u i u khi n l DEFPUSHBUTTON (ki u nt b m m c nh), ICON (bi u t ng), v ki u CTEXT (vn b n c canh gi a). M t ki u i u khi n c khai bo t ng qut nh sau. Control-type "text", id , xPos, yPos, xWidth, yHeight, iStyle. Control-type l cc t kha khai bo ki u i u khi n nh DEFPUSHBUTTON, ICON, CTEXT, . id l nh danh c a cc i u khi n, thng th ng m t i u khi n c m t nh danh ring c g i cng v i thng i p WM_COMMAND n cc th t c x l thng i p c a c a s cha. xPos, yPos l v tr c t, dng hi m th c a i u khi n trn c a s cha. xWidth, yHeight l chi u r ng v chi u cao c a i u khi n . i s cu i cng l iStyle, i s ny ty ch n dng nh ngha thm cc ki u c a s m i u khi n c n th hi n chng th ng l cc h ng WS_ c khai bo trong t p tin .h" c a Windows. 2.2.1.3. Th t c x l thng i p c a h p tho i Th t c x l thng i p c a h p tho i dng x l t t c cc thng i p t b qu n l h p tho i c a Windows g i n hp tho i. Th t c ny c Windows g i khi c s tc ng ln cc ph n t i u khi n n m trong h p tho i. Xt th t c x l h p tho i DialogProc trong v d 2.1. Th t c ny c 4 tham s nh th t c WndProc, v th t c ny c nh ngha ki u tr v l CALLBACK.Tuy hai th t c ny tng t gi ng nhau nhng th c s gi a chng c m t vi s khc bi t ng ch . Th t c DialogProc tr v gi tr ki u BOOL, trong khi th t c WindProc th tr v gi tr LRESULT. Th t c DialogProc tr v gi tr TRUE (gi tr khc 0) n u n x l thng i p v ng c l i n u khng x l cc thng i p th th t c tr v gi th l FALSE (tr 0). Cn th t c WindProc th g i hm DefWindowProc v i cc thng i p khng c n x l. Trang 32

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Th t c DialogProc khng c n x l thng i p WM_DESTROY, cng khng c n x l thng i p WM_PAINT v cng khng nh n c thng i p WM_CREATE m l thng i p WM_INITDIALOG dng kh i t o h p tho i. Ngoi x l thng i p WM_INITDIALOG, th t c x l thng i p h p tho i ch x l m t thng i p duy nh t khc l WM_COMMAND. y cng l thng i p c g i n c a s cha khi ta kch ho t (nt nh n ang nh n c focus) ln cc thnh ph n i u khi n. Ch danh ID c a nt OK" l IDOK s c ch a trong word th p c a i s wParam. Khi nt ny c nh n, th t c DialogProc g i hm EndDialog k t thc x l v ng h p tho i. Cc thng i p g i n h p tho i khng i qua hng i m n c Windows g i tr c ti p hm DialogProc truy n cc thng i p vo cho th t c x l h p tho i.V v y, khng ph i b n tm v hi u ng c a cc phm t t c quy nh trong chng trnh chnh. 2.2.1.4. G i hi n th h p tho i v cc v n lin quan nh danh

Trong th t c WndProc khi x l thng i p WM_CREATE Windows l y v hInstance c a chng trnh v lu n trong bi n tnh hInstance nh sau. hInstance = ((LPCREATESTRUCT) lParam)->hInstance;

Dialog1 ki m tra thng i p WM_COMMAND xem word th p c a i s wParam c b ng gi tr IDC_SHOW (ch danh c a thnh ph n Show trong th c n). N u ph i, t c ch n m c Show trn trnh n c a c a s chnh v yu c u hi n th h p tho i, lc ny chng trnh g i hi n th h p tho i b ng cch g i hm. DialogBox (hInstance, TEXT ("DIALOG1"), hwnd, DialogProc) is u tin c a hm ny ph i l hInstance c a chng trnh g i, i s th hai l tn c a h p tho i c n hi n th , i s th 3 l c a s cha m h p tho i thu c v , cu i cng l a ch c a th t c x l cc thng i p c a h p tho i. Chng trnh khng th tr i u khi n v hm WndProc cho n khi h p tho i c ng l i. Gi tr tr v c a hm DialogBox l gi tr c a i s th hai trong hm EndDialog n m bn trong th t c x l thng i p h p tho i. Tuy nhin chng ta cng c th g i thng i p n hm WndProc yu c u x l ngay c khi h p tho i ang m nh hm SendMessage nh sau : SendMessage(GetParent(hDlg), message, wParam, lParam) Tuy Visual C++ Developer cung c p cho chng ta b so n th o h p tho i tr c quan m ta khng c n ph i quan tm n n i dung trong t p tin .RC. Tuy nhin v i cch thi t k m t h p tho i b ng cc cu l nh gip chng ta hi u chi ti t hn c u trc l nh c a Windows hn th n a t p l nh dng thi t k h p tho i phong ph v a d ng hn r t nhi u so v i nh ng g m ta tr c quan c trn b so n th o c a Developer. B ng cch s d ng cc l nh c bi t trong Trang 33

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ t p tin Resource editor c a Visual C++ ta c th t o ra nhi u i t ng m trong b so n th o khng c. Thm h ng WS_THINKFRAME vo m c STYLE v i trong boder ta ch n m c Resizing). t n i dung tiu STYLE. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Hello Dialog1" C th dng cch khc thm tiu cho h p tho i, b ng cch trong khi x l thng i p WM_INITDIALOG thm vo dng l nh: SetWindowText(hDlg,TEXT("Hello Dialog")); Khi h p tho i c tiu r i, c th thm cc ch c nng phng to v thu nh h p tho i b ng h ng WS_MINIMIZEBOX, WS_MAXIMIZEBOX. C th thm trnh n vo h p tho i n u mu n b ng o n l nh.
DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Hello Dialog1" MENU MENU1

co gi n h p tho i (tng ng

cho h p tho i ta ch vi c thm h ng WS_CAPTION trong

Trong MENU1 l tn c a trnh n ta t o. Trong Visual C++ Developer ta ch c n ch n tn th c n trong m c Menu nh hnh sau.

Hnh 2.4 Ch n menu trong Dialog Propertier

T c a s Properties trn th ch n m c "Font" Trang 34

nh Font ch cho h p tho i.

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ G i hm DialogBoxIndirect t o ra m t h p tho i m khng c n dng resource script. H p tho i t o ra b ng hm ny trong khi chng trnh ang th c hi n c g i l h p tho i t o t ng. Trong v d 3-1 ta ch dng 3 ki u i u khi n l cc ki u ICON, CTEXT, DEFPUSHBUTTON. Ngoi ra cn c cc ki u i u khi n c li t k trong b ng sau. Ki u i u khi n PUSHBUTTON DEFPUSHBUTTON CHECKBOX RADIOBUTTON GROUPBOX LTEXT CTEXT RTEXT ICON EDITTEXT SCROLLBAR LISTBOX COMBOBOX L pc as Button Button Button Button Button Static Static Static Static Edit Scrollbar Listbox Combobox Ki u c a s BS_BUSHBUTTON BS_DEFBUSHBUTTON | WS_TABSTOP BS_CHECKBOX | WS_TABSTOP BS_RADIOBUTTON | WS_TABSTOP BS_GROUPBOX | WS_TABSTOP SS_LEFT | WS_GROUP SS_CENTER | WS_GROUP SS_RIGHT | WS_GROUP SS_ICON ES_LEFT | WS_BORDER | WS_STABSTOP SBS_HORZ LBS_NOTIFY | WS_BORDER | WS_VSCROLL CBS_SIMPLE | WS_TABSTOP
B ng 2.1 Cc ki u i u khi n

Cc ki u i u khi n c khai bo trong resource script c d ng nh sau, ngo i tr ki u i u khi n LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT. Control-type "text", id, xPos, yPos, xWidth, yHeight, iStyle Cc ki u i u khi n LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT c khai bo trong resource script v i c u trc nh trn nhng khng c tr ng "text".

Trang 35

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Thm thu c tnh cho cc ki u i u khi n b ng cch thay i tham s iStyle. V d ta mu n t o radio button v i chu i di n t n m bn tri c a nt th ta gn tr ng iStyle b ng BS_LEFTTEXT c th nh sau. RADIOBUTTON Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT Trong resource script ta cng c th t o m t ki u i u khi n b ng l nh t ng qut sau. CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight Trong class l tn l p mu n t o v d thay v t o m t radio button b ng cu l nh.
RADIOBUTTON "Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT

Thay b ng o n l nh sau:
CONTROL"Radio1",IDC_RADIO1,"button",106,10,53,15,BS_LEFTTEXT

2.2.1.5. V d chng trnh v h p tho i. minh h a cho vi c trao i thng i p gi a cc thnh ph n i u khi n bn trong h p tho i ( ng vai tr l m t c a s cha) v i cc thnh ph n i u khi n con n m bn trong h p tho i, v c ch qu n l h p tho i c a Windows. Chng ta ti n hnh xem xt v d 2-2. K t qu th c hi n c a chng trnh nh trong hnh 2.5. C a s h p tho i g m c ba nhm nt ch n radio.Nhm th nh t dng ch n i t ng v l hnh ch nh t hay hnh ellipse, nhm th hai dng ch n mu t cho hnh v , nhm th 3 dng ch n ki u t cho hnh v . Khi thay i vi c ch n mu t, ki u t th mu t v ki u t c a hnh v c nh bn s thay i theo mu t, v ki u t v a m i ch n. Khi nh n nt OK th h p tho i ng l i v mu t, ki u t cng hnh v v a m i v s c hi n th ln c a s chnh. N u nh n nt Cancel ho c nh n phm Esc th h p tho i c ng l i nhng hnh v , mu t v ki u t khng c hi n th ln c a s chnh. Trong v d ny nt OK v nt Cancel c ch danh ID l n l t l IDOK v IDCANCEL.Thng th ng t ch danh cho cc ph n t i u khi n n m trong h p tho i c b t u b ng ch ID. Bi u t ng chi c xe p trn h p tho i l m t icon. Trn thanh tiu c a c a s chnh c m t bi u t ng, bi u t ng cng l m t icon ( l m t ly tr). Khi t cc nt radio vo h p tho i b ng cng c Developer studio nh ph i t cc nt theo th t nh hnh 2-5. Th khi Windows m i pht sinh m cho cc nt theo th t tng d n, i u ny gip chng ta d dng ki m sot cc thao tc trn t p cc nt radio. B n nh b lun m c ch n Auto trong ph n thi t l p Properties c a cc nt ch n radio. B i v cc nt radio mang thu c tnh Auto yu c u vi t t m l nh hn ngng chng th ng kh hi u so v i cc nt khng c thu c tnh Auto. Ch n thu c tnh Group, Tab stop trong ph n thi t k Properties c a nt OK, nt Cancel, v hai nt radio u tin trong ba nhm radio c th chuy n focus (ch n) b ng phm Tab trn bn phm.

Trang 36

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Hnh 2.5 Minh h a trao

i thng i p qua cc i u khi n

Chng trnh minh h a (V d 2.2) : DIALOG2.CPP (trch d n)


#include <windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM); int iCurrentColor = IDC_BLACK, iCurrentFigure = IDC_RECT; int iCurrenBrush = IDC_HS_BDIAGONAL; void PaintWindow(HWND hwnd, int iColor, int iFigure, int iBrush) { static COLORREF crColor[8] = { RGB(0, 0, 0), RGB(0, 0, 255), RGB(0, 255, 0), RGB(0, 255, 255), RGB(255, 0, 0), RGB(255, 0, 255), RGB(255, 255, 0), RGB(255, 255, 255) } ; HBRUSH hBrush,hbrush; HDC hdc ; RECT rect ; hdc = GetDC (hwnd) ; GetClientRect (hwnd, &rect) ;

Trang 37

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
if(iBrush==IDC_HS_BDIAGONAL) hbrush=CreateHatchBrush(HS_BDIAGONAL, crColor[iColor-IDC_BLACK]); if(iBrush == IDC_HS_CROSS) hbrush=CreateHatchBrush(HS_CROSS, crColor[iColor - IDC_BLACK]); if(iBrush == IDC_HS_DIAGCROSS) hbrush=CreateHatchBrush(HS_DIAGCROSS, crColor[iColor - IDC_BLACK]); if(iBrush == IDC_HS_FDIAGONAL) hbrush=CreateHatchBrush(HS_FDIAGONAL, crColor[iColor - IDC_BLACK]); if(iBrush == IDC_HS_HORIZONTAL) hbrush=CreateHatchBrush(HS_HORIZONTAL, crColor[iColor - IDC_BLACK]); if(iBrush == IDC_HS_VERTICAL) hbrush=CreateHatchBrush(HS_BDIAGONAL, crColor[iColor - IDC_BLACK]); hBrush = (HBRUSH) SelectObject (hdc, hbrush) ; if (iFigure == IDC_RECT) Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ; else Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom) ; DeleteObject (SelectObject (hdc, hBrush)) ;

Trang 38

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
ReleaseDC (hwnd, hdc) ; } void PaintTheBlock(HWND hCtrl, int iColor, int iFigure, int iBrush) { InvalidateRect (hCtrl, NULL, TRUE) ; UpdateWindow (hCtrl) ; PaintWindow (hCtrl, iColor, iFigure,iBrush) ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HINSTANCE hInstance ; PAINTSTRUCT ps ; switch (message) { case WM_CREATE: hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; return 0 ; case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_SHOW: if (DialogBox (hInstance, TEXT ("DIALOG"), hwnd, DialogProc)) InvalidateRect (hwnd, NULL, TRUE) ;

Trang 39

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
return 0 ; } break; case WM_PAINT: BeginPaint (hwnd, &ps) ; EndPaint (hwnd, &ps) ; PaintWindow (hwnd, iCurrentColor, iCurrentFigure, iCurrenBrush) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hCtrlBlock ; static int iColor, iFigure,iBrush; switch (message) { case WM_INITDIALOG: iColor = iCurrentColor ; iFigure = iCurrentFigure ;

Trang 40

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
iBrush = iCurrenBrush; CheckRadioButton(hDlg,IDC_BLACK,IDC_WHITE, iColor); CheckRadioButton(hDlg,IDC_RECT,IDC_ELLIPSE,iFigure);CheckRadioButton (hDlg, IDC_HS_BDIAGONAL, IDC_HS_VERTICAL, iBrush); hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ; SetFocus (GetDlgItem (hDlg, iColor)) ; return FALSE ; case WM_COMMAND: switch (LOWORD (wParam)) { case IDOK: iCurrentColor = iColor ; iCurrentFigure = iFigure ; iCurrenBrush = iBrush; EndDialog (hDlg, TRUE) ; return TRUE ; case IDCANCEL: EndDialog (hDlg, FALSE) ; return TRUE ; case IDC_BLACK: case IDC_RED: case IDC_GREEN: case IDC_YELLOW: case IDC_BLUE:

Trang 41

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
case IDC_MAGENTA: case IDC_CYAN: case IDC_WHITE: iColor = LOWORD (wParam) ; CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ; PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ; return TRUE ; case IDC_RECT: case IDC_ELLIPSE: iFigure = LOWORD (wParam) ; CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ; PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ; return TRUE ; case IDC_HS_BDIAGONAL: case IDC_HS_CROSS: case IDC_HS_DIAGCROSS: case IDC_HS_FDIAGONAL: case IDC_HS_HORIZONTAL: case IDC_HS_VERTICAL: iBrush = LOWORD (wParam) CheckRadioButton(hDlg,IDC_HS_BDIAGONAL,IDC_HS_VERTICAL, LOWORD (wParam)) ; PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ; return TRUE ;

Trang 42

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
} break; case WM_PAINT: PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ; break ; } return FALSE ; }

2.2.1.6. Lm vi c v i cc thnh ph n i u khi n trong h p tho i Cc thnh ph n i u khi n con u g i thng i p WM_COMMAND n c a s cha c a n v c a s cha c th thay i tr ng thi c a cc thnh ph n i u khi n con nh kch ho t, nh d u (check), b d u check (uncheck) b ng cch g i cc thng i p n cc thnh ph n i u khi n con n m trong n. Tuy nhin trong Windows cung c p c ch trao i thng i p gi a cc thnh ph n i u khi n con v i c a s cha. Chng ta b t u tm hi u cc c ch trao i thng i p . Trong v d 2.2 m u template c a h p tho i Dialog2 c th hi n trong t p tin ti nguyn DIALOG2.RC g m c cc thnh ph n. Thnh ph n GROUPBOX c tiu do chng ta g vo, thnh ph n ny ch n gi n l m t khung vi n bao quanh hai nhm nt ch n radio, v hai nhm ny hon ton c l p v i nhau trong m i nhm. Khi m t trong nh ng nt radio c kch ho t th c a s i u khi n con g i thng i p WM_COMMAND n c a s cha ( y l h p tho i) v i word th p c a i s wParam ch a thnh ph n ID c a i u khi n con, word cao c a i s wParam cho bi t m thng bo. Sau cng l i s lParam mang handle c a c a s i u khi n con. M thng bo c a nt ch n radio lun lun l BN_CLICKED (mang gi tr 0). Windows s chuy n thng i p WM_COMMAND cng v i cc i s wParam v lParam n th t c x l thng i p c a h p tho i (DialogProc). Khi h p tho i nh n c thng i p WM_COMMAND cng v i cc i s lParam v wParam, h p tho i ki m tra tr ng thi c a t t c cc thnh ph n i u khi n con n m trong n v thi t l p cc tr ng thi cho cc thnh ph n i u khi n con ny. C th nh d u m t nt ch n b ng cch g i thng i p

SendMessage (hwndCtrl ,MB_SETCHECK, 1, 0); V ng c l i mu n b ch n m t nt no th dng hm. Trang 43

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ SendMessage (hwndCtrl, MB_SETCHECK, 0, 0); Trong i s hwndCtrl l handle c a c a s i u khi n con.

Chng ta c th g p r c r i khi mu n s d ng hai hm trn b i v khng bi t handle c a cc thnh ph n i u khi n con. Chng ta ch bi t handle c a cc thnh ph n i u khi n con khi nh n c thng i p WM_COMMAND. gi i quy t c v ng m c trn, trong Windows cung c p m t hm l y handle c a c a s con khi bi t c nh danh ID c a n b ng hm. hwndCtrl = GetDlgItem (hDlg, id); // hDlg l handle c a h p tho i C th l y c ch danh ID c a thnh ph n i u khi n con khi bi t c handle c a n b ng hm sau. id = GetWindowLong (hwndCtrl, GWL_ID); Tuy nhin, chng ta c th qu n l ID c a cc thnh ph n i u khi n con, cn handle l do Windows c p ng u nhin, do vi c dng handle nh n v ID c a cc thnh ph n i u khi n con l t dng n. Khi h p tho i nh n c thng i p WM_COMAND th chng ta ph i ki m tra nt radio no c ch n (xc nh mu c n ch n), v ti n hnh b ch n cc nt khc b ng o n l nh sau.
case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_BLACK: case IDC_RED: case IDC_GREEN: case IDC_YELLOW: case IDC_BLUE: case IDC_MAGENTA: case IDC_CYAN: case IDC_WHITE: iColor = LOWORD (wParam) ;

Trang 44

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
for( i = IDC_BLACK, i < IDC_WHITE,i++) SendMessage(GetDlgItem(hDlg, i),MB_SETCHECK, i == LOWORD( wParam), 0). return TRUE ; }

Trong iColor dng lu gi tr mu hi n hnh c ch n. Vng l p for dng ki m tra tr ng thi c a t t c cc nt radio thng qua ID c a chng. Hm GetDlgItem dng l y handle c a nt c ch n v lu vo bi n i. Hm SendMessage dng g i thng i p MB_SETCHECK t i cc nt radio. N u word th p c a i s wParam b ng ch danh ID c a nt c ch n th nt c nh d u v cc nt khc s khng c ch n. Ch :Trong cc v d trn th ng dng hai nt OK v nt Cancel, hai nt ny c Windows t nh danh m c nh theo th t l IDOK v IDCANCEL. Thng th ng ng h p tho i b ng cch nh n chu t vo m t trong hai nt OK ho c Cancel. Trong Windows, khi nh n nt Enter th Windows lun pht sinh thng i p WM_COMMAND, b t k i t ng no ang nh n focus. LOWORD c a i s wParam mang gi tr ID c a nt nh n m c nh (nt OK), ngoi tr c m t nt ang nh n focus (trong tr ng h p ny th LOWORD c a i s wParam mang ch danh c a nt ang nh n focus). N u nh n nt Esc hay nh n Ctrl+Break, th Windows g i thng i p WM_COMMAND v i thnh ph n LOWORD c a i s wParam c gi tr IDCANCEL ( nh danh m c nh c a nt Cancel). Do khng c n ph i x l thm cc phm g ng h p tho i. Trong v d 2.2 chng trnh sau. x l hai tr ng h p khi nh n nt Cancel v nt OK ta dng o n

switch (LOWORD (wParam)) { case IDOK: iCurrentColor = iColor ; iCurrentFigure = iFigure ; EndDialog (hDlg, TRUE) ; return TRUE ; case IDCANCEL: EndDialog (hDlg, FALSE) ; return TRUE ;

Trang 45

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
}

Hm EndDialog dng k t thc v ng h p tho i.Trong tr ng h p nh n nt OK th hai gi tr iCurrentColor v gi tr iCurrentFigure c lu l i cho c a s cha (c hai bi n trn u l bi n ton c c). Ch r ng, hai gi tr khc bi t (TRUE, FALSE) c a i s th hai trong l i g i hm EndDialog. Gi tr ny s c tr ng c v t l i g i hm DialogBox trong th t c WndProc.
case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_SHOW: if(DialogBox(hInstance, TEXT("DIALOG"), hwnd, DialogProc)) InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; } break;

C ngha n u hm DialogBox tr v gi tr TRUE, t c nt OK c nh n. Lc th t c WndProc s c p nh t l i n i dung c a c a s chnh, b ng cch ghi l i s thay i gi tr c a hai bi n ton c c iCurrentColor v gi tr iCurrentFigure dng v l i hnh ch nh t hay hnh ellipse v i mu c ch n l iCurrentColor. V ng c l i n u nh n nt Cancel th gi tr iCurrentColor v gi tr iCurrentFigure s khng thay i, t c th t c WndProc s d ng l i gi tr c. Gi tr TRUE hay FALSE thng bo cho c a s chnh bi t r ng ng i dng t ch i hay ch p thu n ty ch n trong h p tho i. V TRUE v FALSE c ki u s nguyn (1,0) nn i s th hai trong l i g i hm EndDialog c ki u s nguyn (int). Do k t qu tr v c a hm ny cng c ki u l s nguyn. V d n u b n b m nt OK th tr tr v c a hm b ng 1. N u b n b m nt Cancel th tr tr v c a hm b ng 0, v n u trong chng trnh c s d ng nt b m m c nh Inoge th khi b m nt ny tr tr c a hm s l 2. 2.2.1.7. V trong h p tho i Trong v d 2.2 chng ta dng phng php v trn h p tho i y l cng vi c khc th ng. By gi ta tm hi u cng vi c ti n hnh nh th no. Trang 46

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Trong file RESOURCE.RC c thnh ph n i u khi n l. LTEXT "",IDC_PAINT, 5, 22, 92, 93 Khi chng ta ch n nt radio thay i mu, hnh v hay nh n c thng i p WM_PAINT th th t c DialogProc th c hi n thao tc v vo thnh ph n i u khi n c a h p tho i b ng hm PaintTheBlock. Hm ny c khai bo nh sau. PaintTheBlock(hCtrBlock, iColor, iFigure); Trong hCtrBlock l handle c a thnh ph n i u khi n c Handle c a thnh ph n i u khi n ny c l y v b i hm. hCtrBlock=GetDlgItem(hDlg, IDC_PAINT); N i dung c a hm PaintTheBlock nh sau.
void PaintTheBlock(HWND hCtrl, int iColor, int iFigure) { InvalidateRect(hCtrl, NULL, TRUE); UpdateWinDow(hCtrl); PaintWinDow(hCtrl, iColor, iFigure); }

nh danh l IDC_PAINT.

Hm InvalidateRect(hCtrl, NULL, TRUE) v UpdateWindow(hCtrl) c nhi m v lm cho c a s con c n ph i v l i. Hm PaintWindow dng v ra mn hnh ellipse hay ch nh t. u tin hm ny l y DC (device context) c a thi t b c handle l hCtrl, v v ln thi t b ny d ng hnh nh cng v i mu t c ch n. Kch th c c a c a s con c n v c l y b ng hm GetClientRect.Hm ny tr v kch th c c a vng client c n v theo n v tnh l pixel. Chng ta v trn vng client c a cc i u khi n con ch khng v tr c ti p ln vng client c a h p tho i. Khi h p tho i nh n c thng i p WM_PAINT th thnh ph n i u khi n c nh danh IDC_PAINT c v l i. Cch x l thng i p WM_PAINT gi ng nh th t c x l WndProc c a c a s chnh, nhng th t c x l h p tho i khng g i hm BeginPaint v hm EndPaint b i v n khng t v ln c a s c a chnh n. N u mu n v hi u ha m t ph n t th dng hm. i u ki n, t c bi n i nt sang tr ng thi v hi u ha

EnableWindow(hwndCtrl, bEnable);

Trang 47

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ i s hwndCtrl l ch danh c a thnh ph n i u khi n mu n v hi u ha, thnh ph n th hai l bEnable mang hai gi tr TRUE hay FALSE, n u thnh ph n ny mang gi tr FALSE th i u khi n ny c v hi u ha, cn ng c l i n u thnh ph n ny mang gi tr TRUE th i u khi n c hi u ha tr l i.

2.2.2. H p tho i khng tr ng thi


Trong ph n trn th o lu n lo i h p tho i, th nh t l h p tho i tr ng thi, v by gi ti p t c th o lu n n lo i h p tho i th hai, h p tho i khng tr ng thi (modeless). hi u r cch s d ng cng nh nh ng thao tc trn h p tho i khng tr ng thi, chng ta th t tm hi u qua cc m c sau. 2.2.2.1. S khc nhau gi a h p tho i tr ng thi v h p tho i khng tr ng thi H p tho i khng tr ng thi khc v i h p tho i tr ng thi ch . Sau khi hi n th h p tho i khng tr ng thi chng ta c th chuy n thao tc n cc c a s khc m khng c n ng h p tho i d ng ny l i. i u ny thu n ti n i v i ng i dng khi ng i dng mu n tr c quan cc s thao tc cng m t lc. V d nh trnh so n th o Studio Deverloper b n c th thao tc qua l i gi a hai h p tho i, l h p tho i b n c n thi t k v m t h p tho i ch a cc lo i i u khi n m b n dng thi t k . V i cch lm ny gip ng i dng tr c quan hn so v i cch ch cho php ng i dng ch thao tc trn m t c a s . S d ng hm DialogBox g i h p tho i tr ng thi v ch nh n c k t qu tr v khi h p tho i ny b ng cng v i hm DialogBox k t thc. Gi tr tr v c a hm ny do i s th hai c a hm k t thc h p tho i (EndDialog) quy nh. Cn i v i h p tho i khng tr ng thi th c t o ra b ng hm. hDlgModeless=CreateDialog(hInstance, szTemplate, hwndParent, DialogProc); Nhng hm ny tr quy n i u khi n v cho ni g i ngay l p t c v gi tr tr v l handle c a c a h p tho i hi n hnh. V c th c nhi u c a s thao tc cng m t lc nn b n lc handle ny d dng truy c p khi b n c n. Ph i t ch WS_VISIBLE cho h p tho i khng tr ng thi, b ng cch ch n m c More Styles trong c a s Properties c a h p tho i. N u nh khng b t ch VISIBLE ln th chng trnh ph i c cu l nh ShowWindow sau l i g i hm CreateDialog khi mu n hi n th h p tho i d ng ny ln mn hnh. hDlgModeless=CreateDialog(hInstance, szTemplate, hwndParent, DialogProc); ShowWindow(hDlgModeless,SW_SHOW);

Trang 48

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Cc thng i p g i n h p tho i d ng modal do trnh qu n l Windows i u khi n cng khc v i cc thng i p g i n h p tho i d ng modeless ph i i qua h ng i c a chng trnh chnh. B i v cc thng i p c a h p tho i d ng modeless dng chung v i cc thng i p c a c a s chng trnh chnh. Nh v y chng ta ph i l c ra thng i p no l thng i p g i n h p tho i khi thao tc trn h p tho i t trong vng l p nh n thng i p. lm c i u ny chng ta dng handle c a h p tho i (lu trong bi n ton c c) c tr v t l i g i hm CreateDialog v chuy n h ng chng b ng o n l nh nh sau.
while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless==0 || !IsDialogMessage (hDlgModeless, &msg); { TranslateMessage(&msg); DispatchMessage(&msg); } }

N u thng i p l y ra t h ng i dnh cho h p tho i th hm IsDialogMessage ki m tra v g i n cc th t c x l h p tho i. V lc ny hm tr v gi tr TRUE, cn ng c l i th hm tr v gi tr FALSE. N u dng thm ch c nng phm tng t c th o n chng trnh trn c
vi t l i nh sau. while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless==0 || !IsDialogMessage(hDlgModeless, &msg); { if(TranslateAccelerator (hwnd, hAccel, &msg) { TranslateMessage(&msg); DispatchMessage(&msg); } }

Trang 49

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
}

Nn ch r ng bi n hDlgModeless lun mang gi tr 0 cho n lc c m t h p tho i c kh i t o b ng cu l nh CreateDialog th gi tr c a n m i c thay i. Khi c a s h p tho i b h y nh t hDlgModeless v gi tr 0. i u ny gip Windows khng g i nh m thng i p x l n cc c a s khc. k t thc v ng h p tho i d ng Modeless b n dng hm DestroyWindow ch khng ph i dng hm EndDialog nh h p tho i d ng Modal. 2.2.2.2. V d v h p tho i khng khng tr ng thi minh h a cch dng h p tho i khng tr ng thi (modeless) ta xt v d 2.3. Chng trnh v d 2.3 sau khi ch y c k t qu nh sau.

Hnh 2.6 Minh h a h p tho i khng tr ng thi

Khi dng chu t ch n lo i hnh v trn radio button, lo i hnh v c ch n s v cng lc ln control tnh c a h p tho i v c a s chnh. Dng chu t ch n mu t cho hnh v c ch n, b ng cch r chu t ln 3 thanh cu n Scrollbar. Chng trnh minh h a (V d 2.3) : *MODELESS.CPP (trch d n)
void PaintWindow (HWND hwnd, int iColor[], int iFigure) { HBRUSH hBrush ; HDC hdc ; RECT rect ;

Trang 50

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
hdc = GetDC(hwnd) ; GetClientRect (hwnd, &rect) ; hBrush = CreateSolidBrush(RGB(iColor[0], iColor[1], iColor[2])); hBrush = (HBRUSH) SelectObject (hdc, hBrush) ; if (iFigure == IDC_RECT) Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ; else Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom) ; DeleteObject (SelectObject (hdc, hBrush)) ; ReleaseDC (hwnd, hdc) ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: PaintTheBlock(hwnd, iColor, iFigure) ; return 0 ; case WM_DESTROY : DeleteObject((HGDIOBJ)SetClassLong(hwnd, GCL_HBRBACKGROUND,(LONG)GetStockObject (WHITE_BRUSH))) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ;

Trang 51

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
} void PaintTheBlock (HWND hCtrl, int iColor[], int iFigure) { InvalidateRect (hCtrl, NULL, TRUE); UpdateWindow (hCtrl) ; PaintWindow (hCtrl, iColor, iFigure) ; } BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hwndParent, hCtrl ; static HWND hCtrlBlock ; int iCtrlID, iIndex ; switch (message) { case WM_INITDIALOG : hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ; for (iCtrlID = 10 ; iCtrlID < 13 ; iCtrlID++) { hCtrl = GetDlgItem (hDlg, iCtrlID) ; PaintTheBlock (hCtrlBlock, iColor, iFigure) ; PaintTheBlock (hwndParent, iColor, iFigure) ; SetScrollRange (hCtrl, SB_CTL, 0, 255, FALSE) ; SetScrollPos(hCtrl, SB_CTL, 0, FALSE) ; }

Trang 52

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
return TRUE ; case WM_COMMAND: { switch( LOWORD(wParam)) { case IDC_RECT: case IDC_ELLIPSE: iFigure = LOWORD(wParam) ; hwndParent = GetParent (hDlg) ; CheckRadioButton(hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ; PaintTheBlock(hCtrlBlock, iColor, iFigure) ; PaintTheBlock (hwndParent, iColor, iFigure) ; return TRUE ; } break; } case WM_VSCROLL : hCtrl = (HWND) lParam ; iCtrlID = GetWindowLong (hCtrl, GWL_ID) ; iIndex = iCtrlID - 10 ; hwndParent = GetParent (hDlg) ; PaintTheBlock (hCtrlBlock, iColor, iFigure) ; PaintTheBlock (hwndParent, iColor, iFigure) ; switch (LOWORD (wParam)) {

Trang 53

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
case SB_PAGEDOWN : iColor[iIndex] += 15 ; case SB_LINEDOWN : iColor[iIndex] = min (255, iColor[iIndex] + 1) ; break; case SB_PAGEUP : iColor[iIndex] -= 15 ; case SB_LINEUP : iColor[iIndex] = max (0, iColor[iIndex] - 1); break; case SB_TOP : iColor[iIndex] = 0 ; break; case SB_BOTTOM : iColor[iIndex] = 255 ; break; case SB_THUMBPOSITION : case SB_THUMBTRACK : iColor[iIndex] = HIWORD (wParam) ; break; default : return FALSE ; } SetScrollPos(hCtrl, SB_CTL, iColor[iIndex], TRUE) ; SetDlgItemInt (hDlg, iCtrlID + 3, iColor[iIndex], FALSE) ;

Trang 54

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
InvalidateRect(hwndParent,NULL,TRUE); DeleteObject ( (HGDIOBJ)SetClassLong( hwndParent, GCL_HBRBACKGROUND, (LONG) CreateSolidBrush( RGB(iColor[0], iColor[1], iColor[2]) ) ) ) ; return TRUE ; case WM_PAINT: PaintTheBlock(hCtrlBlock, iColor, iFigure) ; break; } return FALSE ; }

2.3. MENU
Trong giao di n ng d ng Windows, thnh ph n quan tr ng th ng khng th thi u l menu c a chng trnh. Menu xu t hi n ngay d i thanh tiu c a chng trnh ng d ng. Ngoi ra trong m t s ng d ng thanh menu c th di chuy n c. Th t ra menu cng kh n gi n, v chng c t ch c thnh cc nhm trn thanh chnh (File, Edit, View,), m i m c li t k trong menu chnh c th ch a m t hay nhi u m c li t k g i l menu popup hay dropdown, v v i m i m c li t k trong menu popup ny c th c cc m c con c a n,. Cc m c li t k trn menu c th dng kch ho t m t l nh, hay ch n tr ng thi (check, uncheck). Cc m c li t k trn menu c 3 d ng: c hi u l c (enabled), khng c hi u l c (disabled), v mu xm (grayed). V i quan i m l p trnh th ta ch c n hai tr ng thi l c hi u l c v khng c hi u l c m thi, do tr ng thi mu xm s ch cho ng i dng bi t l tr ng thi c a m c li t k c hi u l c hay khng. V v y khi vi t chng trnh nh ng m c no khng c hi u l c th ta thi t l p tr ng thi mu xm, khi ng i dng s bi t r ng m c li t k khng c hi u l c.

2.3.1. Thi t l p Menu


t o m t menu v a vo chng trnh bao g m cc b c sau: *T o menu trong t p tin ti nguyn *.RC: t o menu trong t p tin ti nguyn, th ng c 2 cch chnh l: dng m t trnh so n th o m t p tin ti nguyn v so n th o theo c u trc Trang 55

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ t p tin RC cung c p cho ti nguyn menu. Thng th ng, cch ny t s d ng, v cc mi tr ng pht tri n C trn Windows (Borland C for Windows, Visual C) u cung c p cc cng c cho php t o menu m t cch d dng. *Ci t menu vo c a s c a chng trnh ng d ng: ph n ny n gi n l khi nh ngha l p c a s ta thi t l p thu c tnh lpszMenuName c a c u trc l p WNDCLASS b ng tn menu c khai bo trong t p tin ti nguyn. V d : wndclass.lpszMenuName = "MENU1"; Ngoi ra, c th ci t menu vo c a s b ng cch dng l nh :

hMenu = LoadMenu ( hInstance, TEXT("MENU1") ); L nh ny s tr v m t nh danh c a menu c n p, khi c c th khi a vo c a s c 2 cch sau: *Trong hm t o c a s CreateWindow, tham s th 9 c a hm l thi t l p tham s ny l nh danh c a menu v a t o. nh danh menu ny nh danh cho menu,

hwnd = CreateWindow ( TEXT("MyClass"), TEXT("Window Caption"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, NULL ); *Khi g i hm t o c a s CreateWindow, tham s th 9 c thi t l p NULL, sau trong chng trnh dng l nh: SetMenu(hWnd, hMenu); thi t l p menu cho c a s . *Thm cc o n chng trnh x l menu: Windows pht sinh thng i p WM_COMMAND v g i n chng trnh khi ng i dng ch n m t m c li t k c hi u l c trn thanh menu. Khi ch c n x l thng i p WM_COMMAND b ng cch ki m tra 16 bit th p c a tham s wParam l xc nh c ID c a m c li t k no trn menu c ch n.

2.3.2. V d minh h a Menu


*T p tin ti nguyn ch a khai bo menu : MENUDEMO.RC
MENUDEMO MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New", IDM_FILE_NEW

Trang 56

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
MENUITEM "&Open", IDM_FILE_OPEN MENUITEM "&Save", IDM_FILE_SAVE MENUITEM "Save &As...", IDM_FILE_SAVE_AS MENUITEM SEPARATOR MENUITEM "E&xit", IDM_APP_EXIT END POPUP "&Edit" BEGIN MENUITEM "&Undo", IDM_EDIT_UNDO MENUITEM SEPARATOR MENUITEM "C&ut", IDM_EDIT_CUT MENUITEM "&Copy", IDM_EDIT_COPY MENUITEM "&Paste", IDM_EDIT_PASTE MENUITEM "De&lete", IDM_EDIT_CLEAR END POPUP "&Background" BEGIN MENUITEM "&White", IDM_BKGND_WHITE, CHECKED MENUITEM "&Light Gray", IDM_BKGND_LTGRAY MENUITEM "&Gray", IDM_BKGND_GRAY MENUITEM "&Dark Gray", IDM_BKGND_DKGRAY MENUITEM "&Black", IDM_BKGND_BLACK END POPUP "&Help" BEGIN

Trang 57

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
MENUITEM "&Help...", IDM_APP_HELP MENUITEM "&About ...", IDM_APP_ABOUT END END

*T p tin tiu

ch a cc

nh ngha : MENUDEMO.H

#define IDM_FILE_NEW 40001 #define IDM_FILE_OPEN 40002 #define IDM_FILE_SAVE 40003 #define IDM_FILE_SAVE_AS 40004 #define IDM_APP_EXIT 40005 #define IDM_EDIT_UNDO 40006 #define IDM_EDIT_CUT 40007 #define IDM_EDIT_COPY 40008 #define IDM_EDIT_PASTE 40009 #define IDM_EDIT_CLEAR 40010 #define IDM_BKGND_WHITE 40011 #define IDM_BKGND_LTGRAY 40012 #define IDM_BKGND_GRAY 40013 #define IDM_BKGND_DKGRAY 40014 #define IDM_BKGND_BLACK 40015 #define IDM_APP_HELP 40018 #define IDM_APP_ABOUT 40019

*T p tin ch a m ngu n : MENUDEMO.C


#include <windows.h> #include "menudemo.h"

Trang 58

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); /* Khai bo tn dng chung cho ccti nguyn trong chng trnh.*/ TCHAR szAppName[] = TEXT ("MenuDemo") ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) ; wndclass.lpszMenuName = szAppName ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows "), szAppName, MB_ICONERROR) ; return 0 ; }

Trang 59

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
hwnd = CreateWindow (szAppName, TEXT("Menu Demonstration"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { /* Khao bo danh sch cc mu ch i t, cc h ng ny c nh ngha trong file WINGDI.H */

static int idColor[5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH } ; static int iSelection = IDM_BKGND_WHITE ; HMENU hMenu ; switch (message) { case WM_COMMAND: hMenu = GetMenu (hwnd) ; // L y nh danh c a menu nh danh m c ch n

switch (LOWORD (wParam)) // Ki m tra { case IDM_FILE_NEW:

Trang 60

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
case IDM_FILE_OPEN: case IDM_FILE_SAVE: case IDM_FILE_SAVE_AS: MessageBeep(0) ; //Pht ra ti ng ku bp return 0 ; case IDM_APP_EXIT: /*G i thng i p ng ng d ng l i*/

SendMessage (hwnd, WM_CLOSE, 0, 0) ; return 0 ; case IDM_EDIT_UNDO: case IDM_EDIT_CUT: case IDM_EDIT_COPY: case IDM_EDIT_PASTE: case IDM_EDIT_CLEAR: MessageBeep (0) ; return 0 ; case IDM_BKGND_WHITE: case IDM_BKGND_LTGRAY: case IDM_BKGND_GRAY: case IDM_BKGND_DKGRAY: case IDM_BKGND_BLACK: /* B check c a m c ch n tr c */ CheckMenuItem(hMenu,iSelection, MF_UNCHECKED); iSelection = LOWORD (wParam) ; /*L y ID m c m i*/ /* Check m c ch n m i*/

Trang 61

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
CheckMenuItem (hMenu, iSelection, MF_CHECKED) ; /* Thi t l p mu tng ng v i m c ch n m i*/ SetClassLong(hwnd,GCL_HBRBACKGROUND, (LONG) GetStockObject(idColor[iSelectionIDM_BKGND_WHITE]));

InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case IDM_APP_HELP: MessageBox(hwnd, TEXT("Help not yet implemented!"), szAppName, MB_ICONEXCLAMATION | MB_OK) ; return 0 ; case IDM_APP_ABOUT: MessageBox (hwnd, TEXT ("Menu Demonstration Program\n (c) Charles Petzold, 1998"), szAppName, MB_ICONINFORMATION | MB_OK) ; return 0 ; } break; case WM_DESTROY: PostQuitMessage(0) ; return 0 ; } return DefWindowProc(hwnd, message, wParam, lParam) ; }

Trang 62

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Chng 3 CC
3.1. M U

I T NG I U KHI N

Cc i t ng i u khi n (control) l cc thnh ph n tng tc tr c quan, th hi n r c ch giao ti p h a gi a ng d ng v ng i dng. Nh cc i t ng ny, cc chng trnh ng d ng trong Windows tr nn thn thi n v d dng. V th , chng l cc thnh ph n c b n khng th thi u trong h u h t cc ng d ng. Trong chng ny, chng ta s tm hi u cc t o l p v x l cho cc thng qua cc l p (class) sau : L L L L L L p Button (nt b m). p Static (tnh). p Edit Box (so n th o). p List Box (danh sch). p Combo Box. p Scroll Bar (thanh cu n). i t ng i u khi n

3.2. GI I THI U T NG QUAN

Trang 63

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ M t ki u i u khi n c xem nh l m t c a s con. C th t o nhi u c a s con trong cng m t c a s cha. Cc c a s con xc nh handle c a s c a cha b ng cch g i hm : hwndParent = GetParent (hwnd); hwnd l handle c a c a s con c n l y handle c a c a s cha. V khi l y c handle c a c a s cha, c a s con c quy n g i cc thng i p n c a s cha thng qua hm. SendMessage(hwndParent, message, wParam, lParam); message l thng i p c n g i n th t c x l c a c a s cha. wParam l ch danh ID c a c a s con, cn lParam ghi l i tr ng thi c a c a s con. V y chng ta c th t o m t thnh ph n i u khi n d ng c a s con hay cn g i l "child window control". C a s con c nhi m v x l cc thng i p nh bn phm, thng i p chu t v thng bo cho c a s cha khi tr ng thi c a c a s con thay i. Nh v y c a s con tr thnh cng c giao ti p (cho php nh p v xu t) gi a ng i dng v i chng trnh. Tuy chng ta c th t o ra m t c a s con cho chnh mnh, nhng chng ta nn t n d ng cc l p c a s con c Windows nh ngha s n hay cn g i l nh ng ki u i u khi n chu n. Nh ng ki u i u khi n chu n ny th ng l cc nt b m (button), h p ki m tra (check box), h p so n th o (edit box), h p danh sch (list box), combo box, cc thanh cu n v chu i ch . V d mu n t o ra m t nt b m trn mn hnh ch c n g i hm CreateWindows, m ch ng c n ph i quan tm n cch v , cch nh n chu t hay l ch p khi b kch ho t. T t c i u ny u do Windows x l. i u quan tr ng lph i ch n thng i p WM_COMMAND c a cc i u khi n x l thng i p ny theo nh ng m c ch khc nhau. Cc ki u i u khi n con th ng c dng trong h p tho i. Nh minh h a trong cc i u khi n nh n h p tho i lm c a s cha. Tuy nhin, cng c th t o cc chng 2, ki u i u khi n con tr c ti p trn vng c a s chnh, b ng cch g i hm CreateWindow v i u ch nh v tr cng v i kch th c c a n cho thch h p b ng hm MoveWindow. Th t c x l thng i p c a c a s cha g i cc thng i p n cc khi u i u khi n con, v ng c l i cc child window control g i cc thng i p yu c u c a s cha x l cc thng i p . t o m t c a s ng d ng bnh th ng. u tin ph i ng k l p c a s b ng hm RegisterClass. Ti p theo l kh i t o l p ng k thng qua hm CreateWindow. Cn tr ng h p mu n t o m t l p c nh ngha s n th khng c n ng k cho l p c a s con mu n t o. S d ng cc ki u i u khi n tr c ti p trn c a s chnh i h i cc tc v c p th p hn so v i dng cc ki u i u khi n trn h p tho i. V cc ki u i u khi n t o ra trn c a s chnh khng c h tr cc ti n ch. V d nh chng ta khng th s d ng phm b m tab chuy n focus gi a cc ki u i u khi n v i nhau.

3.3. L P BUTTON
Trang 64

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ tm hi u cc ki u i u khi n, xem xt v d 3.1 sau. Trong v d ny t o ra 9 c a s con chu n trn m t c a s cha nh hnh 3.1.

Hnh 3.1 Minh h a cc l p Button

Nh p chu t vo cc nt, lc cc nt s g i thng i p WM_COMMAND n th t c x l thng i p WndProc c a c a s cha. Th t c WndProc x l v in ra mn hnh cc thng s lParam v wParam c a thng i p g i t i ny.Trong lParam l handle c a c a s con g i thng i p n c a s cha. wParam c hai ph n LOWORD v HIWORD, LOWORD cho bi t ID c a c a s con, HIWORD l m thng bo. M thng bo nt b m l m t trong nh ng gi tr sau. nh danh m thng bo Button BN_CLICKED BN_PAINT BN_HILETE hay BN_PUSHED BN_UNHILITE hay BN_UNPHUSHED BN_DISABLE BN_DOUBLECLICKED hay BN_DBCLICK BN_SETFOCUS BN_KILLFOCUS Gi tr 0 1 2 3 4 5 6 7

Trang 65

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam


nh danh m thng bo Button

____________________________________________________________________________________
B ng 3.1

Khng bao gi th y c cc gi tr c a nt b m, ch bi t r ng gi tr t 1 n 4 dnh cho ki u button BS_USERBUTTON, gi tr 5 dnh cho ki u BS_RADIOBUTTON, BS_AUTORADIOBUTTON, BS_OWNEDRAW, hay cc nt b m khc n u nt b m bao g m ki u BS_NOTYFY. Gi tr 5,6 dnh cho cc ki u nt b m bao g m c c NOTYFY. Sau y l chng trnh chnh. *CONTROL1.CPP (trch d n)
struct { int iStyle ; TCHAR *szText ; } button[ ] = { BS_PUSHBUTTON, TEXT ("PUSHBUTTON"), BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"), BS_CHECKBOX, TEXT ("CHECKBOX"), BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"), BS_RADIOBUTTON, TEXT ("RADIOBUTTON"), BS_3STATE, TEXT ("3STATE"), BS_AUTO3STATE, TEXT ("AUTO3STATE"), BS_GROUPBOX, TEXT ("GROUPBOX"), BS_AUTORADIOBUTTON, TEXT ("AUTORADIO") }; #define NUM (sizeof(button) / sizeof(button[0])) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

Trang 66

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndButton[NUM] ; static RECT rect ; static TCHAR szTop[] = TEXT("message wParam lParam"), szUnd[] = TEXT("_______ ______ ______"), szFormat[] = TEXT("%-16s%04X-%04X %04X-%04X"), szBuffer[50]; static int cxChar, cyChar ; HDC hdc ; PAINTSTRUCT ps ; int i ; switch (message) { case WM_CREATE : cxChar = LOWORD(GetDialogBaseUnits()) ; cyChar = HIWORD(GetDialogBaseUnits()) ; for (i = 0 ; i < NUM ; i++) hwndButton[i] = CreateWindow(TEXT("button"), button[i].szText, WS_CHILD|WS_VISIBLE|button[i].iStyle, cxChar, cyChar*(1+2*i), 20*cxChar, 7*cyChar/4, hwnd, (HMENU)i, ((LPCREATESTRUCT)lParam)->hInstance, NULL) ; return 0 ; case WM_SIZE : rect.left = 24*cxChar ; rect.top = 2*cyChar ;

Trang 67

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
rect.right = LOWORD(lParam) ; rect.bottom = HIWORD(lParam) ; return 0 ; case WM_PAINT : InvalidateRect (hwnd, &rect, TRUE) ; hdc = BeginPaint (hwnd, &ps) ; SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); SetBkMode (hdc, TRANSPARENT) ; TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)); TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DRAWITEM : case WM_COMMAND : ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ; hdc = GetDC (hwnd) ; SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); TextOut (hdc, 24*cxChar, cyChar*(rect.bottom/cyChar-1), szBuffer, wsprintf (szBuffer, szFormat, message==WM_DRAWITEM ? TEXT ("WM_DRAWITEM") : TEXT ("WM_COMMAND"), HIWORD (wParam), LOWORD (wParam), HIWORD (lParam), LOWORD (lParam))) ; ReleaseDC (hwnd, hdc); ValidateRect (hwnd, &rect); break; case WM_DESTROY : PostQuitMessage(0) ; return 0 ;

Trang 68

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
} return DefWindowProc (hwnd, message, wParam, lParam) ; }

t o ra m t child window control b n dng c u trc CreateWindow v i cc thng s nh sau. Tn l p : TEXT ("button") Text c a s : Button[i].szText Ki u c a s : WS_CHILD | WS_VISIBLE | button[i].iStyle V tr x : cxChar V tr y : cyChar*( 1+2*i ) Chi u r ng : 20*xChar Chi u cao : 7*yChar*4 Handle c a s cha : hwnd Ch danh c a c a s con : (HMENU) i Th qu n Handle : ((LPCREATESTRUCT) lParam-> hInstance, NULL) ; Cc thng s thm : NULL

nh. Tn c a s do chng ta t. Ki u c a s s d ng l Trong tn l p l c WS_CHILD, WS_VISIBLE v m t trong 9 ki u button (BS_PUSHBUTTON, BS_CHECKBOX,...). Ti p theo l 4 thng s xc nh v tr x, v tr y, kch th c theo chi u r ng, kch th c chi u cao c a c a s con trn vng client c a c a s cha. hwnd l handle c a c a s cha. ID l ch danh c a m i c a s con (m i c a s con c duy nh t m i s ID). ID ny ph i p ki u HMENU ch nh trnh n. lParam th c ch t l m t con tr n c u trc LPCREATESTRUCT c thnh ph n hInstance. D mu n l y th qu n hInstance th ph i p ki u lParam.

3.3.1. L p Push Button


Trong v d 3.1 c hai Push Button c t o ra b ng hm CreateWindow v i kch th c v v tr c xc nh b i ng i l p trnh. Cc Push Button c s d ng b t t t m t hnh ng t c th i ch khng gi c tr ng thi b t hay t t lu di nh checkbox c. Trn y l hai ki u c a s BS_PUSHBUTTON v BS_DEFBUTTON (ki u nt b m m c nh). Hai ki u ny khi thi t k th khc nhau nhng khi s d ng th n c ch c nng hon ton gi ng nhau. Khi nh n chu t vo nt ny th nt ny g i thng i p WM_COMMAND n c a s cha v i m thng bo BN_CLICK. C th tc ng n nt b m ny b ng cch g i hm. SendMessage( hwndButton, BM_SETSTASE, 1, 0 ); N u mu n nt nh n ny tr l i tr ng thi bnh th ng th g i hm : Trang 69

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ SendMessage(hwndButton, BM_SETSTASE, 0, 0 ); hwndButton l nh danh c a c a s con c tr v b i hm CreateWindow.

3.3.2. L p Check Box


M t check box l l m t h p vung km theo ch . Thng th ng ch n m bn tri c a h p. Tuy nhin, cng c th t ch n m bn ph i b ng cch thm vo ki u BS_LEFTTEXT khi t o m t button. Cc check box cho php ng i dng ch n cc ty ch n, n ho t ng nh m t cng t c. C hai lo i check box thng d ng l BS_CHECKBOX v BS_AUTOCHECKBOX. Khi s d ng lo i BS_CHECKBOX, chng ta t t d u check box b ng cch g i n ki u i u khi n ny thng i p BS_SETCHECK. Thng s wParam trong hm SendMessage c t gi tr 1 t o nh d u, v b ng 0 khi mu n h y nh d u. L y tr ng thi c a m t check box b ng cch g i n ki u i u khi n ny thng i p BM_GETCHECK. Dng o n chng trnh sau b t t t d u check khi x l thng i p WM_COMMAND c g i n t cc ki u i u khi n.
SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)!SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0), 0);

Ch ton t ! (NOT) ng tr c hm SendMessage. Gi tr lParam l handle c a c a s con g i n c a s cha trong thng i p WM_COMMAND. Mu n bi t tr ng thi c a check kh i ng m t check box lo i box no th g i t i n thng i p BM_GETCHECK. BS_CHECKBOX v i tr ng thi c nh d u, b ng cch g i n n m t thng i p BM_SETCHECK theo c u trc. SendMessage (hwndButton,BM_SETCHECK, 1, 0); Cn check box BS_AUTOCHECK l lo i nt b m m t n nh d u b t hay t t cho chnh n. Mu n l y tr ng thi c a check box hi n hnh, ch c n g i thng i p BM_GETCHECK n ki u i u khi n ny theo c u trc. iCheck = SendMessage (hwndButton, BM_SETCHECK, 1, 0); iCheck mang gi tr TRUE n u check box gi tr FALSE. tr ng thi ch n, cn ng c l i iCheck mang

Ngoi ra cn c hai lo i check box khc l BS_3STATE v BS_AUTO3STATE. Hai lo i ny cn c thm tr ng thi th 3, l tr ng thi nt check box c mu xm xu t hi n khi b n g i thng i p WM_SETCHECK v i tham s wParam b ng 2 n check box ny. Mu xm cho bi t ng i dng ch n l a khng thch h p hay khng xc nh.

3.3.3. L p Radio Button

Trang 70

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ M t radio button l m t vng trn c km theo ch . T i m t th i i m ch c m t radio button c nh n. Cc radio th ng c nhm l i s d ng cho vi c l a ch n duy nh t trong nhm. Tr ng thi cc radio button khng b t t t nh check box. C ngha, khi nh n chu t vo radio button th button ny c nh d u, v khi ta nh n chu t vo m t l n n a th radio cng v n tr ng thi nh d u. C hai ki u radio button l BS_RADIOBUTTON v BS_AUTORADIOBUTTON, nhng ki u th hai ch s d ng trong h p tho i. Khi nh n thng i p WM_COMMAND t radio button, th chng ta ph i nh d u radio b ng cch g i thng i p BM_SETCHECK v i thng s wParam b ng 1 nh sau. SendMessage(hwndButton, BM_SETCHECK, 1, 0); T t c cc radio button trong cng m t nhm, n u b n mu n t t d u check th b n g i chng thng i p BM_SETCHECK v i thng s wParam b ng 0 nh sau. SendMessage(hwndButton, BM_SETCHECK, 0, 0); n

3.3.4. L p Group Box


Group box c ki u BS_GROUPBOX, y l lo i button c bi t. M t group box ch n gi n l m t ng vi n c dng tiu trn nh. Group box khng x l cc thng i p bn phm, khng x l cc thng i p chu t v cng khng g i thng i p WM_COMMAND n c a s cha c a n. Cc group box th ng c s d ng bao quanh cc ki u i u khi n khc.

3.4. L P STATIC
T o ra m t l p tnh b ng cch s d ng "static" khi t o l p c a s trong hm CreateWindow. L p tnh khng nh n nh p d li u t bn phm cng nh t chu t, v khng g i thng i p WM_COMMAND n c a s cha. Khi di chuy n hay nh n chu t vo cc c a s con tnh, c a s con ny b y thng i p WM_NCHITTEST v tr v gi tr HTTRANSPARENT n Windows. i u ny lm cho Windows g i cng thng i p WM_NCHITTEST cho c a s cha. C a s cha th ng g i thng i p ny n th t c DefWindowProc. Cc ki u c a s tnh sau y dng v m t hnh ch nh t hay m t khung ln vng client c a c a s con. Cc ki u FRAME l nh ng ng bao hnh ch nh t, cc ki u RECT l nh ng hnh ch nh t : SS_BLACKRECT, SS_GRAYRECT, SS_ WHITERECT. SS_BLACKFRAME, SS_GRAYFAME, SS_WHITEFRAME.

3.5. L P EDIT TEXT


Trong m t phng di n no th l p so n th o (edit text) c xem l m t c a s c nh ngha s n n gi n nh t. Nhng xt m t kha c nh khc th n l i ph c t p nh t. Dng tn Trang 71

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ l p "edit" cng v i cc thng s v tr x, v tr y, chi u r ng, chi u cao trong hm CreateWindow t o ra c a s so n th o. Khi c a s so n th o nh n focus th chng ta c th g ch vo, xo cc ch , nh d u cc ch vv. Cc thao tc trn c Windows h tr hon ton. M t trong nh ng ng d ng th ng xuyn nh t, v n gi n nh t c a l p so n th o l t o ra m t c a s cho php ng i dng nh p cc ch vo. minh h a cho c a s nh p ta xt v d 3.2 sau. *EDITTEXT.CPP
#include <windows.h> #define ID_EDIT 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); TCHAR szAppName[] = TEXT ("PopPad1") ; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndEdit ; switch (message) { case WM_CREATE : hwndEdit = CreateWindow (TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 0, 0, hwnd, (HMENU)ID_EDIT, ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ; return 0 ; case WM_SETFOCUS : SetFocus (hwndEdit) ; return 0 ; case WM_SIZE : MoveWindow (hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);

Trang 72

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
return 0 ; case WM_COMMAND : if (LOWORD (wParam) == ID_EDIT) if ( HIWORD(wParam)==EN_ERRSPACE || HIWORD(wParam)==EN_MAXTEXT ) MessageBox(hwnd, TEXT("Edit control out of space."), szAppName, MB_OK | MB_ICONSTOP) ; return 0 ; case WM_DESTROY : PostQuitMessage(0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }

H n ch c a edit box c qu 30.000 k t ch .

nh ngha s n l s k t ng i dng nh p vo ph i khng

3.5.1. Cc ki u l p Edit Text


Trong v d trn t o m t edit box b ng cch g i hm CreateWindow. C ki u c a s l WS_CHILD, cng m t s ty ch n. Chng ta c th canh tri, ph i, gi a cc ch trong vng c a s edit box b ng cch thay i thng s ki u c a s ES_LEFT, ES_RIGHT, ES_CENTER trong hm CreateWindow. C th t o m t edit control cho php hi n th nhi u hng b ng cch ch n ki u c a s ES_MULTILINE. M t edit control m c nh ch cho php nh p m t hng k t cho n cu i edit box. S d ng ES_AUTOHSCROLL, ES_AUTOVSCROLL t o m t edit control c thanh cu n ngang, v cu n ng t ng. C th thm thanh cu n ngang v ng vo edit control b ng cch s d ng ki u c a s WS_HSCROLL, WS_VSCROLL. Dng ki u c a s WS_BORDER t o ng vi n cho edit control. Kch th c c a edit control c xc nh b ng cch g i hm MoveWindow khi hm WndProc x l thng i p WM_SIZE. Trong v d trn th kch th c c a edit control c b ng kch th c c a c a s chnh. MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); t

Trang 73

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Cc edit control g i thng i p WM_COMMAND cng cc thng s wParam, lParam n window c a s cha. V i ngha : LOWORD(wParam) l ID c a s con, HIWORD(wParam) l m thng bo. lParam l handle c a edit control. M thng bo EN_SETFORCUS EN_KILLFORCUS EN_CHANGE EN_UPDATE EN_ERRSPACE EN_MAXTEXT EN_HSCROLL EN_VSCROLL ngha Endit control nh n focus nh p. Endit control m t focus nh p. N i dung c a edit control s thay N i dung c a edit control thay Edit control ch y qu th i gian. Edit control ch y qu khng gian khi chn. Thanh cu n ng c a edit control b tc ng. ng. i. i.

Thanh cu n n m c a edit control b tc


B ng 3.2 Danh sch m thng bo c a edit Control.

3.5.2. Cc thng i p

n m t l p Edit Text
c ch n (selected).

Cc th t thng i p sau cho php c t, sao chp, xo cc ph n ch SendMessage (hwndEdit, WM_CUT, 0, 0); SendMessage (hwndEdit, WM_COPY, 0, 0); SendMessage (hwndEdit, WM_CLEAR, 0, 0);

V i WM_CUT c t ph n ch c nh d u a vo vng Clipboard. WM_COPY sao chp ph n ch c nh d u a vo Clipboard nhng ph n nh d u v n cn trn edit control. WM_CLEAR xa ph n ch c nh d u m khng a vo clipboard. Chn ph n ch n m trong clipboard vo vng so n th o edit control b ng cch g i hm. SendMessage (hwndEdit, WM_PASTE , 0, 0); Nh n b t u v k t thc c a ph n ch ch n b ng cch g i hm :

Trang 74

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ SendMessage (hwndEdit, EM_GETSEL, (WPARAM)&iStart, (LPARAM)&iEnd ); iStart lu v tr b t thay th ph n ch u v iEnd lu v tr k t thc. ch n b ng ch khc, ta dng hm ;

SendMessage(hwndEdit,EM_REPLACESEL,0,(LPARAM)szString); Trong szString l chu i mu n thay th . i v i edit control nhi u dng, ta m s dng ch b ng hm.

iCount = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0); Cc dng trong edit control c nh s b t th t t 0. L y chi u di c a m t dng b ng l nh. iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0). Chp hng ny vo b m b ng cch g i hm.

iLength = SendMessage ( hwdEdit, EM_GETLINE, iLine, (LPARAM)Buffer ).

3.6. L P LIST BOX


List box l t p h p cc chu i k t c gi g n trong m t hnh ch nh t. M t chng trnh c th thm ho c xa cc chu i trong list box b ng cch g i cc thng i p n th t c window c a list box. List box control g i thng i p WM_COMMAND n c a s cha khi c m t m c trong list box b nh d u. C a s cha xc nh n cc m c trong list box b nh d u. M t list box c th ch n c m t m c hay nhi u m c cng m t lc (ty theo lo i list box n hay kp).

3.6.1 Cc ki u List Box


Chng ta t o m t c a s con list box b ng hm CreateWindow v i l p c a s l "listbox" cng v i lo i c a s WS_CHILD. Tuy nhin ki u c a s con m t nh ny khng g i thng i p WM_COMMAND n c a s cha, c ngha chng trnh t ki m tra vi c nh d u cc danh m c trong list box. V th , cc ki u i u khi n list box th ng nh ngha ki u list box LBS_NOTYFY, i u ny cho php c a s cha nh n thng i p WM_COMMAND t list box. N u mu n s p x p cc m c trong list box th s d ng ki u LBS_SORT. Theo m c nh, nh ng list box t o ra l nh ng list box n. V th , n u mu n t o ra m t list box kp (t c list box cho php ng i dng ch n nhi u dng cng lc) th ph i s d ng lo i list box LBS_MULTIPLESEL.Thng th ng, List box s t c p nh t khi m t m c c thm Trang 75

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ vo. Tuy nhin c th ngn c n vi c c p nh t ny b ng ki u LBS_NOREDRAW. Vi c lm ny i khi khng thch l m, thay vo chng ta c th s d ng thng i p WM_SETREDRAW ngn ch n t m th i vi c v l i c a list box. Theo m c nh, cc m c trong list box khng c ng vi n bao quanh khi hi n th trn mn hnh. Tuy nhin, c th thm ng vi n cho cc m c b ng nh danh c a s WS_BORDER. Thm thanh cu n ng vo list box b ng cch thm nh danh c a s WS_VSCROLL. Thng th ng windows nh ngha m t list box g m cc thng s sau : LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER. Ngoi ra cn c cc thng s WS_SIZEBOX v WS_CAPTION dng thay i kch th c v thm tiu cho list box. Nn t o ra m t list box c chi u r ng b ng chi u di c a chu i di nh t trong list box c ng v i chi u di c a thanh cu n d c. Chi u di c a thanh cu n d c c xc nh b ng hm. GetSystemMetrics(SM_CXVCROLL);

3.6.2.

t cc chu i vo List Box

thm m t chu i vo list box ta g i cc thng i p n th t c Windows list box b ng hm SendMessage. Khi truy n chu i cho hm SendMessage th thng s wParam l m t con tr , tr n chu i c k t thc b i k t NULL. Hm SendMessage tr v m LB_ERRSPACE (gi tr -2) khi Windows ch y qu khng gian b nh dnh cho list box. Hm SendMessage tr v m LB_ERR ( -1) khi x y ra l i khc v tr v m LB_OKAY ( 0 ) n u thao tc thm thnh cng. N u s d ng ki u LBS_SORT th khi thm m t chu i vo list box ch c n dng ch th LB_ADDSTRING theo c u trc. SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM) szString); V i szString l chu i c n thm vo list box. N u trong list box khng dng ki u LBS_SORT th c th chn m t chu i v i ch th LB_INSERTSTRING cng v tr mu n chn b ng hm. SendMessage(hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString); iIndex l v tr mu n chn chu i vo. N u gi tr ny b ng -1 th chu i c chn vo y c a list box. Xa m t chu i trong list box b ng ch th LB_DELETESTRING.

Trang 76

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ SendMessage(hwndList, LB_DELETESTRING, iIndex, 0); Xa h t cc ph n t n m trong list box th dng ch th LB_RESETCONTENT v i c u trc. SendMessage(hwndList, LB_LB_RESETCONTENT, 0, 0 ); Khi thm vo hay xa th Windows t c p nh t l i list box. Tuy nhin ta cng c th t m th i c n s c p nh t ny b ng cch t t c v l i list box. SendMessage(hwndList, WMSETREDRAW, FALSE, 0); Sau khi th c hi n xong ta b t c v l i list box b ng hm. SendMessage(hwndList, WMSETREDRAW, TRUE, 0);

3.6.3. Ch n v l y cc m c trn List Box


Tng t nh t chu i vo List box , ch n v l y m c trong List box cng ph i g i cc thng i p n th t c Window List box b ng hm SendMessage. Dng ch th LB_GETCOUNT m s m c trong List box.

iCount = SendMessage (hwndList, LB_GETCOUNT, 0, 0 ); Lm sng m c ch n m c nh th dng LB_SETCURSEL.

SendMessage (hwndList, LB_SETCURSEL, iIndex, 0 ); N u t gi tr iIndex b ng -1 th window s b t t c cc m c ch n. d a trn ch b t u c a m c, ta dng hm. ch n cc m c

iIndex = SendMessage (hwndlist, LB_SELECTSTRING, iIndex, (LPARAM) szSearchString); iIndex l v tr b t u c a vi c tm v i k t u gi ng szSearchString. N u gi tr iIndex b ng -1 th vi c tm b t u t v tr u tin. Hm s tr v gi tr tm ci. N u chu i khng t n t i th hm tr v m l i LB_ERR. Xc hm. iIndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0); nh m c ch n khi nh n c thng i p WM_COMMAND t list box b ng

Trang 77

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Hm tr v v tr c a m c c ch n, cn ng c l i n u khng c m c no c ch n th hm tr v m l i LB_ERR. Mu n xc nh chi u di c a m t chu i b t k c trong list box dng hm.

iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0); V i iIndex l v tr c a chu i c n xc Buffer, ta dng hm. nh chi u di. chp chu i trn vo vng p

iLength = SendMessage(hwndList, LB_GETTEXT, iInde, (LPARAM) Buffer); Gi tr tr v c a hai hm trn l chi u di c a chu i k t . Nn nh kch th c vng buffer sao cho ch a chi u di c a chu i c ng thm k t k t thc chu i c n ghi vo. Tuy nhin, i v i list box ch n kp th chng ta khng th dng cc ch th LB_SETCURSEL, LB_GETCURSEL, ho c LB_SELECTSTRING. Thay vo ph i dng ch th LB_SETSEL ch n m t m c m khng lm nh h ng n cc m c ch n khc. SendMessage(hwndList, LB_SETSEL, wParam, iIndex); Tham s wParam khc 0 Xc ch n v lm sng m c, b ng 0 h y vi c ch n.

nh tr ng thi c a m t m c no trong list box (lo i list box ch n kp) dng hm.

iSelect = SendMessage(hwndList, LB_GETSEL, iIndex, 0); Hm tr v gi tr khc 0 n u m c c v tr iIndex c ch n, v b ng 0 n u m c khng c ch n. v tr

3.6.4. Nh n cc thng i p t List Box


Khi dng chu t nh n vo list box, khi list box nh n focus nh p. C a s cha c th focus nh p n list box b ng hm. SetFocus (hwndList); Khi list box nh n focus nh p, chng ta dng con chu t, cc phm ch , phm Spacebar ch n cc m c trong list box. List box g i thng i p WM_COMMAND v i cc thng s wParam, lParam n c a s cha v i ngha : LOWORD (wParam) ID c a s con. HIWORD (wParam) M thng bo. t

Trang 78

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ lParam Handle c a s con.


M thng bo LBN_ERRSPACE LBN_SELCHANGE Gi tr ngha

-2 1 2 3 4 5

Con trol list box ch y qu khng gian Cho bi t m c ch n hi n hnh thay i

LBN_DBLCLK
LBN_SELCANCEL

Cho bi t m t m c b double click v i chu t Cho bi t ng i dng thay i m c ch n trong list box

LBN_SETFOCUS
LBN_KILLFOCUS

Cho bi t list box ang nh n c focus nh p Cho bi t list box m t focus nh p


B ng 3.3 Cc gi tr c a m thng bo

M thng bo LBN_ERRSPACE, LBN_SELCHANGE c g i ki u c a s list box bao g m LBS_NOTIFY.

n c a s cha khi

3.6.5. M t ng d ng List Box


Sau y l m t v d v list box, k t qu chng trnh sau khi ch y th hi n trong hnh 3.2. Trong v d ny, ta t o ra m t list box g m cc ph n t cam, chanh, nho . Khi dng chu t hay dng phm Spacebar c ng v i phm mi tn ch n cc m c trong list box, m c c ch n s c mu t th hi n c ch n l a (m c nh trong Windows l mu xanh) v n i dung m c ch n ny c hi n th ln ki u i u khi n tnh n m bn trn vng thao tc c a c a s chnh. Chng trnh minh h a nh sau (v d 3.2).

Hnh 3.2

ng d ng minh h a l p List Box

Trang 79

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ *LISTBOX.CPP (trch d n)


#include <windows.h> #define ID_LIST 1 #define ID_TEXT 2 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void FillListBox (HWND hwndList) { int i; static TCHAR *tc[]={TEXT("cam"), TEXT("quyt"), TEXT("buoi"), TEXT("tao"), TEXT("chanh"), TEXT("xoai"), TEXT("nho")}; for(i=0; i<7; i++) SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)tc[i]); } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndList, hwndText ; int iIndex, iLength, cxChar, cyChar ; TCHAR *pVarName; switch (message) { case WM_CREATE : cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; // T o m t listbox

Trang 80

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
hwndList = CreateWindow ( TEXT("listbox"), NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY | LBS_STANDARD, cxChar, cyChar * 3, cxChar * 16 + GetSystemMetrics (SM_CXVSCROLL), cyChar * 5, hwnd, (HMENU) ID_LIST, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL ) ; // t o m t control "static" hwndText = CreateWindow ( TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, cxChar, cyChar, GetSystemMetrics (SM_CXSCREEN), cyChar, hwnd, (HMENU) ID_TEXT, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL) ; FillListBox (hwndList) ; return 0 ; case WM_SETFOCUS : // SetFocus (hwndList) ; return 0 ; //x l cc thng i p khi ch n m c trong list box case WM_COMMAND : if (LOWORD (wParam) == ID_LIST && HIWORD (wParam) == LBN_SELCHANGE) { // l y ch v tr c a m c c ch n iIndex=SendMessage(hwndList,LB_GETCURSEL, 0, 0); iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) + 1 ; pVarName =(char*) calloc (iLength, sizeof (TCHAR)) ; SendMessage ( hwndList, LB_GETTEXT, iIndex, (LPARAM)pVarName) ; SetWindowText (hwndText, pVarName) ; free (pVarName) ; } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; t focus nh p cho list box

Trang 81

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }

Khi dng chu t hay bn phm ch n m c trong list box, th list box g i thng i p WM_COMMAND cho th t c WndProc c a c a s cha x l. Khi th t c WndProc nh n c thng i p WM_COMMAND, n ki m tra word th p c a tham s wParam c b ng nh danh c a list box ( v d trn l ID_LIST) khng v word cao c a tham s wParam(m thng bo) c b ng LBN_SELCHANGE khng. N u b ng, n l y ch s c a m c c ch n thng qua hm: SendMessage (hwndList, LB_GETCURSEL, 0, 0) ; V ti p t c l y n i dung c a m c c ch n thng qua hm. SendMessage ( hwndList, LB_GETTEXT, iIndex, (LPARAM) pVarName); Sau cng, hi n th m c c ch n ln control tnh thng qua hm. SetWindowText (hwndText, pVarName);

3.7. L P COMBO BOX


Cng gi ng nh List box, Combo box cng l t p h p cc chu i k t c gi g n trong m t hnh ch nh t. M t chng trnh c th thm ho c xa cc chu i trong Combo box b ng cch g i cc thng i p n th t c window c a Combo box. Combo box control g i thng i p WM_COMMAND n c a s cha khi c m t m c trong Combo box c nh d u. C a s cha xc nh n m c c nh d u trong Combox box. Trong Combox box ch cho php ch n m t m c trong danh sch cc m c c trong Combo box.

3.7.1. S khc v gi ng nhau gi a Combo Box v List Box


Cc thao tc trn list box v combo box l hon ton gi ng nhau, ch khc nhau hnh th c th hi n. List box hi n th cc m c khi chng c c p nh t, cn combo box ch hi n th cc m c khi ta nh p chu t vo n. Khi t o ki u i u khi n combo box v i hm CreateWindow ph i s d ng l p c a s "combobox" cng v i ki u c a s l WS_CHILD. List box c th cho php ch n nhi u m c cng lc, cn combo box th ch cho php ch n m t m c m thi. Trang 82

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Khng gi ng nh list box, combo box c hai ph n. Ph n d i l danh sch cc m c c thm vo combo box, ph n trn l m t edit control dng hi n th m c ch n hi n hnh.

3.7.2. Thm, xa m t chu i trnCombo Box


thm m t chu i vo combo box dng hm SendMessage v i thng i p CB_ADDSTRING: SendMessage (hWnd, CB_ADDSTRING, 0, (LPARAM) szString); hWnd l handle c a Combo box control, szString l chu i c n thm vo. H n ch chi u di c a chu i c n thm vo b ng thng i p CB_LIMITTEXT. SendMessage (hWnd, CB_LIMITTEXT, (WPARAM)length, 0). length l chi u di c a chu i c n thm vo khng k k t k t thc chu i. chn m t chu i vo Combo box t i v tr xc nh, ta dng thng i p CB_INSERTSTRING. SendMessage (hWnd, CB_INSERTSTRING, iIndex, (LPARAM) szString). iIndex l v tr c n chn chu i vo Combo box. ta dng thng i p CB_RESETCONTENT. xa t t c cc m c trong Combo box,

SendMessage (hWnd, CB_RESETCONTENT, 0, 0). Tng t , ta c th xa m t m c trong Combo box b ng thng i p CB_DELETESTRING. SendMessage (hWnd, CB_DELETESTRING, iIndex, 0);

3.7.3. Ch n v l y m c trn Combo box


m s m c c trong Combo box b ng thng i p CB_GETCOUNT. iCount = SendMessage (hWnd, CB_GETCOUNT, 0, 0). Hm trn tr v s m c c trong Combo box. Thng th ng ta ch n m c t Combo box. Tuy nhin, ta cng c th ch n m c b ng thng i p CB_SETCURSEL. SendMessage (hWnd, CB_SETCURSEL, (WPARAM) iIndex, 0). V i iIndex l v tr c n ch n, n u gi tr ny b ng 1 th Windows lo i b vi c ch n v i t t c cc m c trong Combo box. Trang 83 i

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Khi nh n thng i p WM_COMMAND t Combo box, chng ta c th xc nh m c c ch n c v tr th m y trong Combo box (v tr b t u l 0) b ng cch dng thng i p CB_GETCURSEL. iIndex = SendMessage (hWnd, CB_GETCURSEL, 0, 0); iIndex l v tr c a m c c ch n. N u khng c m c no c ch n th hm trn s tr v m l i CB_ERR (gi tr b ng 1). xc nh chi u di iLength c a m t chu i c trong Combo box, ta dng thng i p CB_GETLBTEXTLEN. iLength=SendMessage (hwnd, CB_GETLBTEXTLEN, iIndex, 0); Hm tr v chi u di chu i v i iIndex l v tr c a chu i c n l y chi u di. N u mu n l y n i dung c a m c no , ta s d ng thng i p CB_GETLBTEXT. SendMessage ( hWnd, CB_GETLBTEXT, iIndex, (LPARAM)szString); iIndex l v tr chu i c n l y, szString dng ch a chu i l y c.

3.7.4. M t ng d ng Combo box


minh h a cch cch s d ng Combo box cng v i cc th t c x l thng i p trong Combo box chng ta cng nhau kh o st v d sau (v d 3.3). K t qu th c hi n chng trnh.

Hnh 3.3

ng d ng minh h a l p Combo Box

*COMBOBOX.CPP ( trch d n)

Trang 84

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
void FillCombo (HWND hwndCombo) { int i; static TCHAR *tc[ ] = {TEXT("MAI XUAN HUNG"), TEXT("LE HOAN VU"), TEXT("LE LU NHA"), TEXT("PHAM THANH PHONG"), TEXT("LE LUC"), TEXT("NGUYEN TIEN"), TEXT("DINH QUYEN")}; for(i=0; i<7; i++) SendMessage(hwndCombo,CB_ADDSTRING,0,(LPARAM)tc[i]); } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndCombo, hwndText ; int iIndex, iLength, cxChar, cyChar ; TCHAR *pVarName; switch (message) { case WM_CREATE : cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; hwndCombo = CreateWindow (TEXT ("combobox"), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, cxChar, cyChar * 3, cxChar * 20 + GetSystemMetrics (SM_CXVSCROLL), cyChar * 10, hwnd, (HMENU)ID_COMBO, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL) ; hwndText = CreateWindow (TEXT ("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, cxChar, cyChar, GetSystemMetrics (SM_CXSCREEN), cyChar, hwnd, (HMENU) ID_TEXT, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL) ; FillListBox (hwndCombo) ; return 0 ; case WM_SETFOCUS :

Trang 85

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
SetFocus (hwndCombo) ; return 0 ; case WM_COMMAND : if (LOWORD(wParam) == ID_COMBO && HIWORD(wParam) == LBN_SELCHANGE) { iIndex=SendMessage(hwndCombo,CB_GETCURSEL,0,0); iLength=SendMessage(hwndCombo,CB_GETLBTEXTLEN,iIndex, 0)+1; pVarName =(char*) calloc (iLength, sizeof (TCHAR)) ; SendMessage(hwndCombo, CB_GETLBTEXT, iIndex, (LPARAM)pVarName) ; SetWindowText (hwndText, pVarName) ; free (pVarName) ; } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }

3.8. L P SCROLL BAR


Trong cc chng tr c thanh cu n c a s c t o ra b ng cch s d ng hai thng s WS_VSCROLL hay WS_HSCROLL, thanh cu n c t o ra trong tr ng h p ny n m bn d i ho c bn ph i vng client. By gi t o l p m t control thanh cu n m ki u i u khi n thanh cu n ny xu t hi n b t c ni no trong vng thao tc. B ng cch s d ng l p "scrollbar" cng v i hai ki u thanh cu n nh ngha s n SBS_VERT v SBS_HORZ. Khng gi ng nh cc ki u control i u ki n c p trn, cc control thanh cu n y khng g i thng i p WM_COMMAND, m l i g i thng i p WS_VSCROLL v WS_ Trang 86

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ HSCROLL cho c a s cha. C th phn bi t c thanh cu n c a s v ki u i u khi n thanh cu n thng qua tham s lParam. Tham s ny s b ng 0 n u nh thanh cu n ny l thanh cu n c a s , cn tham s ny s b ng handle c a c a s thanh cu n n u nh thanh cu n l m t ki u i u khi n. Cn tham s wPram th gi ng nhau cho c hai lo i thanh cu n c a s v ki u i u khi n thanh cu n. B n c th t o m t ki u i u khi n thanh cu n v i chi u di v chi u r ng ty . N u b n mu n t o m t ki u i u khi n thanh cu n c kch th c b ng kch th c c a thanh cu n c a s . Th dng hai hm sau l y ch u cao v chi u r ng c a thanh cu n c a s . GetsystemMetrics (SM_CYHCROLL) ; GetsystemMetrics (SM_CXVCROLL) ; Tng t nh thanh cu n c a s chng ta c th thanh cu n hm. t vng v v tr cho ki u i u khi n

SetScrollRange (hwndScroll, SB_CTL, iMin, iMax, bRedraw) ; hwnScroll l handle c a control thanh cu n. Tham s SB_CTL l m t trong hai ki u SBS_VERT tng ng v i thanh cu n ngang v SBS_HORZ tng ng v i thanh cu n ng. Theo m c nh th thanh cu n n m trong vng c gi tr t 0 n 100 n v chi u di, tuy nhin c th t l i vng thanh cu n thng qua hai tham s iMin tng ng v i ch n d i c a vng v iMax tng ng v i ch n trn c a vng. Tham s nRedraw mang m t trong hai gi tr TRUE ho c FALSE, n u mu n Windows v l i thanh cu n d a trn vng m i th ph i t gi tr ny b ng TRUE, cn ng c l i th t gi tr ny b ng FALSE. Dng hm sau t l i v tr con ch y trn thanh cu n.

SetScrollPos (hwndScroll, SB_CTL, iPos, bRedraw); V i iPos l v tr c n t con ch y trn vng control thanh cu n.

3.8.1. Giao di n bn phm

i v i thanh cu n

C th dng bn phm di chuy n con ch y trn vng control thanh cu n khi thanh cu n nh n c focus nh p. Sau y l cc phm di chuy n cng v i cc ch c nng c a n trn control thanh cu n.
Cc phm di chuy n Gi tr wParam c a thng i p thanh cu n

Home End

SB_TOP SB_BOTTOM

Trang 87

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam SB_PAGEUP SB_PAGEDOWN SB_LINEUP SB_LINEDOWN

____________________________________________________________________________________ Page Up Page Down Left hay Up Right hay Down

B ng 3.4 Cc gi tr wParam c a thng i p thanh cu n

t focus nh p cho cc thanh cu n b ng hm. SetFocus (hwndScroll); V i hwnScroll l handle c a control thanh cu n. Mu n t focus cho m t thanh cu n no khi kh i ng chng trnh th ph i t focus ny khi x l thng i p WM_SETFOCUS trong th t c WndProc. V l do, thanh cu n ch quan tm n cc phm di chuy n, n khng quan tm n phm Tab. i u ny lm cho vi c s d ng phm Tab di chuy n focus nh p t thanh cu n ny n thanh cu n khc g p nhi u kh khn. Tuy nhin gi i quy t v n ny ta nguyn c u cc k thu t sau. Nh n a ch th t c window c a cc control thanh cu n b ng hm GetWindowLong v i nh danh GWL_ID. B n c th t th t c Windows cho thanh cu n b ng hm SetWindowLong v i nh danh GWL_WNDPROC. Trong v d sau y, hm SetWindownLong t th t c window cho thanh cu n m i v tr v a ch th t c window thanh cu n c . hm x l thanh cu n ScrollProc trong v d sau nh n t t c cc thng i p g i n th t c window thanh cu n. Hm ny ch n gi n thay i focus nh p gi a cc thanh cu n khi b m phm Tab hay Shift-Tab, b ng cch g i window thanh cu n c thng qua hm CallWindowProc.

3.8.2. T mu cc thanh cu n v cc static text


Mu c a cc thanh cu n c th c hi n b ng cch x l cc thng i p WM_CTLCOLORSCROLLBAR. Trong v d sau hm WinProc ta nh ngha m t m ng g m c 3 ph n t m i ph n t l m t handle ch i t (brush) cho m t thanh cu n.
static HBRUSH hBrush[3];

Cc ch i t trn c t o ra b ng hm CreateSolidBrush trong th t c x l thng i p WM_CREATE . Trang 88

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
for (i = 0; i < 3; i++) { hBrush [i] = CreateSolidBrush (color [i]); }

Trong color ch a cc gi tr mu s c p RGB (Red, Green, Blue). M t trong 3 ch i t (brush) c tr v khi x l thng i p WM_CTLCOLORCROLLBAR trong th t c WinProc b ng o n chng trnh sau.
case WM_CTLCOLORCROLLBAR: i = GetWindowLong (HWND) lParam, GWL_ID) : return (LRESULT) hBrush [i];

Ch : Cc ch i t ph i c h y b tr c khi k t thc chng trnh thng qua hm DeleteOject khi x l thng i p WM_DESTROY trong th t c x l WinProc.
for (i = 0; i < 3; i++) DeleteObject (hBrush [i]);

Cc static text c t mu tng t nh cc thanh cu n, b ng cch x l thng i p WM_CTLCOLORSTATIC trong th t c WinProc thng qua hm SetTextColor. Dng hm SetBkColor t mu n n ch , trong v d sau th mu n n ch trng v i mu h th ng COLOR_BTNHIGHLIGHT. i v i cc Static text tnh ta ch p d ng mu n n ch cho hnh ch nh t n m sau m i k t ch khng ph i ton b chi u r ng c a c a s control. th c hi n i u ny, trong th t c WndProc hm x l WM_CTLCOLORSTATIC ph i tr v m t handle cho m t ch i t (brush) c a mu COLOR_BTNHIGHLIGHT. Cc ch i t ny c t o ra khi x l thng i p WM_CREATE v ph i c h y khi x l thng i p WM_DESTROY.

3.8.3. T mu n n c a s
Trong v d d i y t o ra c a s v m t ch i t mu en cho vng thao tc cho c a s ny. Wndclass.hbrBackground = CreateSolidBrush (0) ; Khi thay i vi c ch n trn cc thanh cu n th chng trnh t o ra m t ch i t (brush) m i v chn handle c a ch i t m i ny vo c a s trn. Nh n hay t handle c a ch i t (brush) b ng hm GetClassWord v hm SetClassWord. C th t o m t ch i t (brush) m i v chn handle c a ch i t ny vo c u trc c a c a s , sau xa ch i t (brush) c. Trang 89

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ DeleteObject ( (HBRUSH)SetClassLong( hwnd, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB (icolor[0], icolor[1], icolor[2])))) ; Windows s dng ch i t m i ny t vng thao tc cho l n t k ti p. Dng hm sau xa 2/3 bn ph i c a vng thao tc tr c khi v l i vng ny. InvalidateRect (hwnd, &icolor, TRUE) ; Hm InvalidateRect lm cho window t thng i p WM_PAINT vo trong h ng i cc thng i p c a th t c x l window. M thng i p WM_PAINT c u tin th p hn cc thng i p x l bn phm hay chu t nn n c x l sau. N u mu n vng c a s c c p nh t l i mu ngay sau khi di chuy n con ch y trn thanh cu n th dng hm. UpdateWindow (hwnd) ; Tuy nhin n u chng ta dng hm ny th lm cho t c phm ch m l i. x l thng i p chu t v bn

Hm WndProc khng x l thng i p WM_PAINT m a cho hm DefWindowProc. Nh chng ta bi t windows x l m c nh thng i p WM_PAINT ch n gi n l l i g i hm BeginPaint v EndPaint. Nhng trn chng ta ch nh InvalidateRect l ph n n n c n ph i xa, chnh i u ny hm BeginPaint s khi n cho Windows t ng pht sinh thng i p xa n n WM_ERASEBKGND. Ch : ph i d n d p cc ch i t tr c khi chng trnh k t thc b ng hm DeleteOject trong khi x l thng i p WM_DESTROY.

Hnh 3.4

ng d ng minh h a l p Scroll Bar

3.8.4. M t ng d ng c a thanh cu n

Trang 90

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Hnh 3.4 minh h a m t ng d ng v thanh cu n (Scroll Bar). Trong v d ny, ta s d ng 3 thanh cu n v 6 static text. B ng cch dng chu t hay bn phm, ta di chuy n con tr t trn thanh cu n thay i gi tr mu. Mu thay i tng ng s l mu t c a vng client bn c nh. Ba stactic text d i m i thanh cu n dng ghi nh n gi tr mu thay i tng ng v i cc thanh cu n. *SCROLLBAR.CPP (trch d n)
int idFocus ; WNDPROC OldScroll[3] ; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static COLORREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0), RGB (0, 0, 255) }; static HBRUSH hBrush[3], hBrushStatic; static HWND hwndScroll[3], hwndLabel[3], hwndValue[3], hwndRect; static int color[3], cyChar ; static RECT rcColor ; static TCHAR *szColorLabel[] = { TEXT("Red"), TEXT("Green"), TEXT("Blue") } ; HINSTANCE hInstance ; int i, cxClient, cyClient ; TCHAR szBuffer[10] ; switch (message) { case WM_CREATE : hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ; hwndRect = CreateWindow (TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_WHITERECT, 0, 0, 0, 0, hwnd, (HMENU) 9, hInstance, NULL) ;

Trang 91

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
for (i = 0 ; i < 3 ; i++) { hwndScroll[i] = CreateWindow (TEXT ("scrollbar"), NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT, 0, 0, 0, 0, hwnd, (HMENU) i, hInstance, NULL) ; SetScrollRange(hwndScroll[i], SB_CTL, 0, 255, FALSE); SetScrollPos (hwndScroll[i], SB_CTL, 0, FALSE) ; hwndLabel[i] = CreateWindow ( TEXT("static"), szColorLabel[i], WS_CHILD|WS_VISIBLE|SS_CENTER, 0, 0, 0, 0, hwnd, (HMENU) (i + 3), hInstance, NULL) ; hwndValue [i] = CreateWindow (TEXT ("static"), TEXT ("0"), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 0, 0, 0, hwnd, (HMENU) (i + 6), hInstance, NULL) ; OldScroll[i] = (WNDPROC) SetWindowLong ( hwndScroll[i], GWL_WNDPROC, (LONG) ScrollProc) ; hBrush[i] = CreateSolidBrush (crPrim[i]) ; } hBrushStatic = CreateSolidBrush ( GetSysColor (COLOR_BTNHIGHLIGHT)) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; return 0 ; case WM_SIZE : cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; SetRect (&rcColor, 0, 0, cxClient/1.5, cyClient) ; MoveWindow (hwndRect, cxClient/1.5, 0, cxClient/2, cyClient, TRUE) ; for (i = 0 ; i < 3 ; i++) { MoveWindow (hwndScroll[i], ((int)(1.2 * i + 1) * cxClient) / 13 + (int)cxClient/1.5, 2*cyChar, cxClient / 17, cyClient - 4 * cyChar, TRUE) ; MoveWindow (hwndLabel[i], (2.3 * i + 1) * cxClient / 28+ cxClient/1.5, cyChar / 2, cxClient / 8, cyChar, TRUE) ;

Trang 92

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
MoveWindow (hwndValue[i], (2.3 * i + 1) * cxClient / 28+ cxClient/1.5, cyClient - 3 * cyChar / 2, cxClient / 8, cyChar, TRUE) ; } SetFocus (hwnd) ; return 0 ; case WM_SETFOCUS : SetFocus (hwndScroll[idFocus]) ; return 0 ; case WM_VSCROLL : i = GetWindowLong ((HWND) lParam, GWL_ID) ; switch (LOWORD (wParam)) { case SB_PAGEDOWN : color[i] += 15 ; case SB_LINEDOWN : color[i] = min (255, color[i] + 1) ; break; case SB_PAGEUP : color[i] -= 15 ; case SB_LINEUP : color[i] = max (0, color[i] - 1) ; break; case SB_TOP : color[i] = 0 ; break ;

Trang 93

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
case SB_BOTTOM : color[i] = 255 ; break ; case SB_THUMBPOSITION : case SB_THUMBTRACK : color[i] = HIWORD (wParam) ; break ; default : break ; } SetScrollPos (hwndScroll[i], SB_CTL, color[i], TRUE) ; wsprintf (szBuffer, TEXT ("%i"), color[i]) ; SetWindowText (hwndValue[i], szBuffer) ; DeleteObject ( (HBRUSH)SetClassLong( hwnd, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush ( RGB( color[0], color[1], color[2] ) ) ) ) ; InvalidateRect (hwnd, &rcColor, TRUE) ; return 0 ; case WM_CTLCOLORSCROLLBAR : i = GetWindowLong ((HWND) lParam, GWL_ID) ; return (LRESULT) hBrush[i] ; case WM_CTLCOLORSTATIC : i = GetWindowLong ((HWND) lParam, GWL_ID) ; if (i >= 3 && i <= 8) { SetTextColor ((HDC) wParam, crPrim[i % 3]) ;

Trang 94

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
SetBkColor ( (HDC) wParam, GetSysColor ( COLOR_BTNHIGHLIGHT ) ); return (LRESULT) hBrushStatic ; } break ; case WM_SYSCOLORCHANGE : DeleteObject (hBrushStatic) ; hBrushStatic = CreateSolidBrush ( GetSysColor (COLOR_BTNHIGHLIGHT)) ; return 0 ; case WM_DESTROY : DeleteObject ((HBRUSH) SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) GetStockObject (WHITE_BRUSH))) ; for (i = 0 ; i < 3 ; i++) DeleteObject (hBrush[i]) ; DeleteObject (hBrushStatic) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int id = GetWindowLong (hwnd, GWL_ID) ; switch (message) { case WM_KEYDOWN :

Trang 95

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
if (wParam == VK_TAB) SetFocus (GetDlgItem (GetParent (hwnd), (id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ; break ; case WM_SETFOCUS : idFocus = id ; break ; } return CallWindowProc(OldScroll[id],hwnd,message,wParam,lParam); }

Trang 96

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Chng 4 X L BN PHM, THI T B CHU T, V B TH I GIAN


4.1. M U

NH

Cc chng tr c trnh by cc thnh ph n i u khi n chung v h p tho i. Trong cc thnh ph n ny, vi c giao ti p v i ng i dng c cc h p tho i hay cc i u khi n x l, th ng khng c n quan tm l m vi c giao ti p v i cc thi t b . Tuy nhin, l p trnh trn Windows cng c n ph i hi u vi c x l cc thi t b nh p nh bn phm v thi t b chu t. M t s ng d ng nh h a hay thao tc vn b n t nhi u cng ph i vi t cc x l lin quan t i bn phm v thi t b chu t. Trong chng ny, hai ph n u s trnh by cch ng i l p trnh s d ng bn phm v thi t b chu t xy d ng m t ng d ng trn Windows. Th c ch t c a vi c x l bn phm hay thi t b chu t cng n gi n, v v i c ch thng i p c a Windows th ta ch c n tm hi u cc thng i p c pht sinh t bn phm hay t thi t b chu t vi t cc x l tng ng v i t ng thi t b . Ph n cu i c a chng trnh by m t thnh ph n cng khng km quan tr ng l b nh th i gian. Windows cung c p c ch ny truy n thng v i ng d ng theo nh k. V i c ch ny, ng d ng ch c n khai bo m t b nh th i gian v i m t kho ng th i gian cho tr c. V khi ng d ng ho t ng th h th ng s truy n m t tn hi u cho ng d ng theo t ng kho ng th i gian nh k c khai bo. Tm l i vi c tm hi u bn phm, thi t b chu t, v b nh th i gian s em l i s hi u bi t su s c v thnh ph n nh p li u cn b n c a m t ng d ng trn Windows.

4.2. BN PHM
Trong mi tr ng tng tc ho ngy nay c hai thnh ph n nh p li u khng th thi u l bn phm (keyboard) v thi t b chu t (mouse). Tuy m t s ng d ng khng ti n l i khi dng bn phm, nh cc chng trnh tr chi (game), hay cc m ph ng h a v i thi t b nh v l thi t b chu t ch ng h n, nhng bn phm v n l thi t b khng th thay th c a m t my tnh. Bn phm h tr nh p li u r t phong ph : m t chng trnh so n th o vn b n th khng th thi u vi c nh p d li u t bn phm. N u my tnh b h thi t b chu t b ta v n c th th c thi cc tc v c a ng d ng m t cch bnh th ng. Trong ph n ny chng ta s tm hi u cc thng i p c pht sinh t bn phm v cch can thi p x l chng.

4.2.1. N n t ng c s v bn phm
Trang 97

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Windows nh n v x l thng tin nh n c t bn phm, qua hnh th c cc thng i p v g i cho ng d ng. Trong ng d ng Windows cc thng i p s c h i u hnh chuy n cho hm x l c a s WndProc c a ng d ng. Windows cung c p 8 lo i thng i p khc nhau phn bi t cc tnh hu ng c a cc phm c g. Tuy nhin khng ph i lc no chng ta cng ph i x l ton b cc thng i p , thng th ng th ch c n x l m t n a cc thng i p c pht sinh t bn phm, v cc thng i p cn l i s c Windows x l m c nh. V d , trong Windows c th b qua khi nh n phm Ctrl, Alt, Shift cng v i cc phm khc, n u khng mu n ch n x l ring cho ng d ng. Trong tr ng h p n u chng ta mu n ch n x l ring cho mnh, ch ng h n t o phm nng (hotkey) ph i ch trnh dng trng h p v i cc phm nng m Windows cung c p. V khi theo quy n u tin, ng d ng c a chng ta s x l thng i p v s lm cho h th ng khng ho t ng nh bnh th ng. Thnh ph n giao ti p chung nh h p tho i (dialog) cng c nhi u giao ti p v i bn phm, nhng chng ta khng c n quan tm n vi c giao ti p v i bn phm khi h p tho i c kch ho t. X l bn phm trong h p tho i th ng c giao cho Windows x l. Cc i u khi n c dng trong h p tho i nh h p nh p li u (edit box), h p l a ch n (check box), hay cc nt nh n (button)... i u c kh nng t x l phm g vo v ch tr l i thng bo c a cc phm g cho c a s cha (parent window). Tuy v y, v i m t s cc i u khi n nh t nh theo ng d ng ta c th ph i x l cc thng i p tng c ng thm s c m nh c a thnh ph n i u khi n ny. Tm l i trong cc ng d ng c c u thnh t cc thnh ph n i u khi n c b n ny th chng ta khng quan tm n vi c x l cc thng i p t bn phm.

4.2.2. Khi ni m focus trong cc ng d ng trong mi tr ng Windows


Windows a ra khi ni m s quan tm (focus) cho cc ng d ng c ch y ng th i trong m t th i i m. V ch c m t bn phm, nn Windows ph i qu n l v phn ph i cc thng i p c g vo cho cc ng d ng. Thng th ng, c cc tr ng h p trn Windows l : m t trong s cc ng d ng ang ch y c kch ho t (active) hay khng c ng d ng no ch y. Khi c m t chng trnh ng d ng c kch ho t th Windows xem nh ng d ng nh n c s quan tm.Trong m t ng d ng c nhi u cc c a s , m i th i i m ch m t c a s nh n c s quan tm. Theo c ch ny, Windows cung c p m t d ng g i l hng i thng i p. M i thng i p s c a vo hng i x l thng i p v c Windows phn ph i n cc ng d ng tng ng. Hm DispatchMessage trong vng l p x l thng i p s ch u trch nhi m chuy n thng i p n th t c x l c a s WndProc c a cc c a s tng ng. M t c a s c th xc nh c tr ng thi quan tm c a mnh b ng cch ch n cc thng i p WM_SETFOCUS, WM_KILLFOCUS trong hm x l WndProc. Thng i p WM_SETFOCUS s cho c a s bi t c th i i m nh n c quan tm c a Windows v

Trang 98

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ ng c l i WM_KILLFOCUS s thng bo cho c a s bi t c m t s quan tm t Windows. Ph n sau s gi i thi u k hn v x l thng i p.

4.2.3. C ch hng

i v qu n l hng

Trong Windows khi ng i dng nh n v nh phm trn bn phm, th thng qua trnh i u khi n thi t b bn phm (keyboard driver) s di n d ch m qut (scan code) c a ph n c ng sang hnh th c thng i p. Tr c h t Windows s t m th i lu tr thng i p ny vo hng i thng i p c a h th ng (system message queue). Hng i thng i p h th ng c a Windows l m t hng i duy nh t v qu n l cc thao tc ti n x l thng tin nh p t bn phm v chu t. Windows s l n l t l y cc thng i p trong hng i x l v s g i n hng i c a ng d ng khi ng d ng x l xong thng i p bn phm v thi t b chu t tr c .

Hnh 4.1 Qu trnh x l bn phm

L do m Windows ph i chia thnh hai giai o n trong qu trnh nh n v g i thng i p t bn phm n hng i c a ng d ng l do vi c ng b ha v i m i ti n trnh. N u Windows khng qu n l hng i h th ng th r t kh ng b cc ti n trnh c a cc ng d ng. V d , khi m t c a s nh n c s quan tm v chu n b x l cc thng i p. Ng i dng c th g phm nhanh trong khi thng i p tr c v n cha x l xong. Gi s ng i dng mu n chuy n qua ng d ng khc v nh n Alt-Tab, khi thng i p bn phm m i ny s c a vo hng i c a h th ng v phn pht cho ng d ng kia ch khng ph i a vo hng i c a ng d ng. V i tnh nng ng b ha c a Windows th cc thng i p t bn phm m b o c chuy n giao ng cho cc c a s tng ng.

4.2.4. X l thng i p t bn phm


4.2.4.1. Thng i p t thao tc nh n v nh c a m t phm Thao tc cn b n c a nh p li u t bn phm l thao tc nh n v nh m t phm. Khi thao tc nh n m t phm trn bn phm c th c hi n th Windows s pht sinh thng i p WM_KEYDOWN hay WM_SYSKEYDOWN v a vo hng i thng i p c a ng d ng hay c a s nh n c s quan tm (focus). Cng tng t , khi ta nh phm th thng i p WM_KEYUP hay WM_SYSKEYUP s c h i u hnh phn pht t i hng i . Khi th c hi n thao tc nh p t bn phm th vi c nh n (down) v nh (up) ph i i i v i nhau. Tuy nhin, n u chng ta nh n m t phm v gi lun th Windows s pht sinh hng lo t cc thng i p WM_KEYDOWN hay WM_SYSKEYDOWN, nhng v i thao tc nh th ch pht sinh m t thng i p WM_KEYUP hay WM_SYSKEYUP. Cc thng i p ny s c g i tu n t n cc hm WndProc c a cc c s nh n c s quan tm c a Windows. Ngoi ra chng ta c th bi t c th i i m m thng i p phm c g vo lc no b ng cch dng hm GetMessageTime.

Trang 99

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Nh chng ta th y trong dng trn m t thao tc nh n hay th th c hai d ng thng i p khc nhau nh WM_KEYDOWN v WM_SYSKEYDOWN c a thao tc nh n, v tng t i v i thao tc nh . Thng i p c ti p u ng l "SYS" th ng c pht sinh khi ng i dng nh n cc phm g h th ng. Khi ng i dng nh n phm Alt k t h p v i phm khc th th ng pht sinh thng i p WM_SYSKEYDOWN v WM_SYSKEYUP. i v i t h p cc phm Alt, ch c nng th ng l g i m t m c ch n trn trnh n menu c a ng d ng hay trnh n h th ng system menu v ngoi ra dng chuy n i cc tc v gi a nhi u ng d ng khc nhau (phm Alt+Tab hay Alt+Esc), v ng c a s ng d ng khi k t h p v i phm ch c nng F4. Khi xy d ng m t chng trnh ng d ng, th ng t quan tm n cc thng i p WM_SYSKEYDOWN v thng i p WM_SYSKEYUP. Chng ta ch c n dng hm DefWindowProc cu i m i hm WndProc c a c a s nh n thng i p. Windows s ch u trch nhi m x l cc thng i p d ng h th ng ny, n u c nh ng tc v c bi t th chng ta c th ch n cc thng i p ny x l. Tuy nhin ta khng nn lm nh v y v khi chng trnh c a chng ta s ch y khng bnh th ng nh cc ng d ng khc. Khng ph i chng ta giao ph hon ton cho Windows x l cc thng i p h th ng c a ng d ng, m Windows s x l cc thng i p h th ng ny v a ra cc thng i p bnh th ng khc n ng d ng. V d khi nh n phm Alt+Tab th Windows s t o m t thng i p h th ng g i vo hng i c a ng d ng v khi khng x l thng i p ny th theo m c nh hm DefWindowProc s x l v tr v thng i p WM_KILLFOCUS cho ng d ng, khi ng d ng c a chng ta s d dng x l hn. Tm l i thng i p WM_KEYDOWN v WM_KEYUP th ng c sinh ra b i cc phm nh n thng th ng khng k t h p v i phm Alt. N u chng trnh c a chng ta b qua khng x l cc thng i p ny th Windows cng khng t o ra cc thng i p hay x l g c bi t. 4.2.4.2. Cc thng i p pht sinh t bn phm Sau y l b ng m t cc thng i p pht sinh t bn phm (theo th t Alphabet). Thng i p WM_ACTIVATE Nguyn nhn pht sinh Thng i p ny cng c g i n cc c a s b kch ho t v c a s khng b kch ho t. N u cc c a s ny cng m t hng i nh p li u, cc thng i p ny s c truy n m t cch ng b , u tin th t c Windows c a c a s trn cng b m t kch ho t, sau n th t c c a c a s trn cng c kch ho t. N u cc c a s ny khng n m trong cng m t hng i th thng i p s c g i m t cch khng ng b , do c a s s c kch ho t ngay l p t c. Thng bo n c a s r ng ng i dng t o m t s

WM_APPCOMMAND

Trang 100

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ ki n l nh ng d ng, v d khi ng i dng kch vo button s d ng chu t hay nh vo m t k t kch ho t m t l nh c a ng d ng. WM_CHAR Thng i p ny c g i t i c a s c s quan tm khi thng i p WM_KEYDOWN c d ch t hm TranslateMessage. Thng i p WM_CHAR c ch a m k t c a phm c nh n. Thng i p ny c g i t i c a s c s quan tm khi thng i p WM_KEYUP c x l t hm TranslateMessage. Thng i p ny xc nh n m k t khi m t phm dead key c nh n. Phm dead key l phm k t h p t o ra k t ngn ng khng c trong ti ng anh (xu t hi n trong bn phm h tr ngn ng khc ti ng Anh). ng d ng g i thng i p ny xc nh m t phm nng lin quan n m t c a s . g i thng i p ny th dng hm SendMessage. Thng i p ny c g i khi ng i dng nh n m t phm nng c ng k trong RegisterHotKey. Thng i p ny c g i cho c a s nh n c s quan tm khi ng i dng nh n m t phm trn bn phm. Phm ny khng ph i phm h th ng (Phm khng c nh n phm Alt). Thng i p ny c g i cho c a s nh n c s quan tm khi ng i dng nh m t phm c nh n tr c .Phm ny khng ph i phm h th ng (Phm khng c nh n phm Alt). Thng i p ny c g i t i c a s quan tm tr c khi n m t quy n ny. ang nh n c s

WM_DEADCHAR

WM_GETHOTKEY

WM_HOTKEY WM_KEYDOWN

WM_KEYUP WM_KILLFOCUS WM_SETFOCUS WM_SETHOTKEY

Thng i p ny c g i t i c a s sau khi c a s nh n c s quan tm c a Windows ng d ng s g i thng i p ny n c a s lin quan n phm nng, khi ng i dng nh n m t phm nng th c a s tng ng lin quan t i phm nng ny s c kch ho t. Thng i p ny s c g i t i c a s nh n c s quan tm khi hm TranslateMesage x l xong thng i p WM_SYSKEYDOWN. Thng i p WM_SYSCHAR ch a m c a phm h th ng. Phm h th ng l phm c ch a phm Alt v

WM_SYSCHAR

Trang 101

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ t h p phm khc. WM_SYSDEADCHAR Thng i p ny c g i t i c a s nh n c s quan tm khi m t thng i p WM_SYSKEYDOWN c bin d ch trong hm TranslateMessage. Thng i p ny xc nh n m k t c a phm h th ng deadkey c nh n. Thng i p ny c g i t i c a s nh n c s quan tm khi ng i dng nh n phm F10 hay nh n Alt tr c khi nh n phm khc. Thng i p ny cng c g i khi khng c c a s no nh n c s quan tm v lc ny th c a s nh n c l c a s ang c kch ho t (Active). Thng i p ny c g i t i c a s nh n c s quan tm khi ng i dng nh n m t phm m tr c gi phm Alt. Cng tng t n u khng c c a s no nh n c s quan tm th thng i p ny s c g i cho c a s ang c kch ho t.
B ng 4.1 M t thng i p pht sinh t bn phm

WM_SYSKEYDOWN

WM_SYSKEYUP

4.2.4.3 M phm o (Virtual key code) Windows cung c p khi ni m phm o nh m tch r i v i thi t b bn phm hay ni cch khc l ti n t i c l p thi t b v i bn phm. Khi m t phm c nh n th ph n c ng v t l pht sinh ra m t m qut (scan code), trn bn phm tng thch IBM cc phm c gn v i cc m v d phm W l 17, phm E l 18, v phm R l 19... Cch s p x p ny thu n ty d a trn v tr v t l c a phm trn bn phm. Nh ng ng i xy d ng nn Windows nh n th y r ng n u dng tr c ti p m qut th s khng thch h p khi b l thu c vo bn phm hi n t i v tng lai. Do h c x l bn phm b ng cch c l p thi t b hn, b ng cch t o ra m t b ng nh ngha t p gi tr phm t ng qut m sau ny c g i l m phm o. M t s gi tr bn phm o m ta khng th y xu t hi n trn bn phm IBM tng thch nhng c th tm th y chng trong bn phm c a cc nh s n xu t khc hay chng c dnh cho bn phm trong tng lai. Cc gi tr c a phm o ny c nh ngha trong t p tin tiu WINUSER.H v c b t u v i cc ti p u ng VK_xxxxx. sau y l b ng m t cc phm o thng d ng trong Windows giao ti p v i bn phm IBM tng thch.
Th p phn Th p l c phn H ng phm nh ngha trong WINUSER.H Windows dng Bn phm IBM tng thch

1 2

01 02

VK_LBUTTON VK_RBUTTON

Nt chu t tri Nt chu t ph i

Trang 102

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam X Ctrl Break Nt chu t gi a

____________________________________________________________________________________ 3 4 03 04 VK_CANCEL VK_MBUTTON


B ng 4.2 M t cc phm o

Cc thng i p trn ch c nh n khi dng chu t, ta khng bao gi nh n c thng i p trn n u g t bn phm. Khng nn dng phm CtrlBreak trong ng d ng Windows, phm ny th ng c ng t cc ng d ng trong DOS. Nh ng gi tr phm o ti p sai dnh cho cc phm Backspace, Tab, Enter, Escape, v Spacebar c dng nhi u trong chng trnh Windows.

Th p phn

Th p l c phn

H ng phm nh ngha trong WINUSER.H

Windows dng

Bn phm IBM tng thch

8 9 12 13 16 17 18 19 20 27 32

08 09 0C 0D 10 11 12 13 14 1B 20

VK_BACK VK_TAB VK_CLEAR VK_RETURN VK_SHIFT VK_CONTROL VK_MENU VK_PAUSE VK_CAPITAL VK_ESCAPE VK_SPACE

X X X X X X X X X X X

Backspace Tab Phm s 5 trong NumPad v i n Numlock t t. Enter (cho hai phm) Shift (cho hai phm) Ctrl (cho hai phm) Alt (cho hai phm) Pause Caps Lock Esc Spacebar

B ng 4.3 M t cc phm o

B ng m t phm o ti p sau y l cc phm th ng c s d ng nhi u trong Windows.

Trang 103

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam


Windows dng Bn phm IBM tng thch

____________________________________________________________________________________
Th p phn Th p l c phn H ng phm nh ngha trong WINUSER.H

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F

VK_PRIOR VK_NEXT VK_END VK_HOME VK_LEFT VK_UP VK_RIGHT VK_DOWN VK_SELECT VK_PRINT VK_EXECUTE VK_SNAPHOT VK_INSERT VK_DELETE VK_HELP

X X X X X X X X

Page Up Page Down End Home Phm tri Phm mi tn ln Phm ph i Phm xu ng Print Screen

X X

Insert Delete

B ng 4.4 M t cc phm o (ti p theo)

M t s cc phm o nh VK_SELECT, VK_PRINT, VK_EXECUTE, hay VK_HELP th ng ch xu t hi n trong cc bn phm gi l p m chng ta t khi nhn th y. Ti p sau l m phm o c a cc phm s v phm ch trn bn phm chnh. Trong bn phm b sung phm Num Pad c qui nh ring.
Th p phn Th p l c phn H ng phm nh ngha trong WINUSER.H Windows dng Bn phm IBM tng thch

48-57

30-39

Khng

T phm 0 n phm 9 trn bn phm chnh

Trang 104

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam X T phm A n phm Z.

____________________________________________________________________________________ 65-90 41-5A Khng

B ng 4.5 M t cc phm ch v s trn bn phm chnh

M phm o trong b ng trn b ng v i m ASCII c a k t m phm th hi n. Trong cc ng d ng Windows th ng khng dng m phm o ny m thay vo ng d ng ch x l thng i p k t dnh cho k t c m ASCII. Cu i cng l m phm o c a bn phm m r ng Num Pad (bn ph i c a bn phm) v cc phm ch c nng (F1, F2, F3...).
Th p phn Th p l c phn H ng phm nh ngha trong WINUSER.H Windows dng Bn phm IBM tng thch

96-105 106 107 108 109 110 111 112121 122135 144 145

60-69 6A 6B 6C 6D 6E 6F 70-79 7A-87 90 91

VK_NUMPAD0 n VK_NUMPAD9 VK_MULTIPLY VK_ADD VK_SEPARATOR VK_SUBTRACT VK_DECIMAL VK_DIVIDE VK_F1 VK_F11 n VK_F10 n VK_F24 X

Phm 0 9 khi n Num Lock c b t Phm * Phm +

Phm Phm . Phm / Phm F1 Phm F11 n F10 n F24

VK_NUMLOCK VK_SCROLL
B ng 4.6 M t cc phm b sung

Num Lock Scroll Lock

M t s cc phm o nh F13- F24 th c Windows t o ra phng h cho cc bn phm sau ny. Th ng th ng d ng Windows ch dng phm F1 F10 m thi. 4.2.4.4. Cc tham s wParam v lPram trong thng i p pht sinh t bn phm Trang 105

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Trong thng i p phm g (WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, v WM_SYSKEYUP) th tham s wParam s nh n gi tr m phm o. Cn tham s lParam s ch a thng tin chi ti t v phm c g vo. B ng sau m t cc thng tin ch a trong 32 bit c a tham s lParam.
Bit nh n d ng N i dung

0-15

Ch a s l n c a phm c nh n xu ng. N u chng ta ch nh n r i nh ra th gi tr ny b ng 1, n u chng ta gi lun phm th s l p ny s tng theo. Ch a m qut OEM (Original Equipment Manufacturer) c pht sinh t ph n c ng, ta h u nh khng quan tm n thng tin ny C ny c gi tr 1 khi phm c nh n l phm thu c nhm phm m r ng trn bn phm IBM tng thch hay phm Alt, Ctrl bn ph i bn phm c nh n. Windows t quan tm n gi tr c a c ny M ng c nh c a phm (Context code), n u c ny c gi tr b ng 1 th phm Alt c nh n, i u ny tng ng v i thng i p WM_SYSKEYDOWN hay WM_SYSKEYUP c pht sinh Tr ng thi c a phm tr c , tr ng ny b ng 0 cho bi t phm tr c tr ng thi nh , v 1 n u phm tr c tr ng thi nh n. Tr ng thi d ch chuy n c a phm, c ny b ng 0 n u phm ang c nh n, v b ng 1 n u phm c nh n.
B ng 4.7 M t thng tin ch a trong tham s lParam

16-23

24

29

30

31

4.2.5. o n chng trnh minh h a o n chng trnh d i y minh h a m t chng trnh nh nh p cc k t t bn phm v xu t ra mn hnh.
#define BUFSIZE 65535; #define SHIFTED 0x8000;

Trang 106

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { HDC hdc; // Thi t b ng c nh TEXTMETRIC tm; // C u trc metric c a vn b n static DWORD dwCharX; // B ngang c a k t static DWORD dwCharY; // Chi u di c a k t static DWORD dwClientX; // B ngang c a vng lm vi c static DWORD dwClientY; // Chi u di c a vng lm vi c static DWORD dwLineLen; // Chi u di c a m t dng static DWORD dwLines; // S dng vn b n trong vng lm vi c static int nCaretPosX = 0; // T a static int nCaretPosY = 0; // T a x c a caret y c a caret

static int nCharWidth = 0; // B dy c a k t static int cch = 0; // S k t trong buffer static int nCurChar = 0; // Ch n k t hi n th i trong buffer

static PTCHAR pchInputBuf; // K t t m a vo buffer int i, j; // Bi n l p int cCR = 0; // S k t xu ng dng int nCRIndex = 0; // Ch n k t xu ng dng cu i cng

int nVirtKey; // M phm o TCHAR szBuf [128]; // Buffer t m TCHAR ch; // K t PAINTSTRUCT ps; // Dng cho hm BeginPaint RECT rc; // Hnh ch nh t trong hm DrawText

Trang 107

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
SIZE sz; // Kch th c c a chu i COLORREF crPrevText; // Mu c a vn b n COLORREF crPrevBk; // Mu n n switch ( message ) { case WM_CREATE: /* L y thng tin font hi n th i */ hdc = GetDC ( hWnd ); GetTextMetrics ( hdc, &tm ); ReleaseDC ( hWnd, hdc ); dwCharX = tm.tmAveCharWidth; dwCharY = tm.tmHeight; /* C p pht b nh m lu k t nh p vo */

pchInputBuf = (LPTSTR)GlobalAlloc( GPTR,BUFSIZE * sizeof ( TCHAR ) ); return 0; case WM_SIZE: /* Lu gi kch th c c a vng lm vi c */ dwClientX = LOWORD ( lParam ); dwClientY = HIWORD ( lParam ); /* Tnh kch th c t i a c a m t dng v s dng t i a trong vng lm vi c */ dwLineLen = dwClientX - dwCharX; dwLines = dwClientY / dwCharY; break; case WM_SETFOCUS:

Trang 108

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
/* T o v hi n th caret khi c a s nh n c s quan tm */ CreateCaret ( hWnd, ( HBITMAP ) 1, 0, dwCharY ); SetCaretPos ( nCaretPosX, nCaretPosY * dwCharY ); ShowCaret ( hWnd ); break; case WM_KILLFOCUS: /* n caret v h y khi c a s khng cn nh n c s quan tm */ HideCaret ( hWnd ); DestroyCaret ( ); break; case WM_CHAR: switch ( wParam ) { case 0x08: // Backspace case 0x0A: // Linefeed case 0x1B: // Escape MessageBeep( ( UINT ) 1 ); return 0; case 0x09: // tab /* Chuy n phm tab thnh 4 k t tr ng lin t c nhau */ for ( i = 0; i < 4; i ++ ) SendMessage (hWnd, WM_CHAR, 0x20, 0); return 0; case 0x0D: // Xu ng dng /* Lu k t xu ng dng v t o dng m i a caret

Trang 109

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
xu ng v tr m i */ pchInputBuf [ cch++ ] = 0x0D; nCaretPosX = 0; nCaretPosY += 1; break; default: // X l nh ng k t c th hi n th ch = ( TCHAR ) wParam; HideCaret ( hWnd ); /* L y b dy c a k t v xu t ra */ hdc = GetDC ( hWnd ); GetCharWidth32 ( hdc, (UINT) wParam, (UINT)wParam, &nCharWidth ); TextOut(hdc, nCaretPosX, nCaretPosY*dwCharY, &ch, 1); ReleaseDC ( hWnd, hdc ); /* Lu k t vo buffer */ pchInputBuf [ cch++ ] = ch; /* Tnh l i v tr ngang c a caret. N u v tr ny t i cu i dng th chn thm k t xu ng dng v di chuy n n dng m i */ nCaretPosX += nCharWidth; if ( ( DWORD ) nCaretPosX > dwLineLen ) { nCaretPosX = 0; pchInputBuf [ cch++ ] = 0x0D; ++nCaretPosY; } c

caret

Trang 110

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
nCurChar = cch; ShowCaret ( hWnd ); break; } SetCaretPos ( nCaretPosX, nCaretPosY * dwCharY ); break; case WM_KEYDOWN: switch ( wParam ) { case VK_LEFT: // LEFT arrow /* Caret di chuy n qua tri v ch if ( nCaretPosX > 0 ) { HideCaret ( hWnd ); /* Tnh ton l i v tr c a caret khi qua tri */ ch = pchInputBuf [--nCurChar ]; hdc = GetDC ( hWnd ); GetCharWidth32 ( hdc, ch, ch, &nCharWidth ); ReleaseDC ( hWnd, hdc ); nCaretPosX=max(nCaretPosX-nCharWidth,0 ); ShowCaret ( hWnd ); } break; case VK_RIGHT: // RIGHT arrow /* Di chuy n caret sang ph i */ n u dng */

Trang 111

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
if (nCurChar < cch) { HideCaret ( hWnd ); /* Tnh ton l i v tr c a caret khi sang ph i */ ch = pchInputBuf [ nCurChar ]; if ( ch == 0x0D ) { nCaretPosX = 0; nCaretPosY++; } /* N u k t khng ph i l enter th ki m tra xem phm shift c c nh n hay khng. N u c nh n th mu v xu t ra mn hnh. */ else { hdc = GetDC ( hWnd ); nVirtKey = GetKeyState ( VK_SHIFT ); if ( nVirtKey & SHIFTED ) { crPrevText=SetTextColor( hdc,RGB (255, 255, 255) ); crPrevBk= SetBkColor(hdc,RGB(0,0,0)); TextOut(hdc,nCaretPosX,nCaretPosY*dwCharY, &ch,1 ); SetTextColor ( hdc, crPrevText ); SetBkColor ( hdc, crPrevBk ); } i

Trang 112

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
GetCharWidth32(hdc,ch,ch,&nCharWidth); ReleaseDC ( hWnd, hdc ); nCaretPosX = nCaretPosX + nCharWidth; } nCurChar++; ShowCaret ( hWnd ); break; } break; case VK_UP: // Phm mi tn ln case VK_DOWN: // Phm mi tn xu ng MessageBeep ( (UINT) 1 ); return 0; case VK_HOME: // Phm home /* Thi t l p v tr c a caret dng u tin */

nCaretPosX = nCaretPosY = 0; nCurChar = 0; break; case VK_END: // Phm end /* Di chuy n v cu i vn b n v lu v tr c a k t xu ng dng cu i */ for ( i=0; i < cch; i++ ) { if ( pchInputBuf [ i ] == 0x0D ) { cCR++;

Trang 113

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
nCRIndex = i + 1; } } nCaretPosY = cCR; /* Chp t t c cc k t t k t xu ng dng cu i */ for ( i = nCRIndex, j = 0; i < cch; i++, j++ ) szBuf [ j ] = pchInputBuf [ i ]; szBuf [ j ] = TEXT ( '\0' ); /* Tnh v tr d c c a caret */ hdc = GetDC ( hWnd ); GetTextExtentPoint32(hdc,szBuf, lstrlen(szBuf), &sz ); nCaretPosX = sz.cx; ReleaseDC ( hWnd, hdc ); nCurChar = cch; break; default: break; } SetCaretPos( nCaretPosX, nCaretPosY*dwCharY ); break; case WM_PAINT: if ( cch == 0 ) break; hdc = BeginPaint ( hWnd, &ps ); n k t hi n th i v a nh p t bn phm vo b nh m.

Trang 114

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
HideCaret ( hWnd ); SetRect ( &rc, 0, 0, dwLineLen, dwClientY ); DrawText ( hdc, pchInputBuf, -1, &rc, DT_LEFT ); ShowCaret ( hWnd ); EndPaint ( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage ( 0 ); /* Gi i phng buffer */ GlobalFree ( ( HGLOBAL) pchInputBuf ); UnregisterHotKey ( hWnd, 0xAAAA ); break; default: return DefWindowProc ( hWnd, message, wParam, lParam ); } return NULL; }

4.3. THI T B CHU T


Trong m t mi tr ng giao ti p h a, vi c s d ng thi t b nh v chu t l h t s c c n thi t. Nh thi t b chu t ta c th di chuy n n m t i m b t k trn khung mn hnh v th c hi n thao tc kch cc nt chu t. i v i m t s ng d ng h a khng qu ph c t p th cng c th c hi n ch y u l chu t, ring i v i cc ng d ng i h i s ph c t p khi v th ng i ta dng bt v . V i Windows th thi t b chu t l m t thnh ph n quan tr ng, n u chng ta b thi t b chu t th v n kh i ng bnh th ng v cc chng trnh v n c th ch y c. Tuy nhin khi ta s lng tng nhi u khi x l cc ng d ng tr c quan tng tc v i ng i dng theo t a hay nh v .

Trang 115

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Cng tng t nh bn phm, thi t b chu t cng c dng nh p d li u t ng i dng vo ng d ng nhng d li u y khng ph i l vn b n nh khi nh p t bn phm m l cc thao tc v hay x l cc i t ng h a.

4.3.1. C b n v thi t b chu t trong Windows


V c b n Windows h tr cc lo i thi t b chu t c m t nt, hai v ba nt, ngoi ra Windows cn c th dng thi t b khc nh joystick hay bt v b t ch c thi t b chu t. Cc ng d ng trong Windows th ng n vi c dng cc nt th hai v nt th ba, c th s d ng t t trn cc thi t b chu t ch c m t nt. Thng th ng nt th hai c a thi t b chu t ph i c dng cho ch c nng g i th c n ng c nh (context menu). Theo nguyn t c, ta c th ki m tra xem c t n t i thi t b chu t hay khng b ng cch dng hm GetSystemMetrics. fMouse = GetSystemMetrics( SM_MOUSEPRESENT ); Gi tr tr v fMouse l TRUE (1) n u c thi t b chu t c ci FALSE (0) n u thi t b chu t khng c ci t vo my. sau: nButton = GetSystemMetrics( SM_CMOUSEBUTTONS ); Gi tr tr v l 0 n u khng ci v l 2 n u cha ci t thi t b chu t. t thi t b chu t, tuy nhin d i Windows 98 gi tr tr t, v ng c l i b ng

Ta cng c th ki m tra s nt c a thi t b chu t b ng cch dng hm trn theo cu l nh

Khi ng i dng di chuy n thi t b chu t th Windows cng di chuy n m t nh bitmap nh trn mn hnh, nh ny c g i l con tr chu t (mouse cursor). Con tr chu t ny c m t i m g i l i m nng (hot spot) , i m nng ny n m trong hnh bitmap, v do ng i t o con tr chu t quy t nh. Khi chng ta tham chi u t i m t v tr c a con tr chu t th chnh l chng ta ang dng t a c a i m nng ny. Windows h tr m t s cc con tr chu t chu n, m ng i l p trnh ch c n g i ra v dng ch khng c n ph i t o cc t p tin *.cur. tr ng thi bnh th ng th m t ng d ng trong Windows th ng dng con tr chu t IDC_ARROW c nh ngha trong WINUSER.H, i m nng chnh l i m trn cng c a mi tn. Ngoi ra con tr chu t cn cho bi t tr ng thi c a ng d ng, v d m t ng d ng ang x l c n m t kho ng th i gian th con tr chu t xu t hi n hnh ng h ct (IDC_WAIT). Khi h u nh cc ch c nng giao ti p v i ng i dng i u ph i hon n khi x l hon thnh. Trong l p c a s ta c tr ng nh ngha con tr chu t cho ng d ng nh sau

wndclass.hCursor = LoadCursor ( NULL, IDC_ARROR); Trang 116

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ V i thi t b chu t ta c th c cc hnh ng nh sau: Kch chu t : nh n v th m t nt chu t. Kch p chu t : nh n v th chu t nhanh (nh n 2 l n nhanh). Ko : di chuy n chu t trong khi v n n m gi m t nt.

4.3.2. X l cc thng i p t thi t b chu t


Cc thng i p c t o t chu t r t khc v i thng i p c a bn phm, m t th t c c a s s nh n thng i p chu t b t c khi no thi t b chu t di chuy n qua c a s hay kch vo trong c a s , th m ch c trong tr ng h p c a s khng c kch ho t hay khng nh n c s quan tm. Windows nh ngha 21 thng i p c pht sinh t thi t b chu t. Trong s c n 11 thng i p khng lin quan n vng lm vi c (client area). Nh ng thng i p khng ph i vng lm vi c (nonclient-area messages) th ng c cc ng d ng b qua khng x l. 4.3.2.1. Thng i p chu t trong vng lm vi c Khi con tr chu t di chuy n vo vng lm vi c c a m t c a s , th t c c a s c a n s nh n c thng i p WM_MOUSEMOVE. B ng sau m t cc thao tc lm vi c v i thi t b chu t v cc thng i p pht sinh t n. Nt Tri Gi a Ph i Nh n WM_LBUTTONDOWN Th WM_LBUTTONUP Nh n p WM_LBUTTONDBLCLK WM_MBUTTONDBLCLK WM_RBUTTONDBLCLK

WM_MBUTTONDOWN WM_MBUTTONUP WM_RBUTTONDOWN WM_MBUTTONUP

B ng 4.8 M t thng i p kch thi t b chu t

Th t c c a s c a ng d ng s nh n c thng i p c a nt chu t gi a n u my tnh ci thi t b chu t c 3 nt. Tng t nh v y v i thng i p thi t b chu t ph i, chng ta c n c thi t b chu t dng 2 nt. nh n c thng i p kch p thi t b chu t th t c c a s ph i khai bo nh n thng i p ny. Wndclass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; Trong thng i p pht sinh t thi t b chu t th tham s lParam s ch a v tr c a thi t b chu t, 16 byte th p s ch a gi tr t a x, cn 16 byte cao s ch a gi tr t a c a y. l y ra hai gi tr ny ta c th dng macro l LOWORD v HIWORD.

Trang 117

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Gi tr wParam s cho bi t tr ng thi c a nt nh n, phm Shift, v phm Ctrl. Chng ta c th ki m tra cc tr ng thi ny b ng cch dng bit m t n c nh ngha tr c trong WINUSER.H. Cc m t n ny c b t u b ng ti n t MK_xxx (Mouse Key)

MK_LBUTTON MK_MBUTTON MK_RBUTTON MK_SHIFT MK_CONTROL

Nt chu t tri nh n Nt chu t gi a nh n Nt chu t ph i nh n Phm Shift c nh n Phm Ctrl c nh n

B ng 4.9 M t tr ng thi c a chu t v phm nh n

V d khi nh n c thng i p WM_LBUTTONDOWN chng ta mu n ki m tra xem phm Ctrl c c nh n hay khng b ng cch so gi tr wParam v i m t n MK_CONTROL.
... if (wParam & MK_CONTROL) { /* C gi phm control */ } else { /* Khng gi phm control */ }

Nh chng ta bi t khi di chuy n thi t b chu t qua vng lm vi c th thng i p WM_MOUSEMOVE s c g i n cho th t c c a s . Nhng Windows khng pht sinh thng i p ny cho t ng pixel trn mn hnh m tu thu c vo thng s ph n c ng c a thi t b chu t c ci t v t c lm vi c c a n. Khi chng ta kch nt chu t tri vo vng lm vi c c a m t c a s khng kch ho t (inactive window) th Windows s kch ho t c a s ny t c l c a s v a c kch sau Trang 118

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ truy n thng i p WM_LBUTTONDOWN vo th t c WndProc c a c a s . Khi m t c a s nh n c thng i p WM_XXXDOWN th khng nh t thi t ph i nh n c thng i p WM_XXXUP hay ng c l i. i u ny c gi i thch nh sau, khi ng i dng kch tri vo m t c a s v gi lun nt chu t v a kch r i ko thi t b chu t n m t vng thu c ph m vi c a c a s khc m i th . Khi c a s u tin s nh n c thng i p nh n chu t WM_LBUTTONDOWN v c a s th hai s nh n c thng i p nh thi t b chu t WM_LBUTTONUP. Tuy nhin tnh hu ng trn s khng xu t hi n v i hai tr ng h p ngo i l sau : Th t c WndProc c a m t c a s ang th c hi n vi c b t gi thi t b chu t (mouse capture), i v i tnh tr ng ny th c a s ti p t c nh n c thng i p chu t cho d con tr chu t c di chuy n ra ngoi vng lm vi c c a c a s . Ki u ny th ng xu t hi n trong cc ng d ng v hay thao tc i t ng h a, v d khi ta v m t ng th ng di v ko ra ngoi vng lm vi c c a c a s , th khi c a s v s b t gi to c a thi t b chu t t o ng th ng v c th cho thanh cu n cu n theo. N u xu t hi n h p thng tin tr ng thi (model) c a h th ng, th khng c chng trnh no khc nh n c thng i p c a thi t b chu t. H p tho i tr ng thi h th ng v h p tho i tr ng thi c a ng d ng ngn c n vi c chuy n qua c a s khc trong m t ng khi n cha gi i quy t xong hay v n cn tr ng thi kch ho t (active). 4.3.2.2. Thng i p c a thi t b chu t ngoi vng lm vi c V i cc thng i p c a thi t b chu t v a tm hi u trong ph n tr c u c pht sinh khi thi t b chu t n m trong vng lm vi c c a c a s . Khi di chuy n con tr chu t ra kh i vng lm vi c c a c a s nhng v n trong ph m vi c a c a s th khi cc thng i p c a thi t b chu t s c pht sinh d ng thng i p c a thi t b chu t ngoi vng lm vi c (nonclient-area). Ngoi vng lm vi c c a m t c a s l c a s thanh tiu , th c n, v thanh cu n c a c a s . Ni chung v i cc thng i p c a thi t b chu t pht sinh t ngoi vng lm vi c th chng ta khng quan tm l m, thay vo ta giao ph cho hm m c nh x l l DefWindowProc th c hi n. i u ny cng gi ng nh l thng i p bn phm h th ng m ta tm hi u trong cc ph n tr c. Cng tng t nh thng i p xu t pht t vng lm vi c, cc thng i p ngoi vng lm vi c c nh ngha v i t NC vo sau d u "_", ta c b ng m t cc thng i p pht sinh t ngoi vng lm vi c nh sau.
Nt Tri Gi a Ph i Nh n
WM_NCLBUTTONDOWN WM_NCMBUTTONDOWN WM_RBUTTONDOWN

Th
WM_NCLBUTTONUP WM_NCMBUTTONUP WM_NCRBUTTONDOWN

Nh n p
WM_NCLBUTTONDBLCLK WM_NCMBUTTONDBLCLK WM_NCRBUTTONDBLCLK

Trang 119

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
B ng 4.10 M t cc thng i p chu t ngoi vng lm vi c

Cc tham s lParam v wParam cng hi khc so v i cc thng i p thi t b chu t pht sinh trong vng lm vi c. V i tham s lParam c a thng i p pht sinh t ngoi vng lm vi c s ch ra v tr ngoi vng lm vi c ni m thi t b chu t di chuy n hay ko t i. V tr ny c nh danh b i cc gi tr nh ngha trong WINUSER.H c b t u v i HT (vi t t t cho hittest).

Hnh 4.2 Minh h a t a

mn hnh v t a

vng lm vi c

Tham s lParam s ch a t a x 16 byte th p v t a y 16 byte cao. Tuy nhin, y l t a mn hnh, khng ph i l t a vng lm vi c gi ng nh thng i p pht sinh t vng lm vi c. Do chng ta ph i chuy n v t a vng lm vi c x l ti p n u c n. t a chuy n t t a mn hnh sang t a lm vi c hay ng c l i t t a mn hnh ta dng hai hm tng ng c Windows cung c p nh sau : ScreenToClient( hwnd, &pt ); ClientToScreen( hwnd, &pt ); pt l bi t c u trc POINT, hai hm trn s nh n tham chi u hm ta s c gi tr pt tng ng t a m i. n bi n pt do sau khi g i lm vi c sang

4.3.3 V d minh ho thi t b chu t

Trang 120

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ o n chng trnh th c hi n ch c nng v t do b ng cc thao tc: Nh n chu t tri v m t ng th ng t v tr con tr c a bt v n v tr chu t tri kch, ngoi ra ta cng c th v b ng cch nh n phm tri v gi lun sau ta ko chu t n v tr b t k r i th . N u ta nh n chu t ph i th s i mu c a bt v .
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; static POINT oldPoint; static int iC; int WIDTH_PEN = 2; HPEN oPen,pen; COLORREF Col [ ] ={ RGB (0, 0, 0) , RGB (255 ,0 ,0), RGB (0, 255, 0), RGB (0, 0, 255), RGB (255, 255, 0)}; POINT point; TCHAR str [255]; switch ( message ) // X l thng i p { case WM_LBUTTONDOWN: /* V ng th ng t v tr tr c n v tr chu t hi n t i*/

hdc = GetDC ( hWnd ); pen = CreatePen ( PS_SOLID,WIDTH_PEN,Col [ iC] ); oPen = ( HPEN ) SelectObject ( hdc,pen ); point.x = LOWORD ( lParam );

Trang 121

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
point.y = HIWORD ( lParam ); MoveToEx ( hdc, oldPoint.x, oldPoint.y, NULL ); LineTo ( hdc, point.x, point.y ); oldPoint = point; /* Ch n l i bt v tr c v h y bt v v a t o*/ SelectObject ( hdc, oPen ); DeleteObject ( pen ); ReleaseDC ( hWnd, hdc ); break; case WM_RBUTTONDOWN: /* Chuy n index c a b ng mu sang v tr ti p theo, n u cu i b ng mu th quay l i mu iC = ( iC+1 ) % ( sizeof ( Col ) / sizeof ( COLORREF ) ); break; case WM_MOUSEMOVE: /* Xu t to chu t hi n th i ln thanh tiu */ u tin*/

sprintf ( str,"Toa do chuot x = %d, To do y = %d", LOWORD(lParam), HIWORD(lParam)); SetWindowText ( hWnd, str ); /* Ki m tra xem c gi phm chu t tri hay khng*/ if ( wParam & MK_LBUTTON ) { hdc = GetDC ( hWnd ); pen = CreatePen ( PS_SOLID,WIDTH_PEN,Col [ iC ] ); oPen = ( HPEN ) SelectObject ( hdc, pen ); point.x = LOWORD ( lParam ); point.y = HIWORD ( lParam );

Trang 122

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
MoveToEx ( hdc, oldPoint.x, oldPoint.y, NULL ); LineTo ( hdc, point.x, point.y ); oldPoint = point; SelectObject ( hdc, oPen ); DeleteObject ( pen ); ReleaseDC ( hWnd, hdc ); } break; case WM_DESTROY: PostQuitMessage ( 0 ); break; default: return DefWindowProc ( hWnd, message, wParam, lParam ); } return 0; }

4.4. B

NH TH I GIAN

Nh chng ta bi t Windows cung c p cho ta cc thng tin thng qua d ng thng i p nh l thng i p bn phm, thng i p pht sinh t thi t b chu t . V ngoi ra th m t thng i p cng r t h u d ng l thng i p th i gian. Khi vi t m t chng trnh chng ta c th yu c u h i u hnh g i m t thng i p c nh bo theo t ng kho ng th i gian nh t nh chng ta c th lm m t s x l c n thi t. Thng i p ny c g i t h i u hnh n chng trnh thng qua m t b nh th i gian (Timer) v thng i p c pht sinh l WM_TIMER. Vi c dng ch c nng ny r t n gi n, ta khai bo m t b nh th i gian v thi t l p thng s kho ng th i gian Windows pht sinh thng i p Timer cho ng d ng. Khi ng d ng ch c n x l thng i p WM_TIMER trong hm x l c a s WinProc.

4.4.1. B

nh th i gian v v n

ng b

Trang 123

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Theo l thuy t thng i p th i gian do Windows cung c p l chnh xc n mili giy nhng th c t khng hon ton nh v y. S chnh xc cn ph thu c vo ng h c a h th ng v cc ho t ng hi n th i c a chng trnh. Nguyn nhn c a v n l thng i p th i gian WM_TIMER c u tin th p, nh thng i p t v l i mn hnh WM_PAINT, thng th ng chng ph i ch cho x l xong cc thng i p khc.

4.4.2. Kh i t o b

nh th i gian

Khng nh thng i p xu t pht t bn phm v chu t, c Windows g i t ng vo hng i thng i p c a ng d ng. i v i thng i p th i gian ph i c khai bo tr c b ng hm SetTimer, sau khi khai bo hm ny th Windows s g i thng i p WM_TIMER i u n vo hng i c a ng d ng. Hm SetTimer c khai bo nh sau : UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ); Trong ngha cc tham s c m t :

nh th i gian. hWnd : nh danh c a c a s khai bo dng b nIDEvent : nh danh c a b nh th i gian. nElapse : L kho ng th i gian ngh gi a hai l n g i thng i p lpTimerFunc : Hm s x l khi thng i p WM_TIMER pht sinh, n u chng ta khai bo l NULL th Windows s g i thng i p WM_TIMER vo hng i thng i p c a c a s tng ng. Khi khng cn dng b hm ny c khai bo : nh th i gian n a hay k t thc ng d ng ta g i hm KillTimer,

BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ); hWnd : nh danh c a c a s dng b nh th i gian uIDEvent : nh danh c a b nh th i gian.

4.4.3. V d v b

nh th i gian

4.4.3.1. Dng thng i p WM_TIMER o n chng trnh minh h a vi c s d ng b nh th i gian trong chng trnh. C m i 0.5 giy th chng trnh pht sinh t ng ng u nhin m t vng trn trn mn hnh.
#include <time.h>

Trang 124

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
#include "stdio.h" #define MAX_POINT 10000 #define IDT_TIMER1 1 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; static int NumCir = 0; static POINT point [ MAX_POINT ]; int r = 5, i; HPEN pen, oldPen; RECT rc; TCHAR str [255]; /* X l thng i p*/ switch ( message ) { case WM_CREATE: /* Khai bo dng b nh th i gian trong ng d ng*/

SetTimer(hWnd, IDT_TIMER1, 500, ( TIMERPROC )NULL); /* Kh i ng hm ng u nhin*/

srand ( (unsigned) time( NULL ) ); break; case WM_PAINT: hdc = BeginPaint ( hWnd, &ps );

Trang 125

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
pen = CreatePen ( PS_SOLID, 2, RGB (255,0,0) ); oldPen = (HPEN) SelectObject ( hdc, pen ); /* V cc vng trn v i tm l cc i m lu trong point v bn knh l r */ for( i=0; i < NumCir; i++ ) Arc ( hdc, point[i].x-r, point[i].y-r, point[i].x+r, point[i].y+r, point[i].x+r, point[i].y,point[i].x+r,point[i].y); /* L y l i bt v tr c v hy bt v v a t o*/ SelectObject ( hdc, oldPen ); DeleteObject ( pen ); EndPaint ( hWnd, &ps ); break; case WM_TIMER: /* L y thng tin c a vng lm vi c*/ GetClientRect ( hWnd, &rc ); /*Pht sinh ng u nhin m t vng trn*/ point [NumCir].x = rand( ) % (rc.right - rc.left); point [NumCir].y = rand( ) % (rc.bottom - rc.top); NumCir++; /*Hi n th s vng trn sinh ra trn thanh tiu sprintf ( str,"So vong tron : %d", NumCir); SetWindowText ( hWnd, str ); /* Lm b t h p l vng lm vi c & yu c u v l i */ InvalidateRect ( hWnd, &rc, FALSE); break; case WM_DESTROY: /* H y b s d ng b nh th i gian*/ */

Trang 126

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
KillTimer ( hWnd, IDT_TIMER1 ); PostQuitMessage ( 0 ); break; default: return DefWindowProc ( hWnd, message, wParam, lParam ); } return 0; }

4.4.3.2. Dng hm x l o n chng trnh sau cng khai bo s d ng m t b nh th i gian, nhng khai bo tr c ti p, t c l khi h t th i gian ch thay v truy n thng i p WM_TIMER th Windows g i hm TimerProc th c hi n. Chng trnh khi th c thi s xu t ra m t d ng :giy.
#include <time.h> #include "stdio.h" #define IDT_TIMER1 1 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; /* Khai bo bi n lu cc gi tr khng gian*/ struct tm *newtime; time_t CurTime; TCHAR str [255];

ng h

i n t theo d ng : gi : pht

Trang 127

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
RECT rc; /* Bi n LOGFONT LOGFONT lf; HFONT oldFont, font; COLORREF color = RGB (255, 0, 0), oldColor; switch ( message ) { case WM_CREATE: /* kh i t o b nh th i gian, v khai bo hm x l Timer*/ t o font m i*/

SetTimer ( hWnd, IDT_TIMER1, 1000, ( TIMERPROC ) TimerProc ); break; case WM_PAINT: hdc = BeginPaint ( hWnd, &ps ); /* L y gi ng h h th ng*/

time( &CurTime ); newtime = localtime ( &CurTime ); GetClientRect ( hWnd, &rc ); /* T o chu i xu t ra mn hnh*/ sprintf(str,"Gio hien tai : %d gio: %d phut: %d giay", newtime->tm_hour,newtime->tm_min, newtime>tm_sec); /* Thi t l p mu k t xu t*/ oldColor = SetTextColor ( hdc, color ); /* T o font ring dng*/

memset ( &lf, 0, sizeof ( LOGFONT ) ); lf.lfHeight = 50;

Trang 128

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
strcpy ( lf.lfFaceName, "Tahoma" ); font = CreateFontIndirect ( &lf ); oldFont = ( HFONT ) SelectObject ( hdc,font ); /* Xu t ra mn hnh*/ DrawText ( hdc, str, strlen(str), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE ); /* L y l i cc gi tr m c nh*/

SetTextColor ( hdc,oldColor ); SelectObject ( hdc,oldFont ); DeleteObject ( font ); EndPaint ( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage ( 0 ); break; default: return DefWindowProc ( hWnd, message, wParam, lParam ); } return 0; } /* Hm x l c a Timer*/ VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { /* Hm ny n gi n yu c u t l i vng lm vi c*/ RECT rc; GetClientRect ( hwnd, &rc );

Trang 129

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
InvalidateRect ( hwnd, &rc, TRUE ); }

Chng 5 X
5.1. M U

L VN B N V FONT CH

M t trong cc c tnh n i b t nh t c a Windows l giao di n giao ti p v i ng i dng. Nh c tnh ny, nhi u d ng d li u thng tin khc nhau c my tnh h tr khi xu t ra mn hnh, my in, Trong , xu t vn b n ra vng lm vi c c a cc ng d ng Win32 l hnh th c ph bi n nh t trong giao di n h a.

Trang 130

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ cc chng tr c, cc thao tc xu t thng tin ch c th c hi n thng qua cc c a s thng bo, h p tho i v cc ph n t i u khi n. Chng ny s trnh by cch th hi n n i dung vn b n trn vng lm vi c c a c a s thng qua cc hm Win32 API. Ph n cu i chng s trnh by cch kh i t o, ch n v x l cc d ng font ch khc nhau. Nh kh nng ny, vi c th hi n cc o n vn b n s tr nn sinh ng v tr c quan hn.

5.2. X

L VN B N

X l vn b n l cng vi c ph bi n nh t trong cc thao tc h a. Chng c s d ng theo cc nh d ng v cch th c khc nhau trong cc ng d ng x l ti li u, b ng bi u, c s d li u v h tr thi t k b ng my tnh (CAD - Computer Aided Design). T p h p cc hm Win32 API x l vn b n c phn thnh hai nhm chnh: Nhm cc hm nh d ng chu n b cho thao tc xu t d li u, v nhm cc hm th c hi n thao tc hi n th . Chng ta s b t u v i vi c tm hi u cc hm hi n th .

5.2.1. Hi n th vn b n
hi n th n i dung vn b n trn cc thi t b xu t, d a vo t ng tr ng h p th hi n khc nhau, ta dng cc hm Win32 API khc nhau. Cc hm ny ph thu c vo font ch , thu c tnh c a thi t b ng c nh DC (Device Context ) v kho ng cch k t th hi n. Hm ph bi n nh t th c hi n thao tc xu t m t chu i k t vn b n, s d ng font ch , mu ch v mu n n hi n hnh l : BOOL TextOut(HDC hDC, int nXStart, int nYStart, LPCTSTR lpString, int cbString); Hm ny th c hi n thao tc xu t chu i k t xc nh b i con tr lpString ra DC, v i chi u di c xc nh b i cbString (khng ph thu c vo k t NULL nh d u k t thc chu i). Hai tr ng nXStart v nYStart l v tr g c c a chu i hi n th , xc nh theo t a logic c a vng lm vi c c a s , v th ng l i m g c trn bn tri c a vng hi n th chu i. Chng ta s bn k hn khi tm hi u v canh l vn b n trong ph n 5.2.2. N u thao tc xu t chu i th c hi n thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v b ng 0. Khi c n trnh by vn b n theo tu n t t ng c t, ta dng hm TabbedTextOut sau : LONG TabbedTextOut(HDC hDC, int nX, int nY, LPCTSTR lpString, int nCount, int nNumTabs, LPINT lpnTabStopPositions, int nTabOrigin);

Trang 131

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ N u trong chu i k t c cc k t tab (\t ho c 0x09), hm TabbedTextOut s chuy n cc k t tab vo dy cc v tr "d ng" tng ng. S l ng cc tab d ng c xc nh b i nNumTabs, v lpnTabStopPositions l dy v tr cc tab d ng theo n v tnh pixels. V d , n u r ng trung bnh c a m i k t l 8 pixels, v m i tab d ng c n t cch nhau 5 k t , dy cc tab d ng s ph i l n l t c gi tr 40, 80, 120, . Tuy nhin, cc gi tr ny khng nh t thi t ph i l b i s c a nhau. N u bi n nNumTabs ho c lpnTabStopPositions c gi tr l 0 v NULL, cc tab d ng c t cch nhau t ng 8 k t . N u nNumTabs b ng 1, lpnTabStopPositions tr n gi tr xc nh m t dy tng tu n hon l b i s c a dy ny. V d , n u nNumTabs b ng 1, v lpnTabStopPositions b ng 30, ta s c dy tab d ng t i v tr 30, 60, 90, pixels. Tr ng nTabOrigin xc nh t a theo tr c x c a i m b t u tnh kho ng cch t i cc tab. Gi tr ny khng nh t thi t ph i l v tr u tin c a chu i, c th ch n trng ho c khng. Hm tr v kch th c chu i hi n th , theo n v logic, n u thnh cng. Ng c l i, hm tr v 0. Trong , chi u cao chu i l WORD cao c a bi n ki u LONG, chi u r ng l WORD th p. M t hm xu t vn b n khc tng t hm TextOut l hm ExtTextOut : BOOL ExtTextOut(HDC hDC, int X, int Y, UINT fuOptions, CONST RECT *lprc, LPCTSTR lpString, UINT cbCount, CONST INT *lpDx); Bi n lprc l m t con tr n c u trc RECT, trong n i dung vn b n hi n th s b c t vo vng hnh ch nh t tng ng n u fuOptions c thi t l p l ETO_CLIPPED, ho c l vng n n hnh ch nh t s c t b i mu n n n u fuOptions l ETO_OPAQUE. Tr ng lpDx l m t dy s nguyn xc nh kho ng cch gi a cc k t lin ti p trong chu i. N cho php m t chng trnh t o kho ng cch r ng ho c h p gi a cc k t , i u m i lc c n thi t trong vi c i u ch nh cc t trong vn b n theo r ng c t. Gi tr lpDx c th l NULL tng ng v i ch m c nh cho kho ng cch ny. Tng t hm TextOut, hm ExtTextOut tr v gi tr khc 0 n u thnh cng. Ng c l i, gi tr tr v b ng 0. M t hm m c m c cao hn xu t vn b n l hm DrawText :

int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat); Cng nh cc hm xu t vn b n khc, hm DrawText xu t chu i xc nh b i con tr lpString c di nCount. Tuy nhin, v i chu i c k t k t thc l NULL, n u nCount b ng -1, hm s t ng tnh ton chi u di c a chu i.

Trang 132

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Bi n lpRect tr n c u trc RECT c a hnh ch nh t (theo to logic) m trong vn b n th hi n theo nh d ng c thi t l p trong uFormat. N u uFormat b ng 0, n i dung vn b n s c hi n th theo t ng dng t trn xu ng d i. M i dng m i c xc nh thng qua k t v u dng CR (carriage return, b ng \r ho c 0x0D) ho c k t xu ng dng LF (linefeed, b ng \n ho c 0x0A) c trong vn b n. Ph n vn b n bn ngoi hnh ch nh t lpRect s b c t b . Gi tr uFormat b ng 0 cng chnh l gi tr c canh l tri (DT_LEFT). Ngoi ra, ta c th thi t l p cc c canh l ph i (DT_RIGHT), v canh l gi a (DT_CENTER) cho vn b n. lo i b ch c nng i u khi n c a cc k t CR v LF, c n thm vo c DT_SINGLELINE. N u thi t l p DT_SINGLELINE, ta cng c th ch nh v tr c a dng hi n th pha trn (DT_TOP), pha d i (DT_BOTTOM), ho c chnh gi a (DT_VCENTER) trong vng hnh ch nh t. Trong tr ng h p hi n th nhi u dng vn b n, Windows ch ng t dng khi g p k t CR v LF. ng t dng di hn kch th c hnh ch nh t hi n th , c n thi t l p c DT_WORDBREAK. N u khng mu n Windows c t b cc ph n d ra khi v ch v t qu ph m vi khung ch nh t, ta thm c DT_NOCLIP. N u mu n k t tab (\t ho c 0x09) c di n d ch thnh k t phn c t, c n thm c DT_EXPANDTABS. Gi tr m c nh c a tab l 8 kho ng tr ng. C DT_TABSTOP c dng t l i gi tr tab. Trong tr ng h p ny, byte cao c a word th p (bits 15-8) c a uFormat s ch a gi tr tab c n thay th .

5.2.2.
D a vo nhm lin quan

nh d ng vn b n
c trng cc thnh ph n hi n th , cc hm nh d ng vn b n phn lm ba n thu c tnh c a DC, r ng k t v kch th c chu i k t hi n th .

Vi c thi t l p thu c tnh nh d ng vn b n cho DC c th c hi n thng qua cc hm canh l vn b n, thi t l p kho ng cch k t , xc nh mu n n v mu vn b n. Cng v i cc hm ny, Windows cng cung c p cc hm cho bi t thu c tnh hi n hnh tng ng cho DC. Trong cc hm v thu c tnh DC, bi n hm thi t l p mu ch v mu n n : u tin lun l handle c a DC hi n hnh. Xt

COLORREF SetTextColor(HDC hDC, COLOREF crColor); COLORREF SetBkColor(HDC hDC, COLORREF crColor); Bi n crColor xc nh mu c n thi t l p. N u thnh cng, hm tr v mu ch (mu n n) tr c khi c thi t l p. N u khng, hm tr v gi tr c CLR_INVALID. Ngoi ra, xc nh mu ch v mu n n hi n hnh, ta dng hai hm sau : COLORREF GetTextColor(HDC hDC); Trang 133

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ COLORREF GetBkColor(HDC hDC); N u hm th c hi n thnh cng, ta xc l CLR_INVALID. nh c mu hi n hnh. N u khng, gi tr tr v

Khi v ch , Windows s d ng hai ch : ch trong su t (TRANSPARENT) v ch m (OPAQUE). ch trong su t, mu n n s khng c s d ng n, ch v ra ln n n hi n hnh. ch m , tr c khi v ch , n n s c xo i v i mu n n c thi t l p b i hm SetBkColor: int SetBkColor(HDC hDC, int iBkMode); n n TRANSPARENT ho c OPAQUE (ch m c nh c a V i iBkMode l ch Windows l OPAQUE). N u thnh cng, hm tr v ch n n tr c khi c thi t l p. Ng c l i, gi tr tr v l zero. bi t ch n n hi n t i, ta dng hm : int GetBkMode(HDC hDC); Hm tr v gi tr TRANSPARENT ho c OPAQUE, n u thnh cng. Ng c l i, gi tr tr v l zero. xc l p v tr chu i vn b n hi n th d a trn i m g c nXStart, nYStart (xem ph n 5.2.1) ta dng hm SetTextAlign : UINT SetTextAlign(HDC hDC, UINT fMode); Khi , i m g c nXStart c nh bn tri khung ch nh t n u fMode l TA_LEFT. K t u chu i s hi n th t i m g c ny. y cng l gi tr m c nh c a Windows. N u fMode b ng TA_RIGHT, v tr chu i c tnh t bn ph i, t c k t cu i chu i hi n th t i i m g c, v ng c l i cho n k t u tin. N u fMode b ng TA_CENTER, v tr gi a chu i chnh l i m g c. Tng t , thi t l p v tr hi n th chu i theo phng ng, cc c TA_TOP, TA_BOTTOM, v TA_BASELINE c dng tng ng i m g c nYStart trn, gi a v d i dng vn b n hi n th . i v i Windows th gi tr m c nh theo phng ng l TA_TOP. N u g i hm SetTextAlign v i c TA_UPDATE, Windows s khng s d ng i m g c nXStart, nYStart trong hm xu t vn b n TextOut, thay vo l v tr c thi t l p tr c b i hm MoveToEx ho c LineTo, ho c m t hm thay i v tr khc. C TA_UPDATE cng c p nh t i m g c v u chu i (n u dng TA_LEFT) v v cu i chu i (n u dng TA_RIGHT) cho l n g i k ti p. i u ny c n thi t cho vi c hi n th nhi u dng vn b n v i hm TextOut. N u c TA_CENTER c thi t l p, v tr c a nXStart v n nh c sau khi hm TextOut c g i. bi t ch canh l vn b n hi n t i, ta dng hm : Trang 134

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ UINT GetTextAlign(HDC hDC); N u thnh cng, hm tr v c tng ng c a canh l vn b n hi n hnh. Ng c l i, gi tr tr v l GDI_ERROR. V d sau y trnh by cch th c xc nh cc d ng canh l theo phng ngang:

switch ( (TA_LEFT | TA_RIGHT | TA_CENTER) & GetTextAlign(hDC) ) { case TA_LEFT: . . . case TA_RIGHT: . . . case TA_CENTER: . . . }

V d ti p theo s d ng hm SetTextAlign c p nh t v tr hi n th hi n th i khi hm TextOut c g i. Trong v d ny, bi n cArial l m t s nguyn cho bi t s font Arial.
UINT uAlignPrev; char szCount[8]; uAlignPrev = SetTextAlign(hdc, TA_UPDATECP); MoveToEx(hdc, 10, 50, (LPPOINT) NULL);

Trang 135

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
TextOut(hdc, 0, 0, "Number of Arial fonts: ", 23); itoa(cArial, szCount, 10); TextOut(hdc, 0, 0, (LPSTR) szCount, strlen(szCount)); SetTextAlign(hdc, uAlignPrev);

M t thu c tnh khc c a DC nh h ng n cch v chu i l kho ng cch gi a cc k t trong chu i hi n th . Kho ng cch m c nh c a Windows l 0, khi cc k t c hi n th lin ti p nhau. thay i kho ng cch gi a cc k t , ta dng hm : int SetTextCharacterExtra(HDC hDC, int nCharExtra); Trong , nCharExtra l kho ng cch theo n v logic thi t l p gi a cc k t . N u thnh cng, hm tr v kho ng cch tr c khi c thi t l p. Ng c l i, gi tr tr v l 0x80000000. bi t kho ng cch hi n t i, ta dng hm : int GetTextCharacterExtra(HDC hDC); N u thnh cng, gi tr tr v cho bi t kho ng cch hi n t i. Ng c l i, gi tr tr v l 0x80000000. Ngoi ra, Windows cn h tr cc hm cho bi t r ng k t v kch th c chu i hi n th . y l cc hm c p cao, s d ng trong vi c trnh by vn b n v i cc ki u font kh ph c t p. Trong chng ny, chng ta ch c p n m t s hm nh GetTextMetrics (ph n 5.3.2) v GetTextExtentPoint32 (ph n 5.3.5).

5.3. FONT CH
Trong Windows, khi trnh by vn b n, cc k t c th hi n theo nhi u d ng khc nhau. y l m t trong nh ng c trng c b n c a giao di n h a - ng i dng (GUI Graphical User Interface). th c hi n i u ny, Windows h tr nhi u d ng font ch khc nhau. Trong ph n ny, chng ta tm hi u cc v n chnh v cc font ch , cng nh cch s d ng chng trnh by vn b n.

5.3.1. Khi ni m font trong Windows


M t font ch l m t t p h p cc k t v k hi u cng d ng, th hi n qua ki u ch , lo i ch v kch c ch . Ki u ch xc nh cc c trng v k t v k hi u trong font ch , v d r ng, nt ch dy ho c m nh, c chn (c g ch ngang ho c cc nt cong m nh u cc k t ) hay khng.

Trang 136

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Lo i ch xc nh m nh t (tr ng l ng) v nghing c a d ng font th hi n. Chia lm ba lo i sau : roman, opaque, v italic. Font roman l d ng font ch c tr ng l ng trung bnh, th ng dng trong in n. Font opaque l d ng c bi n i nging c a font roman. Font italic l d ng font c thi t k theo d ng nghing chuyn bi t. Kch th c font ch c tnh nh l kho ng cch t ch n d i c a m t k t c chn n ch n trn c a m t k t hoa, v c tnh theo n v i m (kho ng 0,013817 c a 1 inch). M t t p cc font v i m t s kch c v tr ng l ng khc nhau nhng cng m t ki u lo i c xem l m t h font ch . Cc font ch trong Windows c chia thnh hai nhm, g i l font GDI v font thi t b . Font GDI c lu tr d i d ng t p tin trn a, trong khi font thi t b c thi t k s n trong thi t b xu t tng ng, v d my in. Khng nh font GDI, khi in b ng font thi t b , Windows khng c n nh d ng font, m ch c n g i n i dung d li u tr c ti p n thi t b . Ng i dng ch n tr c ti p font t my in in. i v i font GDI, Windows chuy n vn b n thnh nh bitmap sau chuy n n my in in. Nh v y, l i i m c a font GDI l c l p v i thi t b xu t, tuy nhin t c x l in ch m hn. Cc font GDI thng th ng g m c : font bitmap, font vector v font TrueType. Font bitmap c c u thnh t ma tr n pixel, c l i i m l hi n th nhanh, nhng h n ch trong vi c th hi n v i cc kch th c khc nhau (do ch phng to thu nh , v khi phng trng r t th). Font vector th hi n cc k t nh l t p h p cc nt v (s d ng cc hm GDI), do linh ng v co gi n hn font bitmap, tuy nhin c v kh ch m v ng nt cng khng c m m m i cho l m. Font TrueType l d ng font c s d ng ph bi n nh t hi n nay, c lu tr d i d ng m t t p cc i m nh, k t h p m t s thu t ton bi n i. Do th hi n s c x o cc ng nt trn mn hnh v my in. Chng ta s kh o st cc hm x l cho cc font ch d ng ny trong ph n 5.3.3. Cn by gi chng ta tm hi u cch s d ng cc font c s n c a h th ng.

5.3.2. S d ng font

nh ngha s n

Khi ta g i cc hm v ch TextOut, TabbedTextOut, ExtTextOut ho c DrawText, Windows s s d ng font ch ang c ch n trong DC hi n th n i dung vn b n. Ta c th dng m t s font c Windows nh ngha s n, th ng g i l font h th ng (phn bi t cc font do ng i dng t o trong qu trnh x l vn b n xem ph n 5.3.3). Tn macro c a cc font ny th hi n trong b ng sau : MACRO
ANSI_FIXED_FONT

FONT Font v i kch th c c nh c a k t d a trn Windows. Font Courier l m t v d i n hnh c a d ng font ny. Trang 137

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
ANSI_VAR_FONT

Font v i r ng k t thay i d a trn cc k t chu n c a Windows. Font MS San Serif l m t v d i n hnh. Font v i thi t b cho c ch n m c nhin. D ng font ny th ng co s n trong h th ng i u khi n vi c trnh by trn thi t b . Tuy nhin, i v i m t s thi t b , font c ci t ngay trn thi t b . V d , i v i my in, cc font thi t b ci s n th c hi n thao tc in nhanh hn so v i vi c load bitmap nh v t my tnh. Font c a giao di n nh. h a c thi t l p m c

DEVICE_DEFAULT_FONT

DEFAULT_GUI_FONT

OEM_FIXED_FONT

Font ch c nh, d a trn b k t OEM. V d , i v i my IBM, font OEM d a trn b k t IBM PC. Font h th ng c a Windows. c h i u hnh dng trnh by cc thnh ph n giao di n nh thanh tiu , menu, n i dung vn b n trong cc h p tho i thng i p. Cc font h th ng ny lun c s n khi ci h i u hnh, trong khi cc font khc c n ph i ci thm ty theo ng d ng sau ny. Font Windows c s d ng nh font h th ng trong cc phin b n tr c 3.0.
B ng 5.1 Macro cc font nh ngha s n.

SYSTEM_FONT

SYSTEM_FIXED_FONT

Vi c ch n v s d ng font h th ng trong Windows kh n gi n. lm i u ny, tin chng trnh t o ra handle c a font - ki u bi n HFONT, sau ch n font dng hm GetStockObject. HGDIOBJ GetStockObject(int fnObject);

Trong , ki u HGDIOBJ l HFONT, bi n fnObject l m t trong cc macro b ng trn. N u thnh cng, hm ny tr v handle c a font h th ng hi n hnh. Ng c l i, gi tr tr v l NULL. thay i font, ta g i hm SelectObject. HGDIOBJ SelectObject(HDC hDC, HGDIOBJ hGDIObj); Ho c g n hn, ta c th g i :

Trang 138

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ SelectObject(hDC.GetStockObject(fnObject)); Khi , font hi n hnh trong DC l font v a c g i. Hm tr v macro font tr c . N u khng thnh cng, l i tr v l GDI_ERROR. Th ng khi g i font nh s n, n u cc font khng c s n, h th ng s tr v font h th ng (SYSTEM_FONT). Lu , ch nn dng cc font c s n n u ch hi n th c a DC ng d ng hi n th i l MM_TEXT. xem cc thu c tnh c a font h th ng, v d kch th c c a b font khi xu t vn b n, ta dng hm GetTextMetrics. BOOL GetTextMetrics(HDC hDC, LPTEXTMETRIC lpTM); Bi n lpTM l con tr n c u trc TEXTMETRIC m n u hm th c hi n thnh cng (tr v gi tr nonzero) s ch a cc tham s c a font. o n chng trnh sau minh h a vi c ch n font chu i k t s d ng font ny. HFONT hfnt, hOldFont; hfnt = GetStockObject(ANSI_VAR_FONT); if (hOldFont = SelectObject(hdc, hfnt)) { TextOut(hdc, 10, 50, "Sample ANSI_VAR_FONT text.", 26); SelectObject(hdc, hOldFont); } Tuy nhin, font ch h th ng kh ngho nn, khng p ng nhu c u trnh by vn b n. V th , Windows h tr cc hm s d ng cc font ch t t o. Ph n ti p theo s bn k hn v cc hm x l cc font ny. nh s n vo m t DC, sau vi t m t tnh ton v tr

5.3.3. S d ng font t t o
Font logic l m t i t ng GDI c handle ki u HFONT. M t font logic l m t m t c a m t font ch th c t . Tng t nh vi t v logic v ch i sn logic, font logic l m t i t ng tr u t ng, v tr thnh font th c t trong DC khi ng d ng g i hm SelectObject. u tin, ta c n cch sau : nh ngha cc tr ng trong c u trc LOGFONT theo m t trong hai

Trang 139

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Thi t l p cc tr ng trong c u trc LOGFONT d a trn cc c tnh c a font b n quan tm. Trong tr ng h p ny, khi g i hm SelectObject, Windows s s d ng m t thu t ton "nh x font" ch n m t font tng thch nh t hi n c trn thi t b. Ch n font trong h p tho i Font, hm ChooseFont s kh i gn cc gi tr trong c u trc LOGFONT theo thu c tnh font c ch n. s d ng font ny trong cc thao tc xu t vn b n, tr c h t ng d ng c n kh i t o font logic, r i chuy n cho DC. Vi c t o font logic c th c hi n b ng cch g i hm CreateFont ho c hm CreateFontIndirect. Tuy nhin, hm CreateFont t c s d ng hn do hm c n g i cc bi n trong c u trc LOGFONT, trong khi hm CreateFontIndirect ch c n bi n con tr LOGFONT. C hai hm u tr v handle c a font logic HFONT. Tr c khi ng d ng c th xu t vn b n, font logic c n c nh x tng ng v i m t font v t l trong thi t b xu t, ho c font n p vo h i u hnh. Ti n trnh ny c th c hi n khi ng d ng g i hm SelectObject. Khi , ta c th dng hm GetTextMetrics (ho c cc hm tng ng) xc nh kch th c v c trng c a font th c tnh v tr v xu t vn b n ra thi t b xu t. Sau khi dng font, ta c n lo i b font dng hm DeleteObject. Ch khng c xo font trong DC ang th c thi, ho c font h th ng.

5.3.4. C u trc LOGFONT v TEXTMETRIC


t o font logic, ta c th g i hm CreateFont v CreateFontIndirect. Hm CreateFontIndirect nh n con tr c u trc LOGFONT. Hm CreateFont c bi n l 14 tr ng c a LOGFONT. Xt nh ngha c a c u trc LOGFONT : typedef struct tagLOGFONT // lf { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; Trang 140

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT; Hai tr ng u trong c u trc LOGFONT tnh theo n v logic, do ph thu c vo hi n th . Tr ng lfHeight l chi u cao c a k t , nh n gi tr m c nh c a font n u b ng ch 0. N u lfHeight m, Windows xc nh kch c font qua gi tr tuy t i g n nh t. Gi tr dng c a lfHeight x p x b ng gi tr tmHeight tng ng trong c u trc TEXTMETRICS. Tr ng lfWidth xc nh r ng k t . Trong tr ng h p lfWidth b ng 0, Windows s ch n font tng ng d a vo chi u cao lfHeight. Gi tr lfWidth khc 0 th ng c s d ng cho cc font TrueType (khng tng thch cho cc font vector). Tr ng ny tng ng tr ng tmAveCharWidth trong c u trc TEXTMETRICS. Hai tr ng ti p theo xc nh h ng hi n th c a cc k t trong chu i. Tr ng lfEscapement xc nh gc l ch gi a ng c s (base line) v tr c x c a thi t b . Gi tr nh p vo l m t b i s c a 10. Chu i xu t theo h ng m c nh (tri sang ph i), h ng ln, t ph i sang tri, v h ng xu ng n u gi tr l n l t l 0, 900, 1800, v 2700. Tr ng lfOrientation xc nh h ng ng c s c a t ng k t so v i tr c x. Gi tr c xc nh tng t lfEscapement. N u ng d ng g i hm trong Windows NT, v i ch h a l GM_ADVANCED, gi tr lfEscapement c xc nh c l p v i lfOrientation. Trong cc tr ng h p khc, hai gi tr ny ph i c thi t l p nh nhau. V d sau th hi n vi c xu t m t chu i quanh tm vng lm vi c c a c a s b ng cch thay i gi tr c a tr ng lfEscapement v lfOrientation t ng 10 .
RECT rc; int angle; HFONT hfnt, hfntPrev; LPSTR lpszRotate = "String to be rotated."; // C p pht vng nh cho c u trc LOGFONT.

ng d ng

Trang 141

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
PLOGFONT plf=(PLOGFONT)LocalAlloc(LPTR, sizeof(LOGFONT)); // Xc nh tn v m nh t c a font.

lstrcpy(plf->lfFaceName, "Arial"); plf->lfWeight = FW_NORMAL; // Thu nh n kch th c c a vng lm vi c c a s GetClientRect(hwnd, &rc); // Thi t l p ch n n TRANSPARENT cho thao tc xu t vn b n. ng d ng .

SetBkMode(hdc, TRANSPARENT); // V chu i quay quanh tm vng lm vi c t ng 10 for (angle = 0; angle < 3600; angle += 100) { plf->lfEscapement = angle; hfnt = CreateFontIndirect(plf); hfntPrev = SelectObject(hdc, hfnt); TextOut(hdc, rc.right/2, rc.bottom/2, lpszRotate, lstrlen(lpszRotate)); SelectObject(hdc, hfntPrev); DeleteObject(hfnt); } // Chuy n ch hi n th v l i d ng OPAQUE. (36 l n).

SetBkMode(hdc, OPAQUE); // Gi i phng vng nh c p pht cho c u trc LOGFONT.

LocalFree((LOCALHANDLE) plf);

Tr ng ti p theo l lfWeight xc nh m nh t c a k t , c gi tr t 0 n 1000. Trong tr ng h p b ng 0, Windows s d ng gi tr m c nh. ti n dng, ta dng m t s macro sau :

Trang 142

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam Gi tr


0 100 200 200 300 400 400 500 600 600 700 800 800 900 900

____________________________________________________________________________________ Tn
FW_DONTCARE FW_THIN FW_EXTRALIGHT FW_ULTRALIGHT FW_LIGHT FW_NORMAL FW_REGULAR FW_MEDIUM FW_SEMIBOLD FW_DEMIBOLD FW_BOLD FW_EXTRABOLD FW_ULTRABOLD FW_HEAVY FW_BLACK

B ng 5.2 Macro xc

nh

m nh t lfWeight.

Cc tr ng lfItalic, lfUnderline, lfStrikeOut xc ngang n u c thi t l p b ng TRUE.

nh font nghing, c g ch d i, g ch

Tr ng lfCharSet xc nh t p k t s d ng. Gi tr OEM_CHARSET xc nh t p k t ph thu c h i u hnh. Thng th ng, ta s d ng DAFAULT_CHARSET (t p k t m c nh). Vi c ch n t p k t l r t quan tr ng, n u ng d ng s d ng font c t p k t khng xc nh, h th ng khng th thng d ch chng. Cc tr ng cn l i kh ph c t p. Chng ta khng phn tch cc gi tr c a chng y. Tr ng lfOutPrecision nh ngha chnh xc (c th c) c a font th c t so v i font yu c u. Tr ng lfClipPrecision xc nh cch th c cc k t b c t b khi n m ngoi vng clipping. Tr ng lfQuality dng cho font vector, xc nh cch th c GDI nh ngha chnh xc c a font logic so v i font v t l. Tr ng lfPitchAndFamily xc nh h font ch . Tr ng lfFaceName xc nh tn ki u font. Sau khi ch n font cho DC, ta c n bi t cc c trng c a font hi n t i dng cho vi c xu t vn b n b ng hm GetTextMetrics. Ta c c u trc TEXTMETRIC :

Trang 143

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ typedef struct tagTEXTMETRIC // tm { LONG tmHeight; LONG tmAscent; LONG tmDescent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; LONG tmWeight; LONG tmOverhang; LONG tmDigitizedAspectX; LONG tmDigitizedAspectY; BCHAR tmFirstChar; BCHAR tmLastChar; BCHAR tmDefaultChar; BCHAR tmBreakChar; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; BYTE tmPitchAndFamily; BYTE tmCharSet; } TEXTMETRIC; Trang 144

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Cc tr ng v kch th c c tnh theo n v logic, ph thu c vo ch hi n th . Tr ng tmHeight cho bi t chi u cao c a k t , b ng t ng hai tr ng tmAscent (ph n trn ng c s ) v tmDescent (ph n d i ng c s ). Tr ng tmInternalLeading xc nh kho ng cch bn trong ng bin xc nh b i tmHeight. Ng i thi t k c th cho gi tr ny b ng 0. Tr ng tmExternalLeading l kho ng cch Windows thm vo gi a cc dng. Ng i dng cng c th gn gi tr ny b ng 0. Tr ng tmAveCharWidth cho bi t r ng trung bnh c a cc k t ch th ng. Tr ng tmMaxCharWidth cho bi t r ng k t l n nh t tnh theo n v logic. i v i b font fixed-pitch ( r ng khng i), gi tr ny b ng tmAveCharWidth. Tr ng tmOverhang cho bi t ph n m r ng (theo n v logic) m Windows thm vo font vector khi font nghing ho c t m. Khi font nghing, gi tr tmAveCharWidth khng thay i, b i v chu i cc k t nghing v n c r ng b ng chu i ch thng th ng. Trong tr ng h p ch m, Windows s m r ng t ng k t . Khi , tmAveCharWidth c a k t bnh th ng b ng tmAveCharWidth tr i l n tmOverhang c a k t m. Tr ng tmDigitizedAspectX v tmDigitizedAspectY xc nh t l co c a font. Chng ta cng c th xc nh chng b ng hm GetDeviceCaps (xc nh cc thng tin thi t b ) v i cc thng s c a nIndex l LOGPIXELSX v LOGPIXELSY. int GetDeviceCaps(HDC hDC, int nIndex); Tr ng tmFirstChar xc nh gi tr k t u tin trong font, tmLastChar xc nh gi tr k t cu i cng. N u g i hm GetTextMetricsW, gi tr ny s l n hn 255. Tr ng tmDefaultChar ch a gi tr Windows dng hi n th cc k t khng t n t i trong b font, th ng l hnh ch nh t. Tr ng tmBreakChar c dng ng t t khi canh ch nh vn b n. N u khng dng cc font c bi t, v d font EBCDIC, gi tr ny chnh l gi tr k t kho ng tr ng (m b ng 32). Cc tr ng tmWeight, tmItalic, tmUnderlined, tmStruckOut, tmCharSet v tmPitchAndFamily gi ng cc tr ng lfWeight, lfItalic, lfUnderline, lfStrikeOut, lfCharSet v lfPitchAndFamily trong c u trc LOGFONT.

5.3.5. S d ng h p tho i ch n font


ch n font, ta c th s d ng h p tho i font. u tin, ng d ng kh i t o cc gi tr trong c u trc CHOOSEFONT, sau g i hm ChooseFont hi n th h p tho i li t k danh sch cc font. Sau khi ng i dng ch n m t font c s n v ch n OK, hm ChooseFont s kh i gn cc gi tr tng ng vo c u trc LOGFONT. ng d ng c th g i hm CreateFontIndirect t o m t font logic d a trn cc yu c u c a ng i dng. Xt c u trc CHOOSEFONT. typedef struct tagCHOOSEFONT // cf { Trang 145

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ DWORD lStructSize; HWND hwndOwner; HDC hDC; LPLOGFONT lpLogFont; INT iPointSize; DWORD Flags; DWORD rgbColors; LPARAM lCustData; LPCFHOOKPROC lpfnHook; LPCTSTR lpTemplateName; HINSTANCE hInstance; LPTSTR lpszStyle; WORD nFontType; WORD ___MISSING_ALIGNMENT__; INT nSizeMin; INT nSizeMax; } CHOOSEFONT; Tr ng lStructureSize xc nh s byte kch th c c u trc. Tr ng hwndOwner xc nh c a s ch a h p tho i ch n font. Tr ng ny c th l m t handle c a s xc nh, ho c cng c th b ng NULL n u h p tho i khng xc nh c a s cha. Tr ng hDC l DC c a my in c cc font c li t k trong h p tho i. Ch dng tr ng hDC n u thi t l p tr ng Flags v i c CF_PRINTERFONTS ho c CF_BOTH; trong cc tr ng h p khc, gi tr tr ng ny b b qua. Tr ng lpLogFont tr n c u trc LOGFONT. N u ta thi t l p trong tr ng Flags gi tr CF_INITTOLOGFONTSTRUCT, v kh i gn cc gi tr cho n, hm ChooseFont s kh i t o h p tho i v i font g n gi ng nh t. Sau khi ta ch n OK ng h p tho i, hm ChooseFont s thi t l p cc gi tr c a c u trc ny d a trn cc ch n l a tng ng. Trang 146

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Tr ng iPointSize xc nh kch th c font c ch n theo n v 1/10 i m. Gi tr ny s c thi t l p sau khi ta ng h p tho i. Tr ng Flags l t p cc bit c k t h p cc gi tr sau :
CF_APPLY

c dng

kh i t o h p tho i Font. Tr ng ny c th

H p tho i c thm button Apply. Ta ph i cung c p hm hook x l thng i p WM_COMMAND cho button ny. H p tho i li t k danh sch cc font my in v font mn hnh. Tr ng hDC s xc nh DC lin quan n my in. C ny c n k t h p v i c CF_SCREENFONTS v CF_PRINTERFONTS. Xc nh hm ChooseFont ch qu n l v ch n l a trn font d ng TrueType. h p tho i th hi n cc control cho php ng i dng thi t l p ch g ch ngang, g ch d i v ch n mu. N u c ny c thi t l p, ta c th s d ng tr ng rgbColors xc nh mu font ban u. Ta cng c th s d ng tr ng lfStrikeOut v lfUnderline c a c u trc n tr ng lpLogFont xc nh LOGFONT tr cc thi t l p ban u c a checkbox g ch ngang v g ch d i k t . Hm ChooseFont s s d ng cc tr ng ny tr v gi tr ch n l a c a ng i dng. Cho php th t c hook thi t l p trong tr ng lpfnHook. Ch ra tr ng hInstance v lpTemplateName xc nh h p tho i m u s d ng m c nh. Ch ra tr ng hInstance xc nh kh i d li u ch a h p ho i m u tr c khi n p. H th ng s b qua gi tr c a tr ng lpTemplateName. Xc nh hm ChooseFont s ch ra l i n u ng i dng c ch n font ho c ki u khng Trang 147

CF_BOTH

CF_TTONLY

CF_EFFECT

CF_ENABLEHOOK

CF_ENABLETEMPLATE

CF_ENABLETEMPLATEHANDLE

CF_FORCEFONTEXIST

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam t n t i.

____________________________________________________________________________________

CF_INITTOLOGFONTSTRUCT

Xc nh hm ChooseFont ph i s d ng c u trc LOGFONT qua tr ng lpLogFont kh i t o h p tho i. Xc nh hm ChooseFont ch ch n font c kch th c trong gi i h n t nSizeMin n nSizeMax. Gi ng c CF_NOVECTORFONTS. Khi s d ng c u trc LOGFONT kh i t o cc control c a h p tho i, trong combo box tn font khng th hi n m t font no ang c ch n c . Khng cho php ch n combo box Scrip. Khi c ny c thi t l p, tr ng lfCharSet c a c u trc LOGFONT c thi t l p v i gi tr DEFAULT_CHARSET khi hm ChooseFont tr v . C ny ch dng khi kh i t o h p tho i. Khi s d ng c u trc LOGFONT kh i t o cc control c a h p tho i, ta khng dng ki u font no c (combo box style). Khi s d ng c u trc LOGFONT kh i t o cc control c a h p tho i, ta khng hi n th ch n l a ban u cho combo box kch th c. Hm ChooseFont khng cho php ch n l a font vector. H p tho i font ch li t k cc font vi t h ng ngang. H p tho i ch li t k cc font h tr my in lin quan n DC xc nh qua handle hDC. Ch nh hm ChooseFont ch cho php ch n l a cc font c th co gin (font vector, TrueType, ).

CF_LIMITSIZE

CF_NOOEMFONTS CF_NOFACESEL

CF_NOSCRIPTSEL

CF_NOSTYLESEL

CF_NOSIZESEL

CF_NOVECTORFONTS

CF_NOVERTFONTS

CF_PRINTERFONTS

CF_SCALABLEONLY

Trang 148

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam H p tho i ch li t k cc font mn hnh c h th ng h tr . H p tho i s hi n th nt Help. Tr ng hwndOwner ph i xc nh window nh n thng i p HELPMSGSTRING m h p tho i a ra khi ng i dng nh n button Help. Xc nh tr ng lpszStyle tr n vng m ch a d li u ki u m hm ChooseFont dng kh i t o combo box Font Style. Sau khi ng i dng ng h p tho i, hm ChooseFont chp d li u ki u vo vng m. Xc nh hm ChooseFont cho php ch n l a cc font c s n cho my in v mn hnh. N u c ny c thi t l p, c c CF_BOTH v CF_SCALABLEONLY cng c n c thi t l p.
B ng 5.3 Cc macro c Flags kh i t o h p tho i Font.

____________________________________________________________________________________
CF_SCREENFONTS

CF_SHOWHELP

CF_USESTYLE

CF_WYSIWYG

N u c CF_EFFECT c thi t l p, tr ng rgbColors s xc nh mu ch kh i t o. N u hm ChooseFont th c hi n thnh cng, tr ng ny s ch a gi tr RGB c a mu ch m ng i dng ch n. Tr ng lCustData xc nh d li u c ng d ng nh ngha chuy n cho hm hook gn b i gi tr lpfnHook. N u h th ng g i thng i p WM_INITDIALOG, gi tr lParam c a thng i p l con tr tr n c u trc CHOOSEFONT xc nh khi h p tho i c t o. Tr ng lpfnHook tr n th t c hook CFHookProc x l cc thng i p c a h p tho i. s d ng gi tr ny, c n ph i thi t l p c v i CF_ENABLEHOOK. Tr ng lpTemplateName tr n chu i (k t thc b ng k t NULL) xc nh tn ti nguyn h p tho i m u, lin quan v i tr ng hInstance. N u thi t l p c CF_ENABLETEMPLATEHANDLE, hInstance l handle c a i t ng vng nh ch a h p tho i m u. N u thi t l p c CF_ENABLETEMPLATE, hInstance xc nh module ch a h p tho i m u c tn tr ng lpTemplateName. Tr ng lpszStyle tr n vng m ch a d li u ki u. N u thi t l p c CF_USESTYLE, hm ChooseFont s s d ng d li u trong vng m kh i t o combo box ki u font. Khi ng i dng ng h p tho i, hm ChooseFont chp chu i trong combo box ki u font vo vng m ny. Tr ng nFontType xc nh d ng font tr v . C th k t h p cc gi tr sau : Trang 149

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam Font ch m. Gi tr ny c l p l i trong tr ng lfWeight c a c u trc LOGFONT, v b ng FW_BOLD. Font ch nghing. Gi tr ny c l p l i trong tr ng lfItalic c a c u trc LOGFONT. Font ch l font my in. Font ch bnh th ng. Gi tr ny c l p l i trong tr ng lfWeight c a c u trc LOGFONT, v b ng FW_REGULAR . Font ch l font mn hnh. Font d a theo giao di n GUI.
nh d ng font tr v .

____________________________________________________________________________________
BOLD_FONTTYPE

ITALIC_FONTTYPE

PRINTER_FONTTYPE REGULAR_FONTTYPE

SCREEN_FONTTYPE SIMULATED_FONTTYPE

B ng 5.4 Cc macro xc

Tr ng nSizeMin v nSizeMax xc nh kch c ch nh nh t v l n nh t m ng i dng c th ch n. Hm ChooseFont ch nh n ra cc gi tr ny khi c CF_LIMITSIZE c thi t l p. Nh trnh by trn, t o h p tho i font cho php ng i dng ch n cc thu c tnh c a m t font logic, ta dng hm ChooseFont. BOOL ChooseFont(LPCHOOSEFONT lpcf); V i lpcf tr n c u trc CHOOSEFONT ch a cc thng tin dng Khi hm tr v , c u trc ny ch a cc thng tin m ng i dng ch n. kh i t o h p tho i.

N u ng i dng nh n nt OK trn h p tho i, hm tr v gi tr khc 0. Ng c l i, n u ch n Cancel ho c ng (close) h p tho i, gi tr tr v b ng 0. V d sau minh h a vi c ch n font logic s d ng h p tho i font.
HFONT FAR PASCAL MyCreateFont( void ) { CHOOSEFONT cf; LOGFONT lf;

Trang 150

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
HFONT hfont; // Kh i t o cc tr ng trong c u trc CHOOSEFONT. cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = (HWND)NULL; cf.hDC = (HDC)NULL; cf.lpLogFont = &lf; cf.iPointSize = 0; cf.Flags = CF_SCREENFONTS; cf.rgbColors = RGB(0,0,0); cf.lCustData = 0L; cf.lpfnHook = (LPCFHOOKPROC)NULL; cf.lpTemplateName = (LPSTR)NULL; cf.hInstance = (HINSTANCE) NULL; cf.lpszStyle = (LPSTR)NULL; cf.nFontType = SCREEN_FONTTYPE; cf.nSizeMin = 0; cf.nSizeMax = 0; // Hi n th h p tho i font. ChooseFont(&cf); /* T o font logic d a trn cc ch n l a c a ng i dng v tr v handle c a font logic */ hfont = CreateFontIndirect(cf.lpLogFont); return (hfont); }

5.3.6. V d v hi n th vn b n b ng cc font khc nhau

Trang 151

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Sau khi tm hi u v vi c xu t n i dung vn b n v s d ng font ch b ng cc hm Win32 API, ta c th trnh by vn b n m t cch linh ng hn. Ph n ny a ra v d xu t m t chu i vn b n theo cc font khc nhau trn cng m t dng. M t trong cc cch trnh by m t dng vn b n v i nhi u font ch khc nhau l s d ng hm GetTextExtentPoint32 sau m i l n g i hm TextOut v c ng chi u di nh n c vo v tr hi n th hi n t i. V d sau xu t cu "This is a sample string", s d ng ch m vi t "This is a", ch nghing vi t "sample", v tr l i ch m vi t string.". Sau khi xu t xong, chng trnh ph c h i l i d ng font m c nh.
int XIncrement; int YStart; TEXTMETRIC tm; HFONT hfntDefault, hfntItalic, hfntBold; SIZE sz; LPSTR lpszString1 = "This is a "; LPSTR lpszString2 = "sample "; LPSTR lpszString3 = "string."; /* T o font ch m v nghing (hm ny khng vi t y) */

hfntItalic = MyCreateFont(); hfntBold = MyCreateFont(); /* Ch n font ch XIncrement = 10; YStart = 50; hfntDefault = SelectObject(hdc, hfntBold); TextOut(hdc, XIncrement, YStart, lpszString1, lstrlen(lpszString1)); /* Tnh di c a chu i chu i ti p theo */ u tin v c ng gi tr ny vo gi tr XIncrement th c hi n thao tc xu t m v vi t chu i t i v tr xc nh b i c p tham s (XIncrement, YStart) */

GetTextExtentPoint32(hdc, lpszString1, lstrlen(lpszString1), &sz); XIncrement += sz.cx;

Trang 152

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
/* Xc nh l n ph n m r ng k t qua c u trc TEXTMETRIC v tr b t XIncrement. ( i u ny ch c n thi t cho font vector) */ GetTextMetrics(hdc, &tm); XIncrement -= tm.tmOverhang; /* Ch n font nghing v vi t chu i th hai b t hfntBold = SelectObject(hdc, hfntItalic); GetTextMetrics(hdc, &tm); XIncrement -= tm.tmOverhang; TextOut(hdc, XIncrement, YStart, lpszString2, lstrlen(lpszString2)); /* Tnh di c a chu i chu i ti p theo */ u tin v c ng gi tr ny vo gi tr XIncrement th c hi n thao tc xu t u t i v tr (XIncrement, YStart) */

GetTextExtentPoint32(hdc, lpszString2, lstrlen(lpszString2), &sz); XIncrement += sz.cx; /* Ch n l i font ch m v vi t chu i th ba b t u t i v tr (XIncrement, YStart) */

SelectObject(hdc, hfntBold); TextOut(hdc, XIncrement-tm.tmOverhang, YStart, lpszString3, lstrlen(lpszString3)); /* Ch n l i font ban u */

SelectObject(hdc, hfntDefault); /* Xo cc i t ng font ch */

DeleteObject(hfntItalic); DeleteObject(hfntBold);

Trong v d trn, ta s d ng hm GetTextExtentPoint32 c a chu i vn b n.

nh n chi u di v chi u cao

BOOL GetTextExtentPoint32(HDC hDC, LPCTSTR lpString, int cbString, LPSIZE lpSize); Trong hDC l handle c a DC, lpString tr n chu i vn b n c chi u di xc nh b i cbString. V lpSize tr n c u trc SIZE ch a kch th c c a chu i k t c n xc nh. Trang 153

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ typedef struct tagSIZE { LONG cx; LONG cy; } SIZE; C u trc trn xc bi n cx v cy. nh chi u r ng v chi u cao c a m t hnh ch nh t l n l t qua hai

N u th c hi n thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v b ng 0.

Chng 6 H A V CC
Trang 154

I T NG GDI

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

6.1. M

Windows cung c p m t tnh nng r t c s c, l kh nng h a c l p thi t b c xy d ng trn k thu t GDI (giao di n giao ti p v i cc thi t b h a khc nhau). GDI l th vi n h a c a Windows, cung c p t t c hm ph c v cho cc thao tc k t xu t hnh nh v vn b n ra thi t b . GDI c th v ra nhi u lo i thi t b khc nhau: Mn hnh My in My v

GDI c trch nhi m giao ti p v k t xu t cc yu c u m ng i dng chuy n cho n n ng thi t b ch. V c b n, n giao ti p v i cc trnh i u khi n thi t b (cc t p tin .drv), th t ra cc trnh i u khi n thi t b cng l m t giao di n do Windows a ra, do trch nhi m n ng n khng th t s thu c v GDI c a Windows m l c a cc nh s n xu t thi t b ph n c ng, h bu c ph i cung c p trnh i u khi n theo giao di n ny n u mu n bn c s n ph m cho ng i dng Windows. Nh v y, ng i l p trnh khng c n quan tm n vi c i u khi n tr c ti p thi t b xu t m ch c n quan tm n th vi n hm GDI. Chng ny s trnh by cc khi ni m c s v GDI nh device context, cc hm GDI c s v v t, cc hm n p v zoom nh bitmap. Ph n cu i chng s trnh by cch l y v handle device context c a my in v m t s hm c s s d ng cho vi c i u khi n in n. Tm l i, Windows cung c p kh nng s d ng cng m t hm khc nhau. i u ny lm cho chng trnh c l p v i thi t b . k t xu t ra nhi u thi t b

6.2. DEVICE CONTEXT


Device context l m t thi t b xu t logic, lin k t v i m t thi t b xu t v t l c th . Windows khng cho php chng ta k t xu t tr c ti p ra thi t b v t l m ph i thng qua handle c a device context. Handle device context l m t s nguyn khng d u c Windows c p nh m t nh danh c a device context. V d 1 : Xu t dng ch "Hello Windows 2000" ra mn hnh
HDC hDC; /* L y device context c a c a s */ hDC=GetDC(hWnd); /* Xu t dng ch "Hello Windows 2000" ra c a s t i v tr (20,20) */

Trang 155

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
TextOut(hDC, 20, 20, "Hello Windows 2000", 18); /*Gi i phng Device Context */ RealeaseDC(hWnd, hDC);

V d 2 : V hnh ch nh t
HDC hDC; HPEN hPen, oldHPen; /* L y v device context c a c a s */ hDC=GetDC(hWnd); /* T o bt v m i v i nt li n, dy 5, mu xanh */

hPen=CreatePen(PS_SOLID, 5, RGB(0, 0, 255)); /* Ch n bt v hi n hnh l bt v m i v lu l i bt v c */ oldHPen=(HPEN)SelectObject(hDC, hPen); /* V hnh ch nh t */ Rectangle(hDC, 20, 20, 100, 100); /* Restore l i bt v c */ SelectObject(hDC, oldHPen); /* Gi i phng bt v DeleteObject(hPen); /* Gi i phng device context */ ReleaseDC(hWnd, hDC); t o ra */

6.2.1. Thao tc l y v v gi i phng Device Context


C 3 cch nh n v v gi i phng m t Device Context :

S d ng hm BeginPaint v EndPaint khi x l thng i p WM_PAINT:


hDC = BeginPaint(hWnd, &ps);

Trang 156

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
// X l EndPaint(hWnd, &ps);

Bi n ps l m t c u trc ki u PAINTSTRUCT. Dng hm GetDC v ReleaseDC khi x l cc thng i p khc WM_PAINT:


hDC = GetDC(hWnd); //X l ReleaseDC(hWnd, hDC);

Dng hm GetWindowDC v ReleaseDC :


hDC = GetWindowDC(hWnd); // X l ReleaseDC(hWnd, hDC);

Lu : Cc hm GetDC v BeginPaint tr v device context cho vng client c a c a s , ring hm GetWindowDC tr v device context c a ton b c a s k c thanh tiu , menu, thanh cu n v t t nhin l c vng client. v ra ngoi vng lm vi c (client area), ph i ch n thng i p WM_NCPAINT( NC: None Client). Ngoi ra, cn c th nh n v device context c a ton mn hnh b ng hm: hDC = CreateDC( "DISPLAY", NULL, NULL, NULL);

6.2.2. T o l p v gi i phng memory device context


Memory device context(MDC)l m t device context o khng g n v i m t thi t b xu t c th no. Mu n k t qu k t xu t ra thi t b v t l ta ph i chp MDC ln m t device context th t s (device context c lin k t v i thi t b v t l). MDC th ng c dng nh m t device context trung gian v tr c khi th c s xu t ra thi t b , nh m gi m s ch p gi t n u thi t b xu t l window hay mn hnh. t o MDC tng thch v i m t hDC c th , s d ng hm CreateCompatibleDC: HDC hMemDC; hMemDC = CreateCompatibleDC(hDC); n gi n hn, c th tng thch v i mn hnh. t NULL vo v tr hDC, Windows s t o m t device context

Trang 157

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ H y MDC b ng hm DeleteDC. MDC c b m t hi n th nh m t thi t b th t. Tuy nhin, b m t hi n th ny lc u r t nh , ch l m t pixel n s c. Khng th lm g v i m t b m t hi n th ch g m 1 bit nh v y. Do c n lm cho b m t hi n th ny r ng hn b ng cch ch n m t i t ng bitmap GDI vo MDC: SelectObject(hMemDC, hBitmap); th Ch c th ch n c. Sau khi ch n m t th t s . Sau khi c hon t t trong MDC, nh c a ra device context th t s b ng hm BitBlt: BitBlt(hDC, xDest, yDest, nWidth, nHeight, hMemDC, xSource, ySource); V d : Chu n b nh tr c khi a ra mn hnh, trnh gy ch p mn hnh trong thng i p WM_PAINT.
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // L y v kch th c vng client c a c a s hi n hnh RECT rect; GetClientRect(hWnd, &rect); // T o MDC tng thch v i DC c a c a s HDC hMemDC; hMemDC = CreateCompatibleDC(hdc); // Ch n m t i t ng bitmap m r ng vng hi n th cho MDC

i t ng bitmap vo MDC, khng th ch n vo m t device context c i t ng bitmap cho MDC, c th dng MDC nh m t device context

HBITMAP bitmap,oBitmap; bitmap = CreateCompatibleBitmap(hdc,rect.right,rect.bottom); oBitmap = (HBITMAP)SelectObject(hMemDC,bitmap);

Trang 158

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
// V l i n n MDC FillRect(hMemDC, &rect, HBRUSH (GetBkColor(hMemDC))); // Xu t hnh nh, text ra MDC SetPixel(hMemDC, 0, 0, RGB(255,0,0)); MoveToEx(hMemDC, 50, 50, NULL); LineTo(hMemDC, 100, 100); Rectangle(hMemDC, 10, 10, 100, 100); TextOut(hMemDC, 15 ,15, "Testing MDC", 11); If (!BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY)) MessageBox(hWnd, "Failed to transfer bit block", "Error",MB_OK); // Ph c h i l i bitmap c cho MDC SelectObject(hMemDC, oBitmap); // Gi i phng MDC, bitmap t o DeleteDC(hMemDC); DeleteObject(bitmap); EndPaint(hWnd, &ps); break;

6.3. M T S

HM

H A C S

S d ng cc hm h a c s , ta c th trnh by cc i t ng vn b n, hnh nh trn ng d ng. G m cc nhm hm v vn b n (text), bt v , mi n t, v nh bitmap. Cc hm v vn b n c trnh by trong chng tr c. hm cn l i. y s trnh by cc nhm

6.3.1. Nhm hm v
COLORREF GetPixel(HDC hDC, int nXPos, int nYPos);

Trang 159

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ L y v gi tr mu t i v tr (nXPos, nYPos) c a hDC, tr v -1 n u i m ny n m ngoi vng hi n th . COLORREF SetPixel(HDC hDC, int nXPos, int nYPos, COLORREF clrRef); V m t i m mu clrRef t i v tr (nXPos, nYPos) ln hDC. Gi tr tr v l mu c a i m (nXPos, nYPos) ho c -1 n u i m ny n m ngoi vng hi n th . DWORD MoveToEx(HDC hDC, int x, int y); nt a Di chuy n bt v LOWORD, y = HIWORD. (x, y) trn hDC. Gi tr tr v l t a c c a bt v , x =

BOOL LineTo(HDC hDC, int xEnd, int yEnd); V o n th ng t v tr hi n hnh n u thnh cng, FALSE n u th t b i. n v tr (xEnd, yEnd) trn hDC. Hm tr v TRUE

BOOL Polyline(HDC hDC, const POINT FAR *lpPoints, int nPoints); cc V ng g p khc ln hDC b ng cc o n th ng lin ti p, s nh l nPoints v i t a nh c xc nh trong lpPoints. Hm tr v TRUE n u thnh cng, FALSE n u th t b i. BOOL Polygon(HDC hDC, const POINT FAR *lpPoints, int nPoints); V a gic c nPoints nh, t a cc TRUE n u thnh cng, FALSE n u th t b i. nh c xc nh b i lpPoints. Hm tr v

BOOL Rectangle(HDC hDC, int left, int top, int right, int bottom); V hnh ch nh t c t a l left, top, right, bottom ln hDC.

HPEN CreatePen(int penStyle, int penWidth, COLORREF penColor); T o bt v c ki u penStyle, dy nt v l penWidth, mu penColor. Hm tr v handle c a bt v n u thnh cng v tr v NULL n u th t b i. Cc gi tr c a penStyle nh sau :
Gi tr PS_SOLID PS_DASH PS_DOT Gi i thch

Trang 160

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
PS_DASHDOT PS_DASHDOTDOT PS_NULL PS_INSIDEFRAME B ng 6.1 Cc ki u bt v penStyle Khng hi n th

V d : T o bt v m i v dng bt v ny v m t s
HDC hDC; POINT PointArr[3]; HPEN hPen, hOldPen; hDC = GetDC(hWnd); PointArr[0].x = 50; PointArr[0].y = 10; PointArr[1].x = 250; PointArr[1].y = 50; PointArr[2].x = 125; PointArr[2].y = 130; // V m t ng g p khc b ng Pen hi n hnh Polyline(hDC, PointArr, 3); //T o Pen m i c nt li n, dy 1, mu xanh

ng c s .

hPen = (HPEN)CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); //Ch n bt v m i cho hDC c a window hOldPen = SelectObject(hDC, hPen); //V ng th ng v i bt v m i

MoveToEx(hDC, 100, 100, NULL);

Trang 161

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
LineTo(hDC, 200, 150); //Tr l i bt v c cho hDC SelectObject(hDC, hOldPen); //Xo bt v m i t o v gi i phng hDC DeleteObject(hPen); ReleaseDC(hWnd, hDC);

6.3.2. Nhm hm mi n
HBRUSH CreateSolidBrush(COLORREF cRef); T o m u t c v i mu cRef.

HBRUSH CreateHatchBrush(int bStyle, COLORREF cRef); T o m u t d ng l i ki u bStyle v i mu cRef. Cc ki u bStyle : HS_HORIZONTAL HS_VERTICAL HS_FDIAGONAL HS_BDIAGONAL HS_CROSS HS_DIAGCROSS BOOL FloodFill(HDC hDC, int xStart, int yStart, COLORREF cRef); T mu m t vng kn, mu ng bin l cRef. BOOL ExtFloodFill(HDC hDC, int xStart, int yStart, COLORREF cRef, UINT fillStyle); T mu m t vng kn, fillStyle quy t nh cch t :

o FLOODFILLBORDER : T mu vng c mu ng bin l cRef. Trang 162

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ o FLOODFILLSURFACE : T vng c mu cRef. V d : S d ng cc m u c s n v t o cc m u t m i


HDC hDC; HPEN hPen; HBRUSH hBrush, hOldBrush; hDC = GetDC(hWnd); //V hai hnh ch nh t v i bt v Black hPen = (HPEN)GetStockObject(BLACK_PEN); SelectObject(hDC, hPen); Rectangle(hDC, 10, 10, 50, 50); Rectangle(hDC, 100, 100, 200, 200); // Dng m t trong cc m u t c s n t hnh

t.

hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH); SelectObject(hDC, hBrush); FloodFill(hDC, 30, 30, RGB(0,0,255)); // T o m u t m i t hnh th hai

hBrush = (HBRUSH)CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 255)); hOldBrush = (HBRUSH)SelectObject(hDC, hBrush); FloodFill(hDC, 150, 150, RGB(0, 0, 0)); SelectObject(hDC, hOldBrush); //Xa m u t v gi i phng hDC DeleteObject(hBrush); ReleaseDC(hWnd, hDC);

6.3.3. Nhm hm bitmap

Trang 163

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ 6.3.3.1. N p nh C hai cch n p nh bitmap : N p t bitmap resource trong chng trnh : HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName); is u tin hInstance l handle th hi n c a module ch a bitmap resource, c th l NULL n u bitmap mu n n p l m t bitmap h th ng. l cc bitmap nh s d ng cho cc thnh ph n giao di n chng trnh nh close box v cc d u check, cc nh danh b t u v i ti p u ng OBM. i s th hai c th s d ng macro MAKEINTRESOURCE n u bitmap k t h p v i m t nh danh ki u nguyn, ho c l chu i tn bitmap resource. Sau khi s d ng, dng hm DeleteObject gi i phng handle ang tham chi u n bitmap . V d : N p bitmap resource, c s d ng MDC
// L y v kch th c vng client c a c a s RECT rect; GetClientRect(hWnd, &rect); // L y v handle device context c a c a s HDC hdc; hdc = GetDC(hWnd); //T o MDC tng thch v i hDC c a c a s HDC hMemDC; hMemDC = CreateCompatibleDC(hdc); HBITMAP hNewBmp,hOldBmp; // N p bitmap resource c ID l IDB_CUB hNewBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CUB)); if(hNewBmp) { //Gn bitmap m i cho MDC hOldBmp = (HBITMAP)SelectObject(hMemDC,hNewBmp);

trnh gy ch p mn hnh.

Trang 164

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
//Copy bitmap t MDC sang DC BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY); } //Ph c h i l i bitmap c cho MDC SelectObject(hMemDC, hOldBmp); //Gi i phng bitmap v a t o v MDC, hdc DeleteObject(hNewBmp); DeleteDC(hMemDC); ReleaseDC(hdc);

N p t file bitmap c a Windows(*.bmp) : *B ng mu(Color Palette): B ng mu trong Windows GDI l m t khi ni m gi ng nh b ng mu th t s c a h a s, n g m cc mu(palette entry) v i thng tin c th v m t s c . qu n l vi c th hi n mu trn cc c a s , Windows s d ng cc b ng mu. Thng th ng cc c a s dng b ng mu h th ng th hi n thng tin. Tuy nhin, trong nhi u tr ng h p b ng mu h th ng khng ph h p v i nhu c u, khi ta c n thay m t s mu trong b ng mu h th ng b ng cc mu ph h p hn.

Trong th c t , Windows cho php m i c a s dng m t b ng mu khc nhau v i i u ki n s l ng mu trong b ng mu khng c v t qu s mu t i a cho php c a thi t b hi n th . Khi m t c a s nh n s quan tm (focus), Windows s th hi n d li u trong c a s v i s mu t i a cho php c a b ng mu tng ng, nh ng mu cn l i trong palette s c th hi n b ng nh ng mu g n gi ng nh t. i v i nh ng c a s khng active, d li u s c th hi n b ng nh ng mu g n gi ng nh t trong b ng mu h th ng.

Hnh 6.2 Cch th hi n mu s d ng palette.

V d v cch th hi n mu s d ng palette: o B ng mu h th ng c 12 gi tr mu. Trang 165

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ o B ng mu 1 dng cho c a s 1. C a s 1 ang active nn cc mu c a b ng mu 1 c nh x tr c ti p vo b ng mu h th ng. o B ng mu 2 dng cho c a s 2. C a s 2 khng active nn cc mu 0,2,4,5,6 c nh x vo cc v tr cn tr ng trn b ng mu h th ng; cc mu cn l i c nh x vo nh ng mu g n gi ng nh t c a b ng mu h th ng. *C u trc file bitmap : File bitmap g m 2 ph n: ph n header v ph n d li u nh.

Hnh 6.3 C u trc file bitmap.

o C u trc BITMAPFILEHEADER
Tn tr ng Kch th c ngha

bfType bfSize bfReserved1 bfReserved2 bfOffBits

2 bytes(WORD) 4 bytes(DWORD) 2 bytes(WORD) 2 bytes(WORD) 4 bytes(DWORD)

Lo i file(=BM) Kch th c file(bytes) Khng dng(=0) Khng dng(=0) Kch th c c a ph n BitmapHeader (byte)

o C u trc BITMAPINFO
Tn tr ng Ki u ngha

bmiHeader bmiColors

BITMAPINFOHEADER RGBQUAD*

Cc thng s

nh bitmap

B ng mu c a nh.

o C u trc BITMAPINFOHEADER
Tn tr ng Ki u ngha

biSize

DWORD

Kch th c ph n BITMAPINFO(=40 bytes)

Trang 166

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam Chi u r ng bitmap(theo n v pixel) Chi u cao bitmap(theo n v pixel) S plane. Lun = 1. S bit dng lu gi tr 1 i m nh.

____________________________________________________________________________________ biWidth biHeight biPlanes biBitCount LONG LONG WORD WORD

= 1: nh tr ng en = 4: nh 16 mu = 8: nh 256 mu =16: nh 16 bits =24: nh 24 bits Gi tr ny cho bi t s mu c trong b ng mu bmiColors. biCompression DWORD Hnh th c nn c a d li u nh: - BI_RGB: nh khng nn - BI_RLE8: nn theo hnh th c RLE cho nh 8 bits/pixel - BI_RLE4: nn theo hnh th c RLE cho nh 4 bits/pixel biSizeImage biXPelsPerMeter biYPelsPerMeter biClrUsed biClrImportant DWORD LONG LONG DWORD DWORD Kch th c c a nh( n v byte). Tr ng h p biCompression=BI_RGB th gi tr ny c th = 0. phn gi i (DPI/m) theo phng ngang. Dng trong tr ng h p nh qut t scanner. phn gi i (DPI/m) theo phng d c. Dng trong tr ng h p nh qut t scanner. S mu th c s c dng. N u = 0 th c ngha l dng t t c mu trong b ng mu. S l ng mu quan tr ng dng trong vi c hi n th nh. N u = 0 ht dng t t c mu trong b ng mu.

Trang 167

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ o C u trc RGBQUAD bmiColors l m t m ng ki u RGBQUAD, ch a cc gi tr mu dng cho nh, y chnh l b ng mu c a nh. S l ng ph n t c a bmiColors b ng s mu c a nh. bmiColors ch dng cho nh en tr ng, 16 mu v 256 mu; khi ph n d li u nh cho m i pixel ch l cc index n 1 v tr trong b ng mu ny. i v i nh 16 bits v 24 bits mu, gi tr bmiColors=NULL, b ng mu khng c s d ng n a. Trong tr ng h p ny, n u nh l 16 bits th m i pixel s c bi u di n b ng 1 WORD trong ph n d li u nh, 5 bits th p nh t s lu gi tr mu Blue, 5 bits k s lu gi tr mu Green, v 5 bits sau cng lu gi tr mu Red, bit cao nh t khng c s d ng (L do l nh dng 16 bits bi u di n RGB, ta chia u cho 3 s c nn m i s c R, G, B s c 5 bits bi u di n v d ra 1 bit). nh 24 bits th dng 3 bytes bi u di n cho 3 s c RGB cho m i pixel trong ph n d li u nh.
Tn tr ng Ki u ngha

rgbRed rgbGreen rgbBlue rgbReserved

BYTE BYTE BYTE BYTE

Gi tr thnh ph n RED Gi tr thnh ph n GREEN Gi tr thnh ph n BLUE Khng dng

o C u trc ph n d li u nh (BITMAPDATA): Nh trnh by trn, ph n d li u t p tin bitmap dng lu gi tr index c a mu tng ng v i i m nh trong b ng mu i v i nh c s mu <=256. Cc i m nh c lu tu n t t tri sang ph i theo t ng dng qut(scanline) theo th t t d i ln. i v i nh <=256 mu, cng th c sau: bi t gi tr mu (R,G,B) ng v i 1 i m nh (x,y), s d ng

(R,G,B) c a i m nh i = bmiColors[i] i v i nh 16 v 24 bits mu, ta khng dng palette v cch bi u di n c a ph n d li u c trnh by trn. Ph n d li u c a file bitmap c th c nn theo phng php RLE, ti li u ny khng trnh by chi ti t vo m i lo i nh nn, n u c n cc b n c th tham kh o trong cc gio trnh v x l nh. *Cch t o bitmap t file *.bmp: o c header c a file, l y cc thng tin v nh: r ng, cao, b ng mu

Trang 168

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ o c d li u nh v gi i m(n u c n thi t) vo b nh m. o T o palette mu t b ng mu l y c t file b ng hm CreatePalette. o i palette mu cho thi t b xu t, s d ng cc hm SelectPalette, RealizePalette.

o T o l p bitmap handle b ng hm CreateDIBitmap.


Hnh 6.4 S t ng qut quy trnh n p nh bitmap

V d : N p nh bitmap t file.
void LoadBmp(char *bmpFN, HDC hdc, RECT rect) { try { int FHandle; BITMAPFILEHEADER bmpfh; HANDLE hBmp, hBuff; BITMAPINFO *BmpInfo; unsigned char *Buff; int Count,NumColor; long n, BytesPerLine; Count=0; SetCursor(LoadCursor(NULL, IDC_WAIT)); // M file bitmap c

if ((FHandle=open(bmpFN, O_BINARY|O_RDONLY))==-1) throw "Cannot open the file."; // c header file bitmap

read(FHandle, &bmpfh, sizeof(BITMAPFILEHEADER));

Trang 169

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
hBmp=GlobalAlloc(LMEM_MOVEABLE, bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER)); BmpInfo=(BITMAPINFO*)GlobalLock(hBmp); // c ph n bitmap info v palette mu

read(FHandle, BmpInfo, bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER)); if (BmpInfo->bmiHeader.biCompression != BI_RGB) throw "Program don't support compressed bitmap file."; // Xc nh s mu c a palette

NumColor=(int)pow(2,BmpInfo->bmiHeader.biBitCount); if(NumColor>256) throw "The program supports 256 colors bitmap file only."; // Xc nh s byte cho 1 scanline

BytesPerLine=(bmpfh.bfSize-bmpfh.bfOffBits)/ BmpInfo->bmiHeader.biHeight; /* C p nh t thng tin kch th c nh trn BITMAPINFO (hi n t i = 0 n u nh khng nn) */ BmpInfo->bmiHeader.biSizeImage=bmpfh.bfSize-bmpfh.bfOffBits; // c n i dung file bitmap

hBuff=GlobalAlloc(GMEM_MOVEABLE, BmpInfo->bmiHeader.biSizeImage); Buff=(unsigned char *)GlobalLock(hBuff); If (!Buff) throw "Cannot read the bitmap data."; // do { n = read(FHandle,Buff,BytesPerLine); Buff+=n; c t ng dng trn file

Trang 170

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
Count++; }while (Count<BmpInfo->bmiHeader.biHeight); close(FHandle); GlobalUnlock(hBuff); GlobalUnlock(hBmp); SetCursor(LoadCursor(NULL, IDC_ARROW)); /*-----------------T o palette mu cho nh Bitmap---------------------*/ HANDLE hMemPal; LOGPALETTE far *logPal; HPALETTE hPal; int i; hMemPal=GlobalAlloc(LMEM_MOVEABLE, sizeof(LOGPALETTE)+NumColor*sizeof(PALETTEENTRY)); logPal=(LOGPALETTE far *)GlobalLock(hMemPal); // S m c trong Palette logPal->palNumEntries=NumColor; logPal->palVersion=0x300; //Gn cc gi tr mu RGB cho nh ng Entry trong Palette for (i=0;i<NumColor;i++) //Error here { logPal->palPalEntry[i].peRed=BmpInfo->bmiColors[i].rgbRed; logPal->palPalEntry[i].peGreen = BmpInfo->bmiColors[i].rgbGreen; logPal->palPalEntry[i].peBlue = BmpInfo->bmiColors[i].rgbBlue;

Trang 171

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
logPal->palPalEntry[i].peFlags = PC_RESERVED; } // T o handle cho Palette hPal=CreatePalette(logPal); GlobalUnlock(hMemPal); GlobalFree(hMemPal); If (!hPal) throw "Cannot create palette."; /*------------------------Tao handle bmp file ------------------------------*/ SetCursor(LoadCursor(NULL, IDC_WAIT)); // Map palette vo hdc SelectPalette(hdc,hPal,FALSE); RealizePalette(hdc); BmpInfo=(BITMAPINFO *)LocalLock(hBmp); Buff=(unsigned char *)GlobalLock(hBuff); //T o bitmap hBmp=CreateDIBitmap(hdc,(BITMAPINFOHEADER *)BmpInfo, CBM_INIT, Buff, (BITMAPINFO *)BmpInfo,DIB_RGB_COLORS); GlobalUnlock(hBuff); GlobalUnlock(hBmp); GlobalFree(hBuff); GlobalFree(hBmp); SetCursor(LoadCursor(NULL, IDC_ARROW)); if(!hBmp) throw "Cannot create bitmap."; /*-----------------------Hi n th bitmap ln c a s ---------------------------*/ HDC hMemDC;

Trang 172

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
HANDLE OldBmp; // T o MDC hMemDC=CreateCompatibleDC(hdc); SelectPalette(hMemDC, hPal, FALSE); // Tr v palette h th ng UnrealizeObject(hPal); // Map l i palette RealizePalette(hdc); SelectPalette(hMemDC, hPal, FALSE); // Lin k t hMemDC v i nh bitmap OldBmp=SelectObject(hMemDC, hBmp); // Copy bitmap ln window BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0,SRCCOPY); // H y MDC SelectObject(hMemDC,OldBmp); DeleteDC(hMemDC); } catch(char *e) { MessageBox(NULL, e, "Error", MB_OK|MB_ICONERROR); } }

6.3.3.2. Zoom nh Thao tc zoom nh i h i ph i c hai MDC, m t MDC ngu n MDC ch lu nh c zoom t MDC ngu n. Trang 173 copy nh vo, m t

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam


t ng qut quy trnh zoom nh bitmap

____________________________________________________________________________________
Hnh 6.4 S

V d : zoom nh bitmap l y t bitmap resource.


// L y v kch th c vng client c a c a s RECT rect; GetClientRect(hWnd, &rect); //L y v handle device context c a c a s HDC hdc; hdc = GetDC(hWnd); // T o 2 MDC tng thch v i DC c a c a s HDC hSourceMemDC, hDestMemDC; hSourceMemDC = CreateCompatibleDC(hdc); hDestMemDC = CreateCompatibleDC(hdc); //N p bitmap c n load va t o m t bitmap r ng tng thch hdc HBITMAP hBmp,hOldBmp,hBlankBmp,hOldBlankBmp; hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CUB)); hBlankBmp = CreateCompatibleBitmap(hdc,rect.right,rect.bottom); if(hBmp && hBlankBmp && hSourceMemDC && hDestMemDC) { // Ch n bitmap c n load cho MDC ngu n hOldBmp = (HBITMAP)SelectObject(hSourceMemDC, hBmp); // Ch n blank bitmap cho MDC ch hOldBlankBmp =(HBITMAP)SelectObject(hDestMemDC,hBlankBmp); // L y v thng tin c a nh BITMAP bmpInfo; GetObject(hBmp, sizeof(BITMAP),(BITMAP *)&bmpInfo);

Trang 174

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
// Zoom nh t MDC ngu n sang MDC ch StretchBlt(hDestMemDC, 0, 0, rect.right, rect.bottom,hSourceMemDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY); // Copy nh zoom t MDC ch ln hdc BitBlt(hdc, 0, 0, rect.right, rect.bottom, hDestMemDC, 0,0,SRCCOPY); } // Gi i phng cc bitmap handle, MDC handle SelectObject(hSourceMemDC, hOldBmp); DeleteObject(hBmp); SelectObject(hDestMemDC, hOldBlankBmp); DeleteObject(hBlankBmp); DeleteDC(hSourceMemDC); DeleteDC(hDestMemDC); ReleaseDC(hdc);

6.4. IN N
Trn Windows, cc ng d ng khng truy xu t tr c ti p my in m s dng cc hm GDI v ra device context c a my in. Do vi c in n trn Windows tr nn n gi n, tng t vi c v ra cc h p tho i trn mn hnh. V i c ch ny, ng i l p trnh khng c n quan tm n vi c my in ang s d ng l my in hi u g, lo i no Cc Windows printer device driver s m nh n vi c chuy n d li u c n in sang d ng ph h p v i my in hi n hnh. Ti n trnh in n trn Windows bao g m cc b c sau: L y v device context c a my in c n in. G i yu c u b t u vi c in n (STARTDOC). K t xu t d li u ra my in(c th sang trang _ NEWFRAME n u c n). G i yu c u k t thc vi c in n(ENDDOC). Gi i phng device context my in.

6.4.1. L y v handle device context my in

Trang 175

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ 6.4.1.1. S d ng file win.ini D a vo thng tin v my in m c nh trong file win.ini. File win.ini lu thng tin v my in trong section [windows], entry DEVICE. V d : m t o n c a file win.ini ch a thng tin v my in m c [windows] device = EpsonFX1050, Epson9, LPT1 l cc thng tin v tn my in, driver, v c ng giao ti p v i my tnh. M t s hm chu n c ghi file win.ini c a Windows : nh.

DWORD GetProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize); BOOL WriteProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString); V d : In dng ch ra my in m c
void PrintStrWinInit(char *msg) { char prnInfo[200]; GetProfileString("windows", "device", "NoPrinter", prnInfo, 200); If ( strcmp(prnInfo, "NoPrinter") ) { char prnName[100], prnDriver[100], prnPort[100]; char seps[10]; char *token; strcpy(seps,","); token = strtok(prnInfo, seps); strcpy(prnName, token);

nh.

Trang 176

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
token=strtok(NULL, seps); strcpy(prnDriver, token); token=strtok(NULL, seps); strcpy(prnPort, token); HDC prnDC; prnDC=CreateDC(prnDriver, prnName, prnPort, NULL); if(prnDC) { StartDoc(prnDC, NULL); StartPage(prnDC); TextOut(prnDC, 100, 100, "Your message here:", 18); TextOut(prnDC, 100, 200, msg, strlen(msg)); TextOut(prnDC, 100, 300, "End of printing", 15); EndPage(prnDC); EndDoc(prnDC); DeleteDC(prnDC); } } }

6.4.1.2. S d ng h p tho i Print M t cch khc n gi n hn l y v handle device context c a m t my in b t k thay v my in m c nh l s d ng h p tho i in chu n c a Windows. H p tho i in chu n c kch ho t b ng hm PrintDlg (hm ny c nh ngha trong module COMMDLG.DLL), h p tho i ny cho php ng i dng thi t l p cc thng s in n.

Trang 177

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Hnh 6.4 H p tho i in

K t qu tr v c a hm PrintDlg l m t handle device context c a my in ch n. V d : In dng ch ra my in c ch n t h p tho i in chu n.


void PrintStrPrintDlg(char *msg) { PRINTDLG pd; ZeroMemory(&pd, sizeof(PRINTDLG)); pd.lStructSize = sizeof(PRINTDLG); pd.hwndOwner = GetFocus(); pd.Flags = PD_RETURNDC|PD_NOSELECTION; if(PrintDlg(&pd)) { StartDoc(pd.hDC, NULL); StartPage(pd.hDC); TextOut(pd.hDC, 100, 100, "Your message here:", 18);

Trang 178

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
TextOut(pd.hDC, 100, 200, msg, strlen(msg)); TextOut(pd.hDC, 100, 300, "End of printing", 15); EndPage(pd.hDC); EndDoc(pd.hDC); DeleteDC(pd.hDC); } }

6.4.2. Cc hm i u khi n in n
Hm int StartDoc(hDC, lpDocInfo) ngha

B t u tc v in n 1 ti li u trong file c tn lpDocInfo, hDC l handle printer device context. K t thc tc v in n. H y tc v in hi n hnh. B t u trang m i.

int EndDoc(hDC) int AbortDoc(hDC) int StartPage(hDC) int EndPage(hDC) int SetAbortDoc( hDC, MyAProc )

K t thc 1 trang. Ch nh hm (MyAProc) x l tr ng h p ng i dng mu n ng t ngang tc v in.

B ng 6.2 Cc hm i u khi n in n

6.4.3. X l l i khi in
Trong qu trnh in b ng vi c s d ng cc hm i u khi n in n, n u cc thao tc thnh cng th lun tr v gi tr l n hn 0. N u c l i, dng hm DWORD GetLastError(VOID) Win2000 m i h tr hm ny). l y v m l i (ch WinNT v

Trang 179

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________

Chng 7 QU N L B
7.1. M U

NH

V T P TIN

M t ti n trnh thng th ng c hi u l m t chng trnh my tnh ang c thi hnh. Qu trnh th c thi cc ti n trnh g n li n v i vi c qu n l v s d ng cc ti nguyn trong my tnh, trong ng k nh t l qu n l b nh chnh v x l h th ng lu tr ph . Trong cc h th ng my tnh hi n i, b nh chnh l trung tm c a cc thao tc, x l. B nh chnh c th xem nh m t m ng cc ph n t ki u BYTE ho c WORD, c xc nh thng qua a ch c a chng. M i chng trnh c nh x vo b nh chnh tr c khi c thi hnh v c h i u hnh qu n l thng qua t p l nh xc nh. Trong su t qu trnh thi hnh, cc chng trnh v i d li u truy xu t c a chng lun c t trong b nh chnh. Nhng b nh chnh th kh nh c th lu gi m i d li u v chng trnh, ngoi ra d li u s m t khi khng cn c cung c p nng l ng. Do , c n ph i s d ng h th ng lu tr ph . Chng ny trnh by cc v n trn qua hai ph n sau : ph n 7.2 - Qu n l b nh - trnh by cch th c Microsoft Win32 API qu n l cc vng nh thng qua cc hm c p pht, s d ng, v gi i phng chng; cch th c thao tc trn a ch vng nh o v cc trang nh . Ph n 7.3 - X l t p tin - trnh by cc hm th c hi n cc thao tc t o, x l v h y t p tin, cng nh tm hi u m t s v n lin quan n t p tin.

7.2. QU N L B

NH

M i ti n trnh trong Win32 u c m t vng a ch o 32-bit cho php nh v vng nh n 4 GB. a ch o ny khng ph i l vng nh v t l th c t . Windows s d ng m t c u trc d li u nh x chuy n i a ch o thnh vng nh v t l. Vng a ch o c a m i ti n trnh th ng l n hn r t nhi u so v i vng nh v t l th c s trn my tnh. Do , tng vng nh cho cc ti n trnh ang th c hi n, h th ng s d ng vng nh tr ng trn a. Vng nh v t l v vng a ch o c a m i ti n trnh c t ch c thnh cc trang, ph thu c vo h my tnh. V d , i v i my tnh h x86, m i trang c kch th c l 4 KB.

Trang 180

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ tng kh nng linh ng trong vi c qu n l b nh , h th ng c th di chuy n cc trang t b nh chnh vo a v ng c l i. Cc thao tc ny c th c hi n ch b i h th ng, cc ng d ng ch vi c g i cc hm c p pht v s d ng vng a ch o. Th vi n C chu n h tr cc hm c p pht v gi i phng vng nh nh malloc, free, , ho c trong C++ l new, delete, . Th nhng trong Windows 16 bits, cc hm ny c th gy l i h th ng. Trong Win32, ta c th s d ng chng an ton do h th ng ch qu n l b nh qua cc trang v t l m khng nh h ng n a ch o. Hn n a, Win32 cng khng phn bi t gi a con tr g n v con tr xa. M c d v y, cc hm trn khng th hi n cc kh nng h tr c a vi c qu n l b nh trong Win32. Chng ta s lm quen v i cc hm Global v Local - s d ng t Windows 16 bits, v cc hm qu n l vng nh o khc.

7.2.1. Cc hm Global v Local


Cc hm ton c c (global) v a phng (local) l cc hm heap Windows 16 bits. Tuy nhin, qu n l b nh trong Win32 cng h tr cc hm ny c th s d ng cc chng trnh, ho c source code c a cc chng trnh vi t cho Windows 16 bits. Cc hm ton c c v a phng x l ch m v t ch c nng hn cc hm qu n l b nh m i thi t k cho Win32. Chng ta s lm quen cc hm m i ph n sau. c p pht vng nh cho m t ti n trnh, ta c th s d ng hm GlobalAlloc ho c LocalAlloc. Vi c qu n l vng nh trong Win32 khng phn bi t hm ton c c hay c c b nh trong Windows 16 bits. Do , khng c s phn bi t gi a cc i t ng vng nh c c p pht b i hai hm trn. Thm vo , vi c chuy n m hnh o n vng nh 16 bits sang vng a ch o 32 bits th c hi n m t s hm ton c c v a phng v i cc ch n l a (options) khng c n thi t ho c v ngha. V d , v c c p pht ton c c v a phng u tr v a ch o 32 bits, do khng xc nh d ng con tr g n ho c xa trong cc hm trn. Hai hm ny c p pht m t vng nh theo kch th c nBytes trong heap. C prototype nh sau : HGLOBAL GlobalAlloc(UINT uFlags, DWORD nBytes); HLOCAL LocalAlloc(UINT uFlags, UINT nBytes); Trong uFlags xc
Ton c c GMEM_FIXED

nh cch th c c p pht vng nh . Ta c b ng sau :


a phng LMEM_FIXED ngha

C p pht vng nh c nh. Gi tr tr v l m t con tr . C p pht vng nh

GMEM_MOVEABLE

LMEM_MOVEABLE

Trang 181

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam khng c nh. Trong Win32, kh i nh khng bao gi di chuy n trong vng nh v t l, nhng trong heap m c nh. Hm tr v handle c a m t i t ng b nh . Ta dng hm GlobalLock ho c LocalLock chuy n handle sang con tr vng nh .

____________________________________________________________________________________

GMEM_ZEROINIT

LMEM_ZEROINIT

Kh i t o n i dung vng nh v i gi tr 0.
GMEM_FIXED | GMEM_ZEROINIT GMEM_MOVEABLE | GMEM_ZEROINIT

GPTR GHND LPTR LHND

LMEM_FIXED | LMEM_ZEROINIT LMEM_MOVEABLE | LMEM_ZEROINIT

B ng 7.1 Cc c s d ng trong cc hm GlobalAlloc v LocalAlloc

Ch : Khng th s d ng gi tr GMEM_FIXED ng th i v i GMEM_MOVEABLE, ho c LMEM_FIXED ng th i v i LMEM_MOVEABLE. N u thnh cng, hm tr v handle cho tr tr v l NULL. i t ng vng nh c c p pht. Ng c l i, gi

Cc i t ng vng nh c c p pht b ng hm GlobalAlloc v LocalAlloc l cc trang ring, truy c p c-ghi b i chnh ti n trnh t o n. Cc ti n trnh khc khng th truy c p cc i t ng vng nh ny. Khi dng cch th c c p pht GMEM_MOVEABLE ho c LMEM_MOVEABLE, ta nh n c handle vng nh . s d ng vng nh , ta dng hm GlobalLock ho c LocalLock : LPVOID GlobalLock(HGLOBAL hMem); LPVOID LocalLock(HLOCAL hMem); N u thnh cng hm tr v con tr tr tr v l NULL. n byte u tin trong kh i nh . Ng c l i, gi tr

Trang 182

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Khi kho (lock) vng nh , cc kh i nh khng th d ch chuy n trong b nh my tnh. Sau khi s d ng con tr vng nh , c n m kho (unlock) chng, h th ng c th di chuy n v s d ng cc vng nh linh ng cho cc ti n trnh khc. Ta dng hai hm tng ng l GlobalUnlock v LocalUnlock. BOOL GlobalUnlock(HGLOBAL hMem); BOOL LocalUnlock(HLOCAL hMem); M i l n kho vng nh , bi n m tng ng tng m t n v . M i l n m kho, bi n m gi m m t. N u vng nh cn kho, hm tr v gi tr khc 0, ng c l i gi tr tr v l 0. Kch th c th t s c a vng nh c c p pht c th l n hn kch th c yu c u (nBytes). xc nh s byte th t s c c p pht, ta dng hm GlobalSize v LocalSize. DWORD GlobalSize(HGLOBAL hMem); UINT LocalSize(HLOCAL hMem); N u thnh cng, hm tr v s byte kch th c vng nh xc gi tr tr v l 0. nh b i hMem. Ng c l i, c p pht thay i

Ngoi ra, ta c th s d ng hm GlobalReAlloc v LocalReAlloc kch th c ho c thu c tnh vng nh .

HGLOBAL GlobalReAlloc(HGLOBAL hMem, DWORD nBytes, UINT uFlags); HLOCAL LocalReAlloc(HLOCAL hMem, UINT nBytes, UINT nFlags); Tr ng nBytes xc nh kch th c c p pht l i cho vng nh hMem. Tuy nhin, khi nFlags ch a GMEM_MODIFY (ho c LMEM_MODIFY), h th ng b qua gi tr ny. Khi , hm thay i cc thu c tnh c a vng nh . xc nh handle c a vng nh khi bi t con tr vng nh , ta dng hm GlobalHandle v LocalHandle nh sau : HGLOBAL GlobalHandle(LPCVOID pMem); HLOCAL LocalHandle(LPCVOID pMem); V i pMem l con tr tr n byte u tin trong vng nh . N u thnh cng, hm tr v handle c n tm. Ng c l i, gi tr tr v l NULL. nh Sau khi s d ng xong, ta dng hm GlobalFree v LocalFree c c p pht. Trang 183 gi i phng cc vng

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ HGLOBAL GlobalFree(HGLOBAL hMem); HLOCAL LocalFree(HLOCAL hMem); N u thnh cng, gi tr tr v l NULL. Ng c l i, hm tr v gi tr handle c a t ng ban u. i

o n chng trnh sau minh h a cch h th ng c p pht m t vng nh v i kch th c yu c u l 3500 bytes. Sau gn cc gi tr vng nh b ng 0x3C.
HANDLE hMem; LPBYTE lpAddress; int i, nSizeMem; hMem = GlobalAlloc(GMEM_MOVEABLE, 3500); if(hMem != NULL) { /* Vng nh c th l n hn 3500 */ nSizeMem = GlobalSize(hMem); lpAddress = (LPBYTE)GlobalLock(hMem); if(Address != NULL) { for(i=0; i<nSizeMem; i++) lpAddress[i] = 0x3C; GlobalUnlock(hMem); /* */ } /* N u khng dng n a th g i hm GlobalFree(hMem); */ }

Trang 184

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ o n chng trnh ti p theo c p pht l i vng nh trn v i kch th c l 5000 bytes, kh i gn cc gi tr l 0x00 :
HANDLE hMemTmp; hMemTmp = GlobalReAlloc(hMem, 5000, GMEM_MOVEABLE|GMEM_ZEROINIT); if(hMemTmp != NULL) { hMem = hMemTmp; nSizeMem = GlobalSize(hMem); /* */ } /* Khi k t thc s d ng, c n g i hm GlobalFree(hMem); */

7.2.2 Cc hm Heap
Cc hm heap cho php cc ti n trnh t o m t vng heap ring cho m t ho c m t s trang trong vng a ch c a ti n trnh ang th c hi n. Sau ti n trnh c th s d ng m t t p cc hm khc nhau qu n l vng nh trong heap ny. y khng c s phn bi t gi a vng nh c c p pht b i hm heap ring hay dng cc hm c p pht khc. u tin hm HeapCreate t o i t ng heap cho m t ti n trnh. Vng nh heap ny ch c dng cho ti n trnh ny m thi, v khng chia s cho cc ti n trnh khc, ngay c cc ti n trnh trong th vi n lin k t ng DLL (dynamic-link library). HANDLE HeapCreate(DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize); Tr ng flOptions xc nh cc thu c tnh c ch n cho vng heap m i c kh i t o. C th l HEAP_GENERATE_ EXCEPTIONS v HEAP_NO_SERIALIZE. Tr ng dwInitialSize xc nh kch th c kh i t o c a heap, c lm trn cho cc trang vng nh . Tr ng dwMaximumSize xc nh vng nh t i a c th c p pht cho ti n trnh b ng hm Trang 185

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ HeapAlloc ho c HeapReAlloc. Hm tr v handle c a i t ng heap n u thnh cng, ng c l i tr v NULL. c p pht vng nh l n HeapReAlloc. u, ta g i hm HeapAlloc. N u mu n c p pht l i, dng hm

LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes); Tr ng dwFlags c th l HEAP_GENERATE_ EXCEPTIONS, HEAP_NO_SERIALIZE, v HEAP_ZERO_ MEMORY. Tr ng dwBytes xc nh s bytes vng heap c c p pht. N u thnh cng, hm tr v con tr n vng nh . N u th t b i, hm tr v NULL n u dwFlags khng thi t l p HEAP_ GENERATE_EXCEPTIONS. N u c thi t l p, gi tr tr v l STATUS_NO_MEMORY (khng c s n vng nh ho c l i vng heap), ho c STATUS_ACCESS_VIOLATION (Do l i vng heap ho c bi n khng chnh xc). LPVOID HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, DWORD dwBytes); Tr ng lpMem tr n vng nh c n c p pht l i. Vng nh ny c t o b ng hm HeapAlloc ho c HeapReAlloc. Tr ng dwBytes xc 0x7FFF8. nh kch th c vng nh c n c p pht. Gi tr ny ph i nh hn

kho v m kho vng nh heap, ta dng hm HeapLock v HeapUnlock. BOOL HeapLock(HANDLE hHeap); BOOL HeapUnlock(HANDLE hHeap); N u thnh cng, gi tr tr v khc 0. Ng c l i, hm tr v 0. xc nh kch th c vng heap, ta dng hm HeapSize.

DWORD HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem); Trong hm ny, dwFlags ch dng v i HEAP_NO_ SERIALIZE. Cc tr ng khc tng t cc hm khc. N u thnh cng, hm tr v kch th c vng nh . N u th t b i, hm tr v gi tr l 0xFFFFFFFF. Sau khi s d ng, ta gi i phng vng nh v h y HeapDestroy. i t ng heap b ng hm HeapFree v

BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);

Trang 186

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ BOOL HeapDestroy(HANDLE hHeap); Trong , tr ng dwFlags c nh ngha ch v i gi tr HEAP_NO_SERIALIZE. N u thnh cng, hai hm ny u tr v gi tr khc 0. Ng c l i, gi tr tr v l 0. Chng ta khng minh h a cc hm s d ng b nh heap trong ti li u ny.

7.2.3 Cc hm Virtual
Microsoft Win32 API cung c p m t t p cc hm qu n l b nh o cho php m t ti n trnh thao tc v xc nh cc trang trong vng a ch khng gian o, g m cc ch c nng sau : dnh vng khng gian a ch o cho m t ti n trnh. Vng khng gian dnh khng c p pht vng lu tr v t l th t s , nhng ngn khng cho cc thao tc c p pht khc s d ng vng nh ny. N khng nh h ng n cc ti n trnh khc. Khi c n s d ng, ti n trnh s c p pht vng lu tr v t l cho khng gian ny. C p pht xc nh n chu i cc trang dnh trong khng gian a ch o c a ti n trnh c th s d ng vng lu tr v t l (trong RAM ho c a). Thi t l p cc thu c tnh c-ghi, ch c, ho c khng c truy c p cho cc trang xc nh n. i u ny khc v i cc hm c p pht chu n lun c p pht c p pht cc trang v i thu c tnh l c-ghi. Gi i phng chu i cc trang dnh, s n vng a ch o cho cc thao tc c p pht c a ti n trnh ang g i. Kh xc nh n cc trang xc nh n b ng cch gi i phng vng lu tr v t l, s n cho cc thao tc c p pht c a cc ti n trnh khc. Kho m t ho c m t vi trang vng nh xc nh n vo vng nh v t l (RAM) h th ng c th hon chuy n cc trang vo t p tin trang. Nh n thng tin v chu i cc trang trong vng a ch o c a ti n trnh ang g i ho c c a m t ti n trnh xc nh khc. Thay i cc ch c nng b o v truy c p cho chu i xc nh cc trang xc nh n trong vng a ch o c a ti n trnh ang g i ho c ti n trnh xc nh khc. 7.2.3.1 C p pht vng nh o c p pht

Cc hm qu n l b nh o th c hi n cc thao tc trn cc trang vng nh . cc trang vng nh o, ta dng hm VirtualAlloc, v i cc ch c nng sau y : dnh m t hay nhi u trang tr ng. C p pht xc nh n m t hay nhi u trang dnh. dnh v c p pht xc nh n m t hay nhi u trang tr ng.

Chng ta c th ch nh a ch u c a cc trang dnh hay c p pht, ho c cho h th ng t xc nh n a ch . Hm s lm trn a ch ch nh v i bin trang thch h p. Vng nh c c p pht c kh i gn b ng 0, n u ta khng thi t l p c MEM_RESET.

Trang 187

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ LPVOID VirtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect); Tr ng lpAddress xc nh a ch b t u c a vng c p pht. N u vng nh ang dnh, a ch ch nh c lm trn n bin 64 KB k ti p. N u vng nh dnh v ang c xc nh n, a ch s c lm trn n bin trang k . xc nh kch th c c a trang, ta s d ng hm GetSystemInfo. N u bi n ny b ng NULL, h th ng t xc nh n a ch vng nh c p pht. Tr ng dwSize xc nh s byte kch th c vng nh . N u lpAddress b ng NULL, gi tr ny s c lm trn n bin trang k . N u khng, cc trang c p pht l cc trang ch a m t hay nhi u byte n m trong kho ng t lpAddress n lpAddress+dwSize. Ngha l, n u hai byte n m hai trang th c hai trang u n m trong vng c p pht. Tr ng flAllocationType xc
C MEM_COMMIT

nh d ng c p pht, c th k t h p t cc c :
ngha

C p pht vng lu tr v t l trong b nh ho c a. Cc trang c c p pht xc nh n ho c kh c p pht u c th c c p pht l i m khng gy ra l i. dnh vng khng gian a ch o c a ti n trnh. Khng th c p pht vng dnh b ng cc hm c p pht b nh khc (malloc, GlobalAlloc, ) cho n khi chng c gi i phng. Chng ch c c p pht b ng hm VirtualAlloc. p d ng cho Windows NT. Khi thi t l p v i gi tr ny, d li u c xem nh khng quan tr ng, c th b vi t ch ng ln. ng d ng khng hon chuy n d li u t b nh chnh vo (ra) t p tin trang. M t khc, khi thi t l p gi tr ny, h th ng s b qua cc gi tr c a flProtect. C p pht vng nh t i th . a ch cao nh t c

MEM_RESERVE

MEM_RESET

MEM_TOPDOWN

B ng 7.2 Cc c xc

nh d ng c p pht flAllocationType.

Tr ng flProtect xc nh cch th c b o v truy c p vng nh . N u cc trang c c p pht xc nh n, m t trong cc c sau c th c thi t l p, k t h p v i cc c PAGE_GUARD v PAGE_NOCACHE : Trang 188

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam


ngha

____________________________________________________________________________________
C PAGE_READONLY PAGE_READWRITE PAGE_EXECUTE

Ch cho php

c cc trang c p pht (khng c ghi). c v ghi cc trang vng nh . c v

Cho php truy c p

Cho php th c thi cc ti n trnh, nhng khng ghi. Cho php th c thi v

PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE PAGE_GUARD

c, nhng khng c ghi. c v ghi.

Cho php th c thi,

Cc trang trong vng tr thnh cc trang "lnh canh". N u ghi ho c c cc trang ny, h th ng s pht sinh l i ngo i l STATUS_PAGE_GUARD v t t tnh tr ng c a trang lnh canh. Xem thm v d trong ph n 7.2.3.4. C m truy c p ( c, ghi, th c thi) cc trang. N u truy c p, ta c l i b o v chung. m. Thch h p v i cc ch Khng dng b nh v trang hn l NO_ACCESS.
nh d ng b o v truy c p flProtect.

PAGE_NOACCESS

PAGE_NOCACHE

b o

B ng 7.3 Cc c xc

N u thnh cng, hm tr v tr v l NULL. 7.2.3.2 Gi i phng vng nh

a ch c s c a cc trang vng c p pht. Ng c l i gi tr o

gi i phng vng nh o, ta dng hm VirtualFree. Hm gi i phng ho c kh c p pht (ho c c hai) cc trang trong khng gian a ch o c a ti n trnh ang g i. BOOL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwType); Tr ng lpAddress l con tr tr n vng cc trang c n gi i phng. N u dwType ch a c MEM_RELEASE, y ph i l con tr tr v t hm VirtualAlloc. Tr ng dwSize xc nh s byte kch vng nh c n gi i phng. N u dwType ch a c MEM_RELEASE, gi tr ny c n thi t l p b ng 0. Trong cc tr ng h p khc, vng nh h ng s l cc trang c t nh t m t byte n m trong o n lpAddress n lpAddress + dwSize. Ngha l, n u c 2 byte n m bin hai trang khc nhau, th c hai trang u c gi i phng.

Trang 189

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Tr ng dwType xc nh cch gi i phng, s d ng gi tr MEM_DECOMMIT, ho c MEM_RELEASE. V i gi tr u, hm gi i phng cc trang ch nh ( c xc nh n c p pht). N u cc trang cha c c p pht, ta v n c th kh c p pht (decommit) m khng gy ra l i. V i gi tr sau, hm gi i phng vng nh dnh. Trong tr ng h p ny, dwSize ph i b ng 0, n u khng hm th c hi n th t b i. N u thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v l 0. Lu gi i phng cc trang, cc trang ph i cng tnh tr ng (c p pht hay dnh), v t t c cc trang dnh b ng hm c p pht VirtualAlloc c n gi i phng ng th i. N u m t s trang dnh ban u c xc nh n c p pht, chng c n c kh c p pht tr c khi g i hm VirtualFree gi i phng. 7.2.3.3 Thao tc trn cc trang vng nh xc nh kch th c cc trang trn my tnh, ta s d ng hm GetSystemInfo.

VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo); Tr ng lpSystemInfo tr n c u trc SYSTEM_INFO ch a cc thng tin h th ng.

typedef struct _SYSTEM_INFO // sinf { union { DWORD dwOemId; struct { WORD wProcessorArchitecture; WORD wReserved; } }; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress;

Trang 190

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
LPVOID lpMaximumApplicationAddress; DWORD dwActiveProcessorMask; DWORD dwNumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcessorRevision; }SYSTEM_INFO;

xc nh thng tin v b nh , ta ch kh o st m t s tr ng lin quan. Tr ng dwPageSize cc nh kch th c cc trang theo d ng c c p pht b ng hm VirtualAlloc. Tr ng lpMinimumApplicationAddress tr n a ch vng nh th p nh t, v tr ng lpMaximumApplicationAddress tr n a ch vng nh cao nh t c th truy c p b i cc ng phn nh m vng d ng v th vi n lin k t ng. Tr ng dwAllocationGranularity xc nh nh o c p pht. C th , hm VirtualAlloc yu c u c p pht m t byte s dnh m t vng khng gian b nh c kch th c l dwAllocationGranularity byte. Ti n trnh c th kho m t hay nhi u trang c c p pht (xc nh n) vo vng nh v t l (RAM), ngn ch n vi c h th ng hon chuy n cc trang vo (ra) t p tin trang b ng cch dng hm VirtualLock. BOOL VirtualLock(LPVOID lpAddress, DWORD dwSize); m kho cc trang b kho, ta dng hm VirtualUnlock, cho php cc trang c th c hon chuy n vo (ra) t p tin trang trn a. BOOL VirtualUnlock(LPVOID lpAddress, DWORD dwSize); n a ch c s c a vng cc trang c n c kho. Tr ng Tr ng lpAddress tr dwSize xc nh s byte vng nh c n kho, g m cc trang ch a t t c cc a ch t lpAddress n lpAddress + dwSize. N u thnh cng, gi tr tr v khc 0. Ng c l i, cc hm tr v 0. S trang m c nh c c p pht t i a l 30 trang. Tuy nhin, chng ta c cng th thay i s trang t i a ny. Cc trang c n m kho khng nh t thi t ph i l cc trang c a l n g i kho b ng hm VirtualLock tr c , nhng u ph i l cc trang ang b kho. Trang 191

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Khc v i cc hm GlobalLock v LocalLock c dng m t bi n m m chu i cc l n kho vng nh , hm VirtualLock th khng. Do m kha, ta ch c n g i hm VirtualUnlock m t l n m thi. 7.2.3.4 S d ng cc hm qu n l b nh o dnh v xc nh n

Trong ph n ny, chng ta minh h a b ng v d th c hi n thao tc vng nh , v v d t o trang "lnh canh".

u tin, ta s d ng hm VirtualAlloc v VirtualFree c p pht dnh Trong v d v xc nh n vng nh o. u tin, hm VirtualAlloc c g i c p pht dnh m t kh i cc trang. Ta s d ng gi tr NULL cho a ch c s , ng ngha v i vi c cho h th ng t xc nh v tr vng c p pht. Sau s d ng l i hm VirtualAlloc c p pht xc nh n cc trang trong vng dnh. Khi , ta c n ch nh a ch c s cho cc trang ny. Trong v d ny, ta s d ng c u trc try-except xc nh n cc trang trong vng dnh. M i khi c l i trang xu t hi n trong qu trnh th c hi n kh i try, hm l c tr c kh i except s c th c hi n. N u hm l c c th c p pht m t trang khc, ph n th c thi s ti p t c trong kh i try t i c i i m xu t hi n l i ngo i l . Ng c l i, cc handler ngo i l trong kh i except c th c thi. Nh m t thay th cho c p pht ng, ti n trnh c th n gi n c p pht xc nh n vng cn l i thay v ch dnh chng. Tuy nhin vi c c p pht xc nh n nh v y l i t o nn cc kh i nh khng c n thi t ng ra c s d ng cho cc ti n trnh khc. Trong v d ny, ta s d ng hm VirtualFree gi i phng vng nh xc nh n l n vng nh dnh sau khi hon t t cng vi c. Hm ny c g i hai l n : l n u kh c p pht cc trang c c p pht xc nh n, v l n sau gi i phng ton b cc trang d i d ng dnh.
#define PAGELIMIT 80 #define PAGESIZE 0x1000 INT PageFaultExceptionFilter(DWORD); VOID MyErrorExit(LPTSTR); LPTSTR lpNxtPage; DWORD dwPages = 0; VOID UseDynamicVirtualAlloc(VOID) {

Trang 192

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
LPVOID lpvBase; LPTSTR lpPtr; BOOL bSuccess; DWORD i; /* dnh cc trang trong khng gian a ch o c a ti n trnh */

lpvBase = VirtualAlloc( NULL, // h th ng t xc nh a ch

PAGELIMIT*PAGESIZE,// kch th c vng c p pht MEM_RESERVE, // c p pht d i d ng dnh

PAGE_NOACCESS); // cch th c b o v = khng truy c p if (lpvBase == NULL ) MyErrorExit("VirtualAlloc reserve"); lpPtr = lpNxtPage = (LPTSTR) lpvBase; /* S d ng c u trc x l ngo i l try-exception truy c p cc trang. N u l i trang xu t hi n, b l c ngo i l s th c thi c p pht xc nh n cc trang k ti p trong kh i dnh */ for (i=0; i < PAGELIMIT*PAGESIZE; i++) { try { lpPtr[i] = 'a'; // Ghi vo b nh } /* N u xu t hi n l i trang, c g ng c p pht xc nh n trang khc */ except ( PageFaultExceptionFilter(GetExceptionCode() ) ) { /* o n ny ch th c hi n khi hm l c khng th xc nh n trang k ti p */

Trang 193

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
ExitProcess( GetLastError() ); } } /* Gi i phng cc trang sau khi s d ng. bSuccess = VirtualFree( lpvBase, // a ch c s c a kh i nh u tin l cc trang c c p pht xc nh n */

dwPages*PAGESIZE, // s byte cc trang c p pht MEM_DECOMMIT); // hnh th c l kh xc nh n /* Cu i cng, gi i phng ton vng nh ( if (bSuccess) { bSuccess = VirtualFree( lpvBase, // a ch c s c a kh i nh dnh) */

0, // gi i phng ton kh i nh MEM_RELEASE); // gi i phng (hon ton) } } INT PageFaultExceptionFilter(DWORD dwCode) { LPVOID lpvResult; /* N u xu t hi n l i ngo i l , thot chng trnh */ if (dwCode != EXCEPTION_ACCESS_VIOLATION) { printf("exception code = %d\n", dwCode); return EXCEPTION_EXECUTE_HANDLER;

Trang 194

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
} printf("page fault\n"); /* N u cc trang dnh c dng th thot */

if (dwPages >= PAGELIMIT) { printf("out of pages\n"); return EXCEPTION_EXECUTE_HANDLER; } /* Ng c l i, c p pht xc nh n m t trang khc */ lpvResult = VirtualAlloc( (LPVOID) lpNxtPage, // c p pht trang ti p theo PAGESIZE, // s byte kch thu c trang MEM_COMMIT, // c p pht xc nh n cc trang PAGE_READWRITE); // truy c p if (lpvResult == NULL ) { printf("VirtualAlloc failed\n"); return EXCEPTION_EXECUTE_HANDLER; } /* Tng trang dwPages++; lpNxtPage += PAGESIZE; /* Ti p t c th c hi n ni l i trang xu t hi n */ return EXCEPTION_CONTINUE_EXECUTION; } m, v chuy n lpNxtPage n trang ti p */ c-ghi

Trang 195

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ o n chng trnh ti p theo th c hi n thao tc t o trang "lnh canh". Trang ny cung c p c nh bo khi truy c p cc trang vng nh . i u ny r t h u ch cho cc ng d ng c n qu n l s m r ng c a c u trc d li u ng. t o trang lnh canh, ta thi t l p c PAGE_GUARD trong hm VirtualAlloc. C ny c th dng k t h p v i t t c cc c khc, tr c PAGE_NOACCESS. N u chng trnh truy c p trang "lnh canh", h th ng s pht sinh l i ngo i l STATUS_GUARD_PAGE (0x80000001). H th ng cng xo c PAGE_GUARD, lo i b tnh tr ng "lnh canh" c a trang vng nh . H th ng s khng ng ng truy c p trang vng nh v i l i ngo i l STATUS_GUARD_PAGE. N u m t l i ngo i l xu t hi n trong su t d ch v h th ng, d ch v s tr v gi tr xc nh l i. N u sau ta truy c p l i trang ny (m cha thi t l p l i tnh tr ng "lnh canh"), th s khng x y ra l i ngo i l n a. Chng trnh sau minh h a cch th c hi n c a m t trang lnh canh, v hi n t ng xu t hi n l i d ch v h th ng :
#include <windows.h> #include <stdio.h> #include <stdlib.h> int main() { LPVOID lpvAddr; DWORD cbSize; BOOL vLock; LPVOID commit; cbSize = 512; // Vng nh c n c p pht. /* G i hm c p pht */ lpvAddr=VirtualAlloc(NULL,cbSize,MEM_RESERVE, PAGE_NOACCESS); if(lpvAddr == NULL) {

Trang 196

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
fprintf(stdout,"VirtualAlloc failed on RESERVE with %ld\n", GetLastError()); } /* C p pht xc nh n vng nh */ commit = VirtualAlloc(NULL,cbSize,MEM_COMMIT, PAGE_READONLY|PAGE_GUARD); if(commit == NULL) { fprintf(stderr,"VirtualAlloc failed on COMMIT with %ld\n", GetLastError()); } else { fprintf(stderr,"Committed %lu bytes at address %lp\n", cbSize,commit); } /* Kho vng nh xc nh n */

vLock = VirtualLock(commit,cbSize); if(!vLock) { fprintf(stderr,"Cannot lock at %lp, error = %lu\n", commit, GetLastError()); } else fprintf(stderr,"Lock Achieved at %lp\n",commit); /* Kho vng nh l n n a */

Trang 197

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
vLock = VirtualLock(commit,cbSize); if(!vLock) { fprintf(stderr,"Cannot get 2nd lock at %lp, error = %lu\n", commit, GetLastError()); } else fprintf(stderr,"2nd Lock Achieved at %lp\n",commit); }

Chng trnh trn cho k t qu tng t k t qu sau : Committed 512 bytes at address 003F0000 Cannot lock at 003F0000, error = 0x80000001 2nd Lock Achieved at 003F0000 Ch : L n kho th nh t th t b i, t o l i ngo i l STATUS_GUARD_PAGE. Tuy nhin, trong l n kho th hai, hm th c hi n thnh cng, do h th ng lo i b tnh tr ng "lnh canh" c a trang.

7.3 X

L T P TIN

T p tin l m t n v lu tr c b n my tnh phn bi t cc kh i thng tin khc nhau, c lu tr trn cc thi t b lu tr ph nh l a, bng t , v c t ch c theo cc nhm g i l th m c. x l t p tin, ta c th dng cc hm trong C chu n nh fopen, fclose, fread, fwrite, fseek, trong mi tr ng Windows. Cc hm ny c h tr trong th vi n stdio.h. Chng ta s khng bn v cc hm ny y. Trong ph n ny, chng ta s tm hi u cc hm thao tc trn t p tin c a Win32 cho php cc ng d ng t o, m , c p nh t v xo cc t p tin, cng nh tm hi u cc thng s h th ng v t p tin.

7.3.1 T o v m t p tin
Win32 API cung c p hm CreateFile s n. Trang 198 t o m t t p tin m i ho c m m t t p tin c

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); n chu i k t zero xc nh tn t p tin c n m ho c t o. Tr ng lpFileName tr Tr ng dwDesiredAccess xc nh cch th c truy c p i t ng. M t ng d ng c th th c hi n truy c p c, ghi, c-ghi, s d ng m t hay k t h p cc gi tr sau :
Gi tr 0 ngha

Xc nh truy v n thi t b n m t i t ng. M t ng d ng c th truy v n thu c tnh thi t b m khng c n ph i truy c p thi t b . Xc l p hnh th c truy c p c. D li u c th c t t p tin, ng th i d ch chuy n con tr t p tin. truy c p c-ghi, ta k t h p v i c GENERIC_WRITE. Xc l p hnh th c truy c p ghi. D li u c th c ghi vo t p tin, ng th i d ch chuy n con tr . c th truy c p c-ghi, ta k t h p v i c GENERIC_READ.
nh cch truy c p i t ng

GENERIC_READ

GENERIC_WRITE

B ng 7.4 Tr ng dwDesiredAccess xc

Tr ng dwShareMode thi t l p cc bit c xc nh cch chia s i t ng (t p tin). N u dwShareMode b ng 0, i t ng khng th chia s . Khi , ta khng th thao tc trn i t ng chia s i t ng, ta k t h p m t trong cc c sau : cho n khi ng handle.
FILE_SHARE_DELETE

S d ng trong Windows NT : Thao tc trn i t ng ch th c hi n n u yu c u truy c p xo. Thao tc trn i t ng ch th c hi n n u yu c u truy c p c. Thao tc trn i t ng ch th c hi n n u yu c u truy c p ghi.
nh cch chia s i t ng

FILE_SHARE_READ

FILE_SHARE_WRITE

B ng 7.5 Tr ng dwShareMode xc

Trang 199

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Tr ng lpSecurityAttributes tr n c u trc SECURITY_ATTRIBUTES xc nh handle i t ng c c chuy n cho cc ti n trnh con hay khng. y chng ta khng dng, v thi t l p gi tr l NULL. Tr ng dwCreationDisposition xc l p thao tc t o t p tin m i hay m t p tin c. Dng m t trong cc gi tr sau :
CREATE_NEW

T o m i m t t p tin. Hm ny th t b i n u t p tin c. T o m i m t t p tin. N u t p tin t n t i, hm s t o ch ng ln, ng th i xo cc thu c tnh hi n hnh c a t p tin. M m t t p tin. Hm th t b i n u t p tin cha c s n. M m t t p tin n u c s n. N u t p tin cha t n t i, hm s t o t p tin nh s d ng c CREATE_NEW. M m t t p tin. Khi m , h th ng kh i t o kch th c t p tin l i v 0 byte. Ti n trnh g i c n m t p tin t nh t v i d ng truy c p GENERIC_WRITE. Hm th t b i n u khng t n t i t p tin.

CREATE_ALWAYS

OPEN_EXISTING

OPEN_ALWAYS

TRUNCATE_EXISTING

B ng 7.6 Tr ng dwCreationDisposition xc l p thao tc t p tin

Tr ng dwFlagsAndAttributes xc h p cc thu c tnh sau :


FILE_ATTRIBUTE_ARCHIVE

nh cc thu c tnh v c cho t p tin. Ta c th k t

T p tin archive. ng d ng dng thu c tnh ny nh d u t p tin c th sao lu ho c lo i b . T p tin n. Khng hi n th trong danh sch cc t p tin thng th ng trong cc th m c. T p tin khng c thu c tnh no khc. Thu c tnh ny th ng c dng duy nh t. D li u t p tin khng c s n. D li u c ch di chuy n v t l vo vng lu tr offline. T p tin ch c. nh

FILE_ATTRIBUTE_HIDDEN

FILE_ATTRIBUTE_NORMAL

FILE_ATTRIBUTE_OFFLINE

FILE_ATTRIBUTE_READONLY

ng d ng khng th ghi ho c xo

Trang 200

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam d li u trong t p tin.

____________________________________________________________________________________

FILE_ATTRIBUTE_SYSTEM

T p tin l m t ph n c a h i u hnh, ho c c s d ng c bi t trong h th ng. T p tin c dng cho vng lu tr t m. Sau khi ng d ng k t thc, t p tin s c xa.
nh cc thu c tnh v c cho t p tin.

FILE_ATTRIBUTE_TEMPORARY

B ng 7.7 Tr ng dwFlagsAndAttributes xc

Cc c xc nh t p tin kh ph c t p, chng ta khng bn k y. Tr ng cu i cng l hTemplateFile xc nh handle truy c p GENERAL_READ n t p tin t m. T p tin t m c vai tr h tr cc thu c tnh t p tin v thu c tnh m r ng cho t p tin c t o. Trong Windows 95, gi tr hTemplateFile c n c gn b ng NULL. N u thnh cng hm tr v handle c a t p tin xc INVALID_HANDLE_VALUE. nh. Ng c l i, gi tr tr v l

Lu , vi c thi t l p gi tr dwDesiredAccess cho php ng d ng c th truy v n cc thu c tnh thi t b m khng th c s truy c p thi t b . i u ny r t h u d ng, v d trong tr ng h p ng d ng mu n xc nh kch th c cng cc nh d ng a m m m khng c n ph i c a trong a. Khi t o m t t p tin, hm CreateFile th c hi n cc ch c nng sau: K t h p cc c v thu c tnh t p tin c xc nh b i c dwFlagsAndAttributes v i gi tr l FILE_ATTRIBUTE_ARCHIVE. Thi t l p kch th c t p tin b ng 0. Chp cc thu c tnh m r ng c a t p tin t m vo t p tin m i n u bi n hTemplateFile xc nh. Khi m m t t p tin c s n, hm CreateFile th c hi n cc ch c nng sau : K t h p cc c xc nh b i dwFlagsAndAttributes v i cc thu c tnh c a t p tin hi n c. Hm CreateFile s b qua cc thu c tnh c a t p tin xc nh b i c dwFlagsAndAttributes. Thi t l p kch th c t p tin d a vo gi tr c a dwCreationDisposition. B qua gi tr c a bi n hTemplateFile. N u hm t o m t t p tin trn a m m khng c a m m, ho c trn CD-ROM khng c a CD, h th ng s a ra m t h p tho i thng i p (message box) yu c u ng i dng a a m m ho c a CD vo. h th ng khng th c hi n thao tc trn, c n thi t l p gi tr uMode trong hm SetErrorMode l SEM_FAILCRITICALERRORS.

Trang 201

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ UINT SetErrorMode(UINT uMode); Trong v d sau, hm CreateFile m m t t p tin c


HANDLE hFile; hFile = CreateFile("MYFILE.TXT", // m t p tin MYFILE.TXT GENERIC_READ, // m c c

c:

FILE_SHARE_READ, // chia s NULL, // khng b o m t

OPEN_EXISTING, // ch m t p tin c FILE_ATTRIBUTE_NORMAL, //T p tin th ng NULL); // khng c th c tnh t m if (hFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open file."); // l i x l }

xo t p tin trn, tr c h t ta ng t p tin l i.


CloseHandle(hFile); DeleteFile("MYFILE.TXT");

Trong v d sau, hm t o m t t p tin m i v m


HANDLE hFile;

ch

ghi.

hFile = CreateFile("MYFILE.TXT", // t p tin MYFILE.TXT GENERIC_WRITE, // t o 0, // khng chia s NULL, // khng b o m t CREATE_ALWAYS, // ghi ch ng n u c ghi

Trang 202

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
FILE_ATTRIBUTE_NORMAL | // t p tin bnh th ng FILE_FLAG_OVERLAPPED, // khng NULL); // khng thu c tnh t m if (hFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open file."); // l i x l } ng b I/O

7.3.2 T o t p tin t m
Cc ng d ng c th nh n m t t p tin duy nh t cho t p tin t m b ng cch s d ng hm GetTempFileName. xc nh ng d n n th m c ch a t p tin t m c t o, ta dng hm GetTempPath. Hm GetTempFileName t o tn m t t p tin t m. Tn t p tin y g m ng d n n i v i m t chu i k t s th p l c phn th hi n tn t p tin, v ph n m r ng l .TMP. UINT GetTempFileName(LPCTSTR lpPathName, LPCTSTR lpPrefixString, UINT uUnique, LPTSTR lpTempFileName); Tr ng lpPathName tr n m t chu i k t (k t thc b ng k t NULL) xc d n c a t p tin, dng cc k t ANSI. N u tr ng ny b ng NULL, hm th t b i. nh ng

Tr ng lpPrefixString tr n m t chu i k t (k t thc b ng k t NULL). Hm s d ng 3 k t u tin c a chu i nh ph n ti n t c a t p tin. Cc k t s d ng ph i l ky t ANSI. Tr ng uUnique xc nh m t s nguyn khng d u (m) hm chuy n thnh chu i k t th p l c phn s d ng trong vi c t o t p tin t m. Tr ng lpTempFileName tr n vng nh m ch a tn t p tin t m. Tr ng ny l m t chu i k t k t thc NULL cc k t ANSI. di vng nh m c xc nh b i gi tr MAX_PATH c a th m c tng ng. T p tin t o c s c d ng nh sau : path\preuuuu.TMP

Trang 203

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ Trong path l ng d n, xc nh b i gi tr lpPathName; pre l 3 k t uc a chu i lpPrefixString; v uuuu l gi tr th p l c phn c a uUnique. Khi thot kh i h ng b xo. i u hnh (t t my ch ng h n), cc t p tin t m t o b ng hm ny s t t o

trnh cc l i khi chuy n chu i ANSI, ng d ng c n g i hm CreateFile tr c t p tin t m.

N u gi tr uUnique b ng 0, hm GetTempFileName xc l p m t con s duy nh t d a trn th i i m hi n t i c a h th ng. N u t p tin c, h th ng t tng ln m t s m i cho n khi c m t tn duy nh t. N u th c hi n thnh cng, hm tr v con s duy nh t xc Ng c l i, gi tr tr v l 0. nh trong tr ng uUnique.

thu nh n ng d n t p tin t m, ta dng hm GetTempPath. DWORD GetTempPath(DWORD nBufferLength, LPTSTR lpBuffer); Tr ng nBufferlength xc nh kch th c vng m chu i k t xc nh b i lpBuffer. Tr ng lpBuffer tr n vng m nh n chu i k t xc nh ng d n t p tin t m. Chu i k t k t th c b ng k t \, v d : C:\TEMP\. N u thnh cng, hm tr v l n xc nh kch th c chu i zero. N u gi tr tr v l n hn nBufferLength, gi tr tr v s l kch th c vng m c n ch a ng d n. Ng c l i, gi tr tr v l 0 n u hm th t b i.

7.3.3 Sao chp v di chuy n t p tin


chp (copy) m t t p tin, ta c n m chp vo m t t p tin m i. ch ch c. Sau dng hm CopyFile

BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists); Tr ng lpExistingFileName v lpNewFileName tr n chu i (k t thc NULL) xc nh tn t p tin c v tn t p tin m i. Tr ng bFialIfExists xc nh cch t o t p tin v i tn m i trn. N u tr ng c thi t l p l TRUE, v t p tin c tn lpNewFileName t n t i, hm th t b i. N u tr ng c thi t l p l FALSE v t p tin t n t i, hm s t o t p tin m i ch ng ln t p tin c. N u thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v l 0.

Trang 204

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ di chuy n (move) m t t p tin, tr c h t c n ph i ng t p tin l i (n u ang m ). Ta dng hm MoveFile. Hm ny th c hi n thao tc i tn m t t p tin hay th m c (bao g m c cc t p tin con trong th m c). BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName); Hai tr ng trn l n l t tr n tn t p tin (th m c) hi n c v tn t p tin (th m c) m i. Tn t p tin (th m c) m i c n ph i cha c trong ng d n c a n. Tn t p tin m i c th trn m t h th ng hay a khc, trong khi tn th m c m i ph i cng a v i th m c c. N u thnh cng, gi tr tr v khc 0. Ng c l i, gi tr tr v l 0. V d sau minh h a vi c t o v s d ng t p tin t m copy m t t p tin. u tin ng d ng m t p tin ORIGINAL.TXT b ng cch s d ng hm CreateFile. Sau ng d ng s d ng hm GetTempFileName v CreateFile t o t p tin t m. ng d ng c t ng kh i 4K d li u vo vng m, chuy n n i dung trong vng m sang ch hoa, v vi t chng xu ng t p tin t m. Sau khi chuy n ton b t p tin trn sang t p tin t m, ta i t p tin t m thnh ALLCAPS.TXT b ng cch dng hm MoveFile.
HANDLE hFile; HANDLE hTempFile; DWORD dwBytesRead, dwBytesWritten, dwPos; char szTempName[MAX_PATH]; char buffer[4096]; /* M t p tin c s n */ hFile = CreateFile("ORIGINAL.TXT", // tn t p tin GENERIC_READ, // m 0, // khng chia s NULL, // khng b o m t OPEN_EXISTING, // t p tin c s n FILE_ATTRIBUTE_NORMAL, // t p tin thng th ng NULL); // khng thu c tnh t m if (hFile == INVALID_HANDLE_VALUE) c

Trang 205

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
{ ErrorHandler("Could not open file."); // x l l i } /* T o t p tin t m */ GetTempFileName("\\TEMP", // th m c ch a t p tin t m "NEW", // ph n u t p tin t m

0, // t o tn duy nh t szTempName); // vng m tn

hTempFile = CreateFile((LPTSTR) szTempName, // tn t p tin GENERIC_READ | GENERIC_WRITE, // m d ng 0, // khng chia s NULL, // khng b o m t CREATE_ALWAYS, // t o ch ng n u t p tin c FILE_ATTRIBUTE_NORMAL, // t p tin thng th ng NULL); // khng thu c tnh t m if (hTempFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not create temporary file."); } /* c kh i 4K vo vng vo t p tin t m. */ do { if (ReadFile(hFile, buffer, 4096, &dwBytesRead, NULL)) { m. Chuy n t t c cc k t trong vng m sang d ng ch hoa. Vi t vng m c-ghi

Trang 206

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
CharUpperBuff(buffer, dwBytesRead); WriteFile(hTempFile, buffer, dwBytesRead, &dwBytesWritten, NULL); } } while (dwBytesRead == 4096); /* ng c hai t p tin */ CloseHandle(hFile); CloseHandle(hTempFile); /* Chuy n t p tin t m vo t p tin m i ALLCAPS.TXT */ if (!MoveFile(szTempName, "ALLCAPS.TXT")) { ErrorHandler("Could not move temp. file."); }

Hm CloseHandle ng m t t p tin ang m . Xem ph n 7.3.6.

7.3.4

c v ghi d li u vo t p tin

M i t p tin ang m c m t con tr t p tin xc nh byte k ti p s c c ho c ghi. Khi m t t p tin m l n u tin, h th ng thi t l p con tr t p tin t i v tr u t p tin. M i khi c ho c ghi vo m t byte, con tr t p tin t ng d ch chuy n. thay i v tr ny, ta dng hm SetFilePointer. DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); Tr ng hFile l handle c a t p tin ch a con tr t p tin c n di chuy n. Handle ny c n c t o d i d ng truy c p GENERIC_READ ho c GENERIC_WRITE. Tr ng lDistanceToMove v lpDistanceToMoveHigh xc nh s byte con tr c n d ch chuy n. N u lpDistanceToMoveHigh b ng NULL, 32-bit th p c a lDistanceToMove xc nh s byte c n di d i con tr . Ng c l i, hai tr ng trn thi t l p m t gi tr 64-bit (khng d u) th hi n s byte c n di d i con tr . Tr ng dwMoveMethod xc nh i m g c m con tr c n di d i. N u tr ng ny b ng FILE_BEGIN, i m g c l i m u tin (byte th 0) c a t p tin. N u l FILE_CURRENT,

Trang 207

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ i m g c l v tr hi n t i c a con tr . V FILE_END xc nh i m g c l v tr cu i hi n t i c a t p tin. N u thnh cng, v lpDistanceToMoveHigh b ng NULL, gi tr tr v l DWORD th p c a con tr t p tin. N u lpDistanceToMoveHigh khc NULL, hm tr v DWORD th p c a con tr t p tin, v tr tr ng ny n DWORD cao c a con tr t p tin. N u hm th t b i v lpDistanceToMoveHigh b ng NULL, gi tr tr v l 0xFFFFFFFF. bi t thm thng tin l i, ta dng hm GetLastError. N u hm tr v 0xFFFFFFFF v lpDistanceToMoveHigh, c th hm thnh cng ho c th t b i, c n ph i g i hm GetLastError xc nh. o n chng trnh sau trnh by v n ny :
/* Tr ng h p 1: G i hm v i lpDistanceToMoveHigh == NULL */ /* C g ng di chuy n con tr t p tin c a hFile m t o n */ dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN); if (dwPtr == 0xFFFFFFFF) // Ki m tra th t b i { dwError = GetLastError() ; // Nh n m l i . . . // X l l i } // Cu i ph n x l l i

/* Tr ng h p 2: G i hm v i lpDistanceToMoveHigh != NULL */ /* C g ng di chuy n con tr t p tin hFile m t o n di */ dwPtrLow = SetFilePointer(hFile, lDistLow, & lDistHigh, FILE_BEGIN); /* Ki m tra th t b i */ if (dwPtrLow==0xFFFFFFFF&&(dwError=GetLastError())!=NO_ERROR) { // X l l i // . . . } // Cu i ph n x l l i

Trang 208

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ di chuy n ti n, ta thi t l p d ch chuy n m t gi tr dng. Ng c l i, thi t l p gi tr m di chuy n li con tr t p tin. N u gi tr con tr t p tin sau khi d ch chuy n m, hm th t b i, v m l i m hm GetlastError tr v l ERROR_NEGATIVE_SEEK. N u mu n di chuy n con tr SetEndOfFile. n cu i t p tin ghi ti p, ta cng c th dng hm

BOOL SetEndOfFile(HANDLE hFile); Tr ng hFile l handle c a t p tin c n di chuy n con tr n cu i t p tin c n c t o v i d ng truy c p GENERAL_WRITE. N u thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v l 0. Hm ReadFile c d li u t m t t p tin, t i m xc nh b i con tr t p tin. Sau khi c, con tr t p tin d ch chuy n m t o n ng v i s byte th t s c c. Tng t , ghi vo t p tin ta dng hm WriteFile. BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); Handle t p tin hFile c n c t o v i d ng truy c p GENERAL_READ ho c GENERAL_WRITE. Tr ng lpBuffer tr n vng nh m nh n d li u c t t p tin, hay ch a d li u c n ghi. Tr ng nNumberOfBytesToRead xc nh s byte c n c. Tr ng lpNumberOfBytesRead tr n cc byte c c. Hm ReadFile thi t l p gi tr ny b ng 0 tr c khi th c hi n cc thao tc khc ki m tra l i. Tr ng nNumberOfBytesToWrite xc nh s byte c n ghi. N u tr ng ny b ng 0, hm khng ghi d li u, nhng v n c g i th c hi n. Tr ng lpNumberOfBytesWritten xc nh s byte ghi c, tr ng ny cng c hm WriteFile thi t l p v 0 tr c khi th c hi n cc thao tc khc ki m tra l i. Cu i cng, tr ng lpOverlapped tr n c u trc OVERLAPPED. N u t p tin c m v i c FILE_FLAG_OVERLAPPED, gi tr ny ph i khc NULL. n gi n ta thi t l p gi tr b ng NULL, hm s c (ghi) t p tin t v tr con tr hi n t i v hm ch tr k t qu v sau khi c (ghi) xong. Hm ReadFile s d ng v i m t s l do sau : thao tc ghi hon t t cu i ng ng ghi, c h t s byte yu c u, ho c x y ra l i khi c. Trang 209

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ N u thnh cng, cc hm tr v gi tr khc 0. Ng c l i, gi tr tr v b ng 0.

7.3.5 Kho v m kho t p tin


M c d h th ng cho php nhi u ng d ng c th m v ghi vo cng m t t p tin, cc ng d ng khng nn th c hi n song song. ngn ch n ng d ng khc ghi vo ph n d li u c a mnh, ta c th s d ng hm LockFile. m kho t p tin, cho php cc ng d ng khc truy c p vng d li u, ta dng hm UnlockFile. BOOL LockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh); BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh); Tr ng hFile l handle c a t p tin c m d i d ng GENERAL_READ ho c GENERAL_WRITE, ho c c hai. offset Tr ng dwFileOffsetLow v dwFileOffsetHigh xc u tin c n kho hay m kho. nh word th p v cao c a byte

Tr ng nNumberofBytesToLockLow (nNumberofBytesTo UnlockLow) v nNumberOfBytesToLockHigh (nNumberOf BytesToUnlockHigh) xc nh word th p v cao di kho ng byte c n kho hay m kha. N u thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v l 0. V d sau y n i m t t p tin vo m t t p tin khc. ng d ng s d ng hm CreateFile m t p tin ONE.TXT c, v TWO.TXT vi t. Sau ng d ng n i ph n d li u c a t p tin ONE.TXT vo cu i t p tin TWO.TXT b ng cch c (dng hm ReadFile) v ghi (dng hm WriteFile) t ng kh i 4K d li u. Tr c khi vi t vo t p tin th hai, ng d ng d ch chuy n con tr n cu i t p tin b ng cch dng hm SetFilePointer, sau kha vng c n ghi dng hm LockFile. Sau khi th c hi n thao tc ghi xong, ta m kho, dng hm UnlockFile, cc ng d ng khc c th s d ng t p tin ny.
HANDLE hFile; HANDLE hAppend; DWORD dwBytesRead, dwBytesWritten, dwPos; char buff[4096]; /* M m t t p tin c */

Trang 210

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
hFile = CreateFile("ONE.TXT", // m t p tin ONE.TXT GENERIC_READ, // m 0, // khng chia s NULL, // khng b o m t OPEN_EXISTING, // ch m t p tin t n t i FILE_ATTRIBUTE_NORMAL, // t p tin bnh th ng NULL); // khng c thu c tnh t m if (hFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open ONE."); // x l l i } /* M t p tin c. N u cha c, t o t p tin m i */ hAppend = CreateFile("TWO.TXT", // m t p tin TWO.TXT GENERIC_WRITE, // m 0, // khng chia s NULL, // khng b o m t OPEN_ALWAYS, // m t p tin c ho c t o m i FILE_ATTRIBUTE_NORMAL, // t p tin bnh th ng NULL); // khng c thu c tnh t m if (hAppend == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open TWO."); // x l l i } /* N i t p tin th nh t vo cu i t p tin th hai. Kho t p tin th hai c p khi ang ghi. M kho sau khi ghi xong */ ngn ch n cc ti n trnh khc truy ghi c

Trang 211

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________
do { if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) { dwPos= SetFilePointer(hAppend, 0, NULL, FILE_END); LockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0); WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL); UnlockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0); } } while (dwBytesRead == 4096); /* ng c hai t p tin */ CloseHandle(hFile); CloseHandle(hAppend);

7.3.6 ng v xo t p tin
s d ng hi u qu ti nguyn h th ng, ng d ng c n ng cc t p tin khi khng c n dng n a b ng cch g i hm CloseHandle. N u ng d ng b ng t v t p tin v n ang m , h th ng s t ng ng t p tin ny. BOOL CloseHandle(HANDLE hObject); N u thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v l 0. tin l i m r ng, ta dng hm GetLastError. khi b xa. BOOL DeleteFile(LPCTSTR lpFileName); Tr ng lpFileName tr n chu i (k t thc b ng k t NULL) xc nh t p tin c n xo. N u thnh cng, hm tr v kh tr khc 0. Ng c l i, gi tr tr v l 0. Hm th t b i n u t p n u bi t cc thng

xo m t t p tin, ta dng hm DeleteFile. Lu r ng t p tin ny c n ph i ng tr c

Trang 212

NGN NG

L P TRNH

L P TRNH C TRN WINDOWS Created pdf by Nam Nguyen http://360.yahoo.com/fptnam

____________________________________________________________________________________ t p tin c n xo khng t n t i. Trong Windows NT, hm khng th xo cc t p tin ang m . Tuy nhin, trong Windows 95, t p tin ang m v n c th b xo.

7.3.7 X l th m c
nh. Khi ng d ng t o m t t p tin m i, h i u hnh s thm t p tin ny vo m t th m c xc t o v xo m t th m c, ta dng hm CreateDirectory v RemoveDirectory.

BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); BOOL RemoveDirectory(LPCTSTR lpPathName); Tr ng lpPathName tr n chu i (k t thc b ng k t NULL) xc nh ng d n th m c c n t o (hay c n xo). Kch th c chu i m c nh gi i h n cho ng d n l MAX_PATH k t . Trong tr ng h p xo th m c, ng d n c n xc nh th m c l th m c r ng. Tr ng lpSecurityAttributes tr n c u trc SECURITY_ATTRIBUTES ch a tr ng lpSecurityDescriptor xc nh m t m t c a th m c m i. n gi n, ta gn gi tr lpSecurityAttributes b ng NULL, khi th m c m i nh n cc gi tr m t m t m c nh. N u thnh cng, cc hm tr v gi tr khc 0. Ng c l i, gi tr tr v l 0. xc nh th Th m c cu i c a ng d n ang s d ng g i l th m c hi n hnh. m c hi n hnh, ng d ng g i hm GetCurrentDirectory. thay i th m c hi n hnh, ng d ng g i hm SetCurrentDirectory. DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer); Tr ng nBufferLength xc hi n hnh. Vng m ny ph i di ch a chu i k t ny. nh kch th c vng m c a chu i k t th hi n th m c ch a c k t NULL cu i chu i. Tr ng lpBuffer s

N u thnh cng, hm tr v gi tr xc nh s k t c ghi vo vng m, khng ch a k t NULL. Ng c l i, gi tr tr v l 0. N u vng m lpBuffer khng l n, gi tr tr v xc nh kch th c c n thi t c a vng m, g m c byte NULL ng d u k t thc chu i. BOOL SetCurrentDirectory(LPCTSTR lpPathName); Tr ng lpPathName tr n chu i k t (k t thc b ng NULL) xc N u thnh cng, hm tr v gi tr khc 0. Ng c l i, gi tr tr v l 0. nh ng d n m i.

Trang 213

You might also like