LẬP TRÌNH C TRÊN WINDOWS

Embed Size (px)

Citation preview

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

LP TRNH C TRN WINDOWS

Trang 1

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Chng 1 TNG QUAN LP TRNH C TRN WINDOWS1.1. M U lp trnh trn Microsoft Windows, chng ta cn nm c cc c im c bn nht ca h iu hnh ny. Chng ny s gii thiu khi qut cc c im h iu hnh Microsoft Windows, cc vn lin quan n lp trnh bng ngn ng C, ng thi a ra mt chng trnh mu lm sn cho cc chng trnh c vit sau ny. Trong phn u, chng ta tm hiu s lc lch s pht trin ca h iu hnh Microsoft Windows v nhng c im nn tng ca Windows. Phn tip theo s trnh by nhng khi nim v yu cu cn bn ca vic lp trnh C trn Windows. Ngoi ra, phn ny cng gii thiu cc c ch v cc cng c m h iu hnh cung cp cho ngi lp trnh hay ngi pht trin cc ng dng trn Windows. Cui chng l phn xy dng mt chng trnh n gin nht trn Windows. Chng trnh ny c xem nh l khun mu ca mt chng trnh ng dng in hnh, v hu ht cc on chng trnh c vit minh ha trong sch u ly chng trnh ny lm khung sn pht trin cho ph hp vi tng yu cu. Thm vo , mt s kiu d liu mi c nh ngha trn Windows v nhng qui c v cch t tn bin cng c gii thiu trong phn ny. Phn chi tit v chuyn su hn ca vic lp trnh bng ngn ng C trn mi trng Windows s c trnh by trong cc chng tip theo.

1.2. H IU HNH MICROSOFT WINDOWS 1.2.1. Gii thiuGia thp nin 80, cng ty phn mm my tnh Microsoft cng b phin bn u tin ca dng h iu hnh Windows l Microsoft Windows 1.0. y l h iu hnh dng giao din ha khc vi giao din k t (text hay console) ca MS-DOS. Tuy nhin phi n phin bn th hai (Windows 2.0 - thng 11 nm 1987) th mi c bc ci tin ng k, l s m rng giao tip gia bn phm v thit b chut v giao din ha (GUI-Graphic User Interface) nh trnh n (menu) v hp thoi (dialog). Trong phin bn ny Windows ch yu cu b vi x l Intel 8086 hay 8088 chy real-mode truy xut 1 megabyte b nh. Thng 5 nm 1990, Microsoft cng b phin bn tip theo l Windows 3.0. S thay i ln trong phin bn ny l Windows 3.0 h tr protected-mode 16 bit ca cc b vi x l 286, 386, v 486 ca Intel. S thay i ny cho php cc ng dng trn Windows truy xut 16 megabyte b nh. Tip bc vi s pht trin l phin bn Windows 3.1 ra i nm 1992, Microsoft a cng ngh Font TrueType, m nhc (multimedia), lin kt v nhng i tng (OLE- Object Linking and Embedding), v a ra cc hp thoi chung c chun ha.

Trang 2

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Trong s pht trin mnh m ca nhng thp nin 90, Microsoft cng b tip dng h iu hnh Windows vi ng dng cng ngh mi (1993). H iu hnh ny ly tn l Windows NT (Windows New Technology), y l phin bn h iu hnh u tin ca Windows h tr 32 bit cho b x l 386, 486 v Pentium. Trong h iu hnh ny th cc ng dng phi truy xut b nh vi a ch l 32-bit v cc tp lnh hay ch th 32-bit. Ngoi ra Windows NT cng c thit k chy cc b vi x l (CPU) khc ngoi Intel v c th chy trn cc my trm (workstation). H iu hnh Windows 95 c cng b nm 1995 cng l mt h iu hnh 32-bit cho Intel 386 tr v sau. Tuy thiu tnh bo mt nh Windows NT v vic thch nghi vi my trm cng ngh RISC, nhng b li h iu hnh ny yu cu phn cng khng cao. Song song vi s pht trin phn mm th cng ngh phn cng cng pht trin khng km. tn dng sc mnh ca phn cng th cc th h Windows tip theo ngy cng hon thin hn. Nh Windows 98 pht trin t Window 95 v c nhiu ci thin nh hiu nng lm vic, h tr cc thit b phn cng tt hn, v cui cng l vic tch hp cht ch vi Internet v Word Wide Web. Windows 2000 l h iu hnh c xem l n nh v tt ca dng Windows, phin bn ny tng cng cc tnh nng bo mt thch hp trong mi trng mng v giao din p.

1.2.2. c im chung ca h iu hnh Microsoft WindowsWindows l mt h iu hnh s dng giao tip ngi dng ha (GUI), hay cn gi l h iu hnh trc quan (Visual interface). GUI s dng ha da trn mn hnh nh nh phn (Bitmapped video display). Do tn dng c ti nguyn thc ca mn hnh, v cung cp mt mi trng giu tnh trc quan v sinh ng. Windows khng n iu nh MS-DOS (hay mt s h iu hnh giao din console) m mn hnh c s dng ch th hin chui k t, do ngi dng g t bn phm (keyboard) hay xut thng tin dng vn bn. Trong giao din ngi dng ha, mn hnh giao tip vi ngi s dng a dng hn, ngi dng c th nhp d liu thng qua chut bng cch nhn vo cc nt nhn (button) cc hp chn (combo box)thit b by gi c nhp, c th l bn phm v thit b chut (mouse device). Thit b chut l mt thit b nh v trn mn hnh, s dng thit b chut ngi dng c th nhp d liu mt cch trc quan bng cch kch hot mt nt lnh, hay lm vic vi cc i tng ha lin quan n ta trn mn hnh. giao tip trong mi trng ha, Windows a ra mt s cc thnh phn gi l cc iu khin chung (common control), cc iu khin chung l cc i tng c a vo trong hp thoi giao tip vi ngi dng. Bao gm : hp vn bn (text box), nt nhn (button), nt chn (check box), hp danh sch (list box), hp chn (combo box) Tht ra mt ng dng trn Windows khng phi l qu phc tp v chng c hnh thc chung. Chng trnh ng dng thung chim mt phm vi hnh ch nht trn mn hnh gi l mt ca s. Trn cng ca mi ca s l thanh tiu (title bar). Cc chc nng ca chng trnh th c lit k trong thc n la chn ca chng trnh (menu) , hay xut hin di dng trc quan hn l cc thanh cng c (toolbar). Cc thanh cng c ny cha cc chc nng c s dng thng xuyn trong thc n gim thi gian cho ngi dng phi m thc n v Trang 3

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

chn. Thng thng khi cn ly thng tin hay cung cp thng tin cho ngi dng th mt ng dng s a ra mt hp thoi, trong hp thoi ny s cha cc iu khin chung giao tip vi ngi dng. Windows cng ra to mt s cc hp thoi chun nh Open Files, v mt s hp thoi tng t nh nhau. Windows l mt h iu hnh a nhim, ty thuc vo b nh m ta c th chy nhiu ng dng cng mt lc, v cng c th ng thi chuyn qua li gia cc ng dng v thc thi chng. Trong cc phin bn ca Windows 98 v NT tr v sau, cc chng trnh ng dng t bn thn chng chia thnh nhiu tiu trnh (thread) x l v vi tc x l nhanh to cm gic nhng chng trnh ng dng ny chy ng thi vi nhau. Trong Windows, chng trnh ng dng khi thc thi c chia s nhng th tc m Windows cung cp sn, cc tp tin cung cp nhng th tc trn c gi l th vin lin kt ng (Dynamic Link Libraries - DLL). Windows c c ch lin kt nhng chng trnh ng dng vi cc th tc c cung cp trong th vin lin kt ng. Kh nng tng thch ca Windows cng rt cao. Cc chng trnh ng dng c vit cho Windows khng truy xut trc tip phn cng ca nhng thit b ho nh mn hnh v my in. M thay vo , h iu hnh cung cp mt ngn ng lp trnh ha (gi l Giao tip thit b ho - Graphic Device Interface - GDI) cho php hin th nhng i tng ha mt cch d dng. Nh vy mt ng dng vit cho Windows s chy vi bt c thit b mn hnh no hay bt k my in, min l ci t trnh iu khin thit b h tr cho Windows. Chng trnh ng dng khng quan tm n kiu thit b kt ni vi h thng. Nh gii thiu phn trn khi nim lin kt ng l thnh phn quan trng ca Windows, n c xem nh l ht nhn ca h iu hnh, v bn thn ca Windows l cc tp th vin lin kt ng. Windows cung cp rt nhiu hm cho nhng chng trnh ng dng ci t giao din ngi dng v hin th vn bn hay ha trn mn hnh. Nhng hm ny c ci t trong th vin lin kt ng hay cn gi l DLL. l cc tp tin c dng phn m rng l *.DLL hay *.EXE, hu ht c cha trong th mc \Windows\System, \Windows\system32 ca Windows 98 v cc th mc \WinNT\System, \WinNT\System32 ca Windows NT. Trong cc phin bn sau ny, h thng lin kt ng c to ra rt nhiu, tuy nhin, hu ht cc hm c gi trong th vin ny phn thnh 3 n v sau: Kernel, User, v GDI. Kernel cung cp cc hm v th tc m mt ht nhn h iu hnh truyn thng qun l, nh qun l b nh, xut nhp tp tin v tc v. Th vin ny c ci t trong tp tin KRNL386.EXE 16 bit v KERNEL32.DLL 32 bit. User qun l giao din ngi dng, ci t tt c khung ca s mc lun l. Th vin User c ci t trong tp tin USER.EXE 16 bit v USER32.DLL 32 bit. GDI cung cp ton b giao din thit b ho (Graphics Device Interface), cho php chng trnh ng dng hin th vn bn v ho trn cc thit b xut phn cng nh mn hnh v my in.

Trang 4

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Trong Windows 98, th vin lin kt ng cha khong vi ngn hm, mi hm c tn c t, v d CreateWindow, hm ny dng to mt ca s cho ng dng. Khi s dng cc hm m Windows cung cp cho th cc ng dng phi khai bo trong cc tp tin tiu .h hay .hpp (header file). Trong mt chng trnh Windows, c s khc bit khi ta gi mt hm ca th vin C v mt hm ca Windows hay th vin lin kt ng cung cp. l khi bin dch m my, cc hm th vin C s c lin kt thnh m chng trnh. Trong khi cc hm Windows s c gi khi chng trnh cn dng n ch khng lin kt vo chng trnh. thc hin c cc li gi ny th mt chng trnh Windows *.EXE lun cha mt tham chiu n th vin lin kt ng khc m n cn dng. Khi , mt chng trnh Windows c np vo b nh s to con tr tham chiu n nhng hm th vin DLL m chng trnh dng, nu th vin ny cha c np vo b nh trc th by gi s c np.

1.3. LP TRNH TRN MICROSOFT WINDOWS 1.3.1. c im chungWindows l h iu hnh ha trc quan, do d cc ti nguyn ca h thng cung cp rt a dng i hi ngi lp trnh phi nghin cu rt nhiu pht hay ht sc mnh ca h iu hnh. Theo nh nhng mc ch tip cn ca cc nh lp trnh th cc ng dng trn Windows phi ht sc thn thin vi ngi dng thng qua giao din ha sn c ca Windows. V l thuyt th mt ngi dng lm vic c vi mt ng dng ca Windows th c th lm vic c vi nhng ng dng khc. Nhng trong thc t s dng mt ng dng cho t hiu qu cao trong Windows th cn phi c mt s hun luyn tr gip hay ti thiu th phi cho bit chng trnh ng dng lm vic nh th no. a s cc ng dng trong Windows u c chung mt giao din tng tc vi ngi dng ging nhau. V d nh cc ng dng trong Windows a s u c thanh thc n cha cc mc nh : File, Edit, Tool, Help V trong hp thoi th thng cha cc phn t iu khin chung nh : Edit Control, Button Control, Checkbox.

1.3.2. S khc bit vi lp trnh trn MS-DOSKhi mi bc vo lp trnh trn Windows a s ngi hc rt l lm, nht l nhng ngi tng lm vic vi MS-DOS. Do MS-DOS l h iu hnh n nhim v giao tip qua giao din console. Nn khi vit chng trnh khng phc tp. Cn i vi Windows ngi lp trnh s lm vic vi b cng c lp trnh ha a dng cng vi cch x l a nhim, a lung ca Windows. V vy vic lp trnh trn Windows s gip cho ngi lp trnh nhm chn vi giao din console ca MS-DOS. Vic c gng pht huy cc sc mnh ti nguyn ca Windows s lm cho nhng ng dng cng mnh m, a dng, thn thin, v d s dng.

1.3.3. Mt s yu cu i vi ngi lp trnhTrang 5

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

iu trc tin ca ngi hc lp trnh C trn Windows l phi bit lp trnh C, sch ny khng c tham vng hng dn ngi hc c th thng tho lp trnh C trn Windows m cha qua mt lp hun luyn C no. Tuy nhin, khng nht thit phi hon ton thng tho C mi hc c lp trnh Windows. c th lp trnh trn nn Windows ngoi yu cu v vic s dng cng c lp trnh, ngi hc cn cn phi c cn bn v Windows, ti thiu th cng dng qua mt s ng dng trong Windows. Tht s yu cu ny khng qu kh khn i vi ngi hc v hin ti hu nh Windows qu quen thuc vi mi ngi, nhng ngi m s dng my tnh. Ngoi nhng yu cu trn, i khi ngi lp trnh trn Windows cng cn c khiu thm m, v cch trnh by cc hnh nh, cc iu khin trn cc hp thoi tt th s lm cho ng dng cng tin li, r rng, v thn thin vi ngi dng.

1.3.4. B cng c giao din lp trnh ng dng APIH iu hnh Windows cung cp hng trm hm cho nhng ng dng c th s dng truy cp cc ti nguyn trong h thng. Nhng hm ny c gi l giao din lp trnh ng dng API (Application Programming Interface). Nhng hm trn c cha trong cc th vin lin kt ng DLL ca h thng. Nh c cu trc ng ny mi ng dng u c th truy cp n cc hm . Khi bin dch chng trnh, n on m gi hm API th chng trnh dch khng thm m hm ny vo m thc thi m ch thm tn DLL cha hm v tn ca chnh hm . Do m cc hm API thc t khng c s dng khi xy dng chng trnh, v n ch c thm vo khi chng trnh c np vo b nh thc thi. Trong API c mt s hm c chc nng duy tr s c lp thit b ha, v cc hm ny gi l giao din thit b ha GDI (Graphics Device Interface). Do s c lp thit b nn cc hm GDI cho php cc ng dng c th lm vic tt vi nhiu kiu thit b ha khc nhau.

1.3.5. C ch thng ipKhng ging nh cc ng dng chy trn MS-DOS, cc ng dng Win32 th x l theo cc s kin (event - driven), theo c ch ny cc ng dng khi c vit s lin tc ch cho h iu hnh truyn cc d liu nhp vo. H thng s m nhim vic truyn tt c cc d liu nhp ca ng dng vo cc ca s khc nhau ca ng dng . Mi mt ca s s c ring mt hm gi l hm x l ca s thng c t tn l WndProc, h thng s gi hm ny khi c bt c d liu nhp no c truyn n ca s, hm ny s x l cc d liu nhp v tr quyn iu khin v cho h thng. H thng truyn cc d liu nhp vo th tc x l ca ca s thng qua mt hnh thc gi l thng ip (message). Thng ip ny c pht sinh t ng dng v h thng. H thng s pht sinh mt thng ip khi c mt s kin nhp vo (input even), v d nh khi ngi dng nhn mt phm, di chuyn thit b chut, hay kch vo cc iu khin (control) nh thanh cun, Ngoi ra h thng cng pht sinh ra thng ip phn ng li mt s thay i ca h thng do mt ng dng mang n, iu ny xy ra khi ng dng lm cn kit ti nguyn hay ng dng t thay i kch thc ca ca s.

Trang 6

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Mt ng dng c th pht sinh ra thng ip khi cn yu cu cc ca s ca n thc hin mt nhim v no hay dng thng tin gia cc ca s. H thng gi thng ip vo th tc x l ca s vi bn tham s: nh danh ca ca s, nh danh ca thng ip, v hai tham s cn li c gi l tham s ca thng ip (message parameters). nh danh ca ca s xc nh ca s m thng ip c ch nh. H thng s dng nh danh ny xc nh cn phi gi thng ip n th tc x l ca ca s. nh danh thng ip l mt hng s th hin mc ch ca thng ip. Khi th tc x l ca s nhn thng ip th n s dng nh danh ny bit hnh thc cn thc hin. V d, khi mt thng ip c truyn n th tc ca s c nh danh l WM_PAINT th c ngha rng ca s vng lm vic thay i v cn phi v li vng ny. Tham s thng ip lu gi tr hay v tr ca d liu, c dng bi th tc ca s khi x l thng ip. Tham s ny ph thuc vo loi thng ip c truyn n, n c th l s nguyn, mt tp cc bit dng lm c hiu, hay mt con tr n mt cu trc d liu no , Khi mt thng ip khng cn dng n tham s th h thng s thit lp cc tham s ny c gi tr NULL. Mt th tc ca s phi kim tra xem vi loi thng ip no cn dng tham s quyt nh cch s dng cc tham s ny. C hai loi thng ip : Thng ip c nh ngha bi h thng (system-defined messages) : Dng thng ip ny c h thng nh ngha cho cc ca s, cc iu khin, v cc ti nguyn khc trong h thng. Thng c bt u vi cc tin t sau : WM_xxx, LB_xxx, CB_xxx, Thng ip c nh ngha bi ng dng (application-defined message) : Mt ng dng c th to ring cc thng ip s dng bi nhng ca s ca n hay truyn thng tin gia cc ca s trong ng dng. Nu mt ng dng nh ngha cc thng ip ring th th tc ca s nhn c thng ip ny phi cung cp cc hm x l tng ng. i vi thng ip h thng, th c cung cp gi tr nh danh t 0x0000 n 0x03FF, nhng ng dng khng c nh ngha thng ip c gi tr trong khong ny. Thng ip c ng dng nh ngha c gi tr nh danh t 0x0400 n 0x7FFF. L trnh ca thng ip t lc gi i n lc x l c hai dng sau: Thng ip c gi vo hng i thng ip ch x l (queue message): bao gm cc kiu thng ip c pht sinh t bn phm, chut nh thng ip : WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, v WM_CHAR.

Trang 7

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Thng ip c gi trc tip n th tc x l khng qua hng i (nonqueue message), bao gm cc thng ip thi gian, thng ip v, v thng ip thot nh WM_TIMER, WM_PAINT, v WM_QUIT. X l thng ip : Mt ng dng phi xa v x l nhng thng ip c gi ti hng i ca ng dng . i vi mt ng dng n tiu trnh th s dng mt vng lp thng ip (message loop) trong hm WinMain nhn thng ip t hng i v gi ti th tc x l ca s tng ng. Vi nhng ng dng nhiu tiu trnh th mi mt tiu trnh c to ca s th s c mt vng lp thng ip x l thng ip ca nhng ca s trong tiu trnh .

1.4. CCH VIT MT NG DNG TRN MICROSOFT WINDOWS 1.4.1. Cc thnh phn c bn to nn mt ng dng1.4.1.1. Ca s Trong mt ng dng ha 32-bit, ca s (window) l mt vng hnh ch nht trn mn hnh, ni m ng dng c th hin th thng tin ra v nhn thng tin vo t ngi s dng. Do vy, nhim v u tin ca mt ng dng ha 32-bit l to mt ca s. Mt ca s s chia s mn hnh vi cc ca s khc trong cng mt ng dng hay cc ng dng khc. Ch mt ca s trong mt thi im nhn c thng tin nhp t ngi dng. Ngi s dng c th dng bn phm, thit b chut hay cc thit b nhp liu khc tng tc vi ca s v ng dng. Tt c cc ca s u c to t mt cu trc c cung cp sn gi l lp ca s (window class). Cu trc ny l mt tp m t cc thuc tnh m h thng dng nh khun mu to nn cc ca s. Mi mt ca s phi l thnh vin ca mt lp ca s. Tt c cc lp ca s ny u c x l ring bit. 1.4.1.2. Hp thoi v cc iu khin Hp thoi (Dialog) dng tng tc vi ngi dng trong mt chng trnh ng dng. Mt hp thoi thng cha nhiu cc u khin nh nhp vn bn (edit text), nt bm (button), ghi ch (static control), hp danh sch (list box) Nt bm (button): gm c Push Button dng kch hot mt thao tc, Check Box dng chn mt trong hai trng thi (TRUE hay FALSE), Radio Button cng ging nh Check Box nhng mt nhm cc Radio Button phi c chn loi tr nhau. Ch thch (static): dng cha cc ghi ch trong hp thoi, ngoi ra ni dung c th thay i trong qu trnh s dng hp thoi. Hp lit k (list box): Chn mt hay nhiu d liu c lit k trong danh sch, nu hp cha nhiu dng v hp khng hin th ht cc mu thng tin th phi km theo mt thanh cun (scroll bar). nhp vn bn (edit text): Dng nhp vn bn, nu c nhiu dng th thng km theo thanh cun.

Trang 8

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Thanh cun (scroll bar): ngoi vic dng km vi list box hay edit box th thanh cun cn c th s dng c lp nhm to cc thc o Thc n (menu): l mt danh sch cha cc thao tc vi mt nh danh m ngi dng c th chn. Hu ht cc ng dng c ca s th khng th thiu thc n. Thanh cng c (toolbar): y l mt dng menu nhng ch cha cc thao tc cn thit di dng cc biu tng c trng. Ngoi ra cn rt nhiu cc iu khin m cc cng c lp trnh cung cp cho ngi lp trnh hay t h to ra da trn nhng thnh phn c cung cp sn. 1.4.1.3. ng dng in hnh trn Windows 1.4.1.4. Cc kiu tp tin xy dng mt ng dng trn Windows Chng trnh ngun Tng t nh cc chng trnh C chun, bao gm cc tp tin tiu (header) cha trong tp tin *.h, *.hpp. Cn m ngun (source code) cha trong tp tin *.c hay *.cpp. Tp tin nh ngha Tp tin ny c phn m rng l *.def, dng nh ngha cc iu khin do chng trnh to ra khi vit ng dng to DLL, ngoi ra cn dng khai bo vng nh heap khi chy chng trnh. Lc trc do vn tng thch vi Windows 3.1 nn tp tin ny thng c dng, cn ngy nay chng t c dng n. Cc file cha ti nguyn ca ng dng Cc file *.ico l cc biu tng (icon) c dng trong chng trnh. Thng thng cc cng c lp trnh trn Windows u c cc tool to cc nh ny. Con tr chut ca ng dng c th c v li di dng cc biu tng v lu trn a vi dng file *.cur. Cc file dng nh bitmap dng minh ha c lu dng file *.bmp. Tp tin ti nguyn *.rc l phn khai bo cc ti nguyn nh thc n, hp thoi, v cc nh danh ch n cc tp tin dng *.ico, *.cur, *.bmp,... 1.4.1.5. Cc kiu d liu mi Cc kiu d liu trn Windows thng c nh ngha nh ton t typedef trong tp tin windows.h hay cc tp tin khc. Thng thng cc tp tin nh ngha ny do Microsoft vit ra hoc cc cng ty vit trnh bin dch C to ra, nht thit n phi tng thch vi h iu hnh Windows 98, hay NT da trn kin trc 32-bit. Mt vi kiu d liu mi c tn vit tt rt d hiu nh UINT l mt d liu thng c dng m n gin l kiu unsigned int, trong Windows 9x kiu ny c kch thc l 32-bit. i vi kiu chui th c kiu PSTR kiu ny l mt con tr n mt chui tng t nh char*.

Trang 9

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Tuy nhin, cng c mt s kiu c khi bo tn thiu r rng nh WPARAM v LPARAM. Tn ny c t v c ngun ngc lch s su xa. Khi cn h iu hnh Windows 16-bit th tham s th 3 ca hm WndProc c khai bo l kiu WORD, vi kch thc 16-bit , cn tham s th 4 c kiu LONG l 32-bit. y l l do ngi ta thm tin t "W", "L" vo t "PARAM". Tuy nhin, trong phin bn Windows 32-bit, th WPARAM c nh ngha nh l UINT v LPARAM th c nh ngha nh mt kiu LONG, do c hai tham s ny u c gi tr l 32-bit. iu ny l mt s nhm ln v WORD vn l gi tr 16-bit trong Window 98. Trong th tc x l ca s WndProc gi tr tr v l kiu LRESULT. Kiu ny n gin c nh ngha nh l kiu LONG. Ngoi ra, c mt kiu thng xuyn dng l kiu HANDLE l mt s nguyn 32-bit c s dng nh mt kiu nh danh. C nhiu kiu nh danh nhng nht thit tt c phi c cng kch thc vi HANDLE. Bng sau m t mt s kiu d liu mi: Ki u HA NDLE HW ND BY TE WO RD DW ORD UI NT LO NG BO OL LPS TR LP Hng con tr chui. Con tr chui. Bool. long 32-bit. S nguyn khng du 32-bit. S nguyn 32-bit khng du. S nguyn 16-bit khng du. Gi tr 8-bit khng du. S nguyn 32-bit, nh danh. S nguyn 32-bit, nh danh. ngha

Trang 10

NGN NG LP TRNH CSTR WP ARAM LP ARAM BS TR LP VOID LP TSTR LP CTSTR DBCS. 32-bit. 32-bit. Gi tr 32-bit tr n k t.

LP TRNH C TRN WINDOWS

Con tr 32-bit n mt kiu khng xc nh. Ging nh LPSTR nhng c th chuyn sang dng Unicode v Ging nh LPCTSTR nhng c th chuyn sang dng Unicode v DBCS.Bng 1.1 M t cc kiu d liu mi

1.4.2. Khun mu chung to mt ng dngMt ng dng n gin nht ca Windows bao gm c hai hm l WinMain v x l ca s WinProc. Do hai hm ny l quan trng v khng th thiu trong cc ng dng Windows. Hm WinMain thc hin cc chc nng sau : nh ngha lp ca s ng dng. ng k lp ca s va nh ngha. To ra th hin ca s ca lp cho. Hin th ca s. Khi ng chu trnh x l thng ip.

Hm x l WinProc c chc nng x l tt c cc thng ip c lin quan n ca s.

1.4.3. Hm WinMainHm chnh ca mt ng dng chy trn Windows l hm WinMain, c khai bo nh sau: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow); Trang 11

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Chng ta s tm hiu mt hm WinMain mu sau y. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); // tn ng dng HWND hwnd; MSG msg; WNDCLASS wndclass; // bin nh ngha mt ca s /* nh ngha kiu ca s */ wndclass.style = SC_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; // Hm th tc ca s wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; // nh danh ng dng wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCusor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; // Khng c menu wndclass.lpszClassName = szAppName; // tn ng dng /* ng k lp ca s */ if (!RegisterClass(&wndclass)) return 0; /* To lp ca s */ hwnd = CreateWindow (szAppName, // Tn ca s "Hello Program", // Tiu

Trang 12

NGN NG LP TRNH WS_OVERLAPPEDWINDOW, // Kiu ca s CW_USEDEFAULT, // Ta x CW_USEDEFAULT, // Ta y CW_USEDEFAULT, // Chiu rng CW_USEDEFAULT, // Chiu di NULL, // Ca s cha NULL, // Khng c menu hInstacne, // nh danh ng dng NULL); // Tham s b sung /* Hin th ca s */ ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); /* Chu trnh x l cc thng ip*/ while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } nh ngha mt lp ca s :

LP TRNH C TRN WINDOWS

u tin ca vic xy dng mt ng dng Windows l phi nh ngha mt lp ca s cho ng dng. Windows cung cp mt cu trc WNDCLASS gi l lp ca s, lp ny cha nhng thuc tnh to thnh mt ca s. typedef struct _WNDCLASS Trang 13

NGN NG LP TRNH { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASS, *PWNDCLASS;

LP TRNH C TRN WINDOWS

ngha thuc tnh ca cu trc WNDCLASS c m t trong bng sau : Thuc tnh style lpfnWndProc cbClsExtra cbWndExtra hInstance hIcon hCursor hbrBackground lpszMenuName ngha Kiu lp Con tr n th tc window S byte c cp pht thm sau cu trc window-class S byte c cp pht thm sau mt instance ca window nh danh cha th tc ca s ca lp window nh danh ca biu tng nh danh ca con tr chut nh danh ca chi t nn Tn thc n Dng hm LoadIcon Dng hm LoadCursor Dng hm GetStockObject Tn thc n gn vi ca s, thc dn ny c khai bo trong tp tin ti Mc nh Mc nh ghi ch Kt hp nhiu kiu gi tr khc nhau bng ton t OR.

Trang 14

NGN NG LP TRNH

LP TRNH C TRN WINDOWS nguyn.

lpszClassName

Tn lpBng 1.2 M t thuc tnh ca lp ca s

ng k lp ca s : Sau khi nh ngha mt lp ca s, phi ng k lp ca s bng hm RegisterClass : ATOM RegisterClass( CONST WNDCLASS * lpWndClass ); To ca s : Lp ca s nh ngha nhng c tnh chung ca ca s, cho php to ra nhiu ca s da trn mt lp. Khi to ra mt ca s ca hm CreateWindow, ta ch nh cc c tnh ring ca ca s ny, v phn bit n vi cc ca s khc to ra cng mt lp. Khai bo hm to ca s : HWND CreateWindow( LPCSTR lpClassName, // Tn lp ca s ng k LPCSTR lpwindowName, // Tn ca ca s DWORD dwStyle, // Kiu ca ca s int x, // V tr ngang ban u int y, // V tr dc ban u int nWidth, // rng ban u int nHeight, // cao ban u HWND hWndParent, // nh danh ca ca s cha MENU hMenu, // nh dang ca thc n INSTANCE hInstance, // nh danh th hin ng dng PVOID lpParam // Cc tham s ban u ); Hin th ca s : Trang 15

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Sau khi gi hm CreateWindow, mt ca s c to ra bn trong Windows, iu ny c ngha l Windows cp pht mt vng nh lu gi tt c cc thng tin v ca s c ch nh trong hm CreateWindow. Nhng thng s ny s c Windows tm li khi cn thit da vo nh danh m hm to ca s tr v. Tuy nhin, lc ny ca s cha xut hin trn mn hnh Windows, xut hin cn phi gi hm ShowWindow. Hm ShowWindow c khai bo nh sau: BOOL ShowWindow( HWND hWnd, // nh danh ca ca s cn th hin int nCmdShow // Trng thi hin th ); Mt s trng thi ca tham s nCmdShow: SW_HIDE : n ca s. SW_MAXIMIZE : Phng ca s ra ton b mn hnh. SW_MINIMIZE : thu nh thnh biu tng trn mn hnh. SW_RESTORE : Hin th di dng chun.

1.4.4. Hm x l ca s WndProcMt chng trnh Windows c th cha nhiu hn mt hm x l ca s. Mt hm x l ca s lun kt hp vi mt lp ca s c th. Hm x l ca s thng c t tn WndProc. Hm WndProc c chc nng giao tip vi bn ngoi, tc l vi Windows, ton b cc thng ip gi n ca s iu c x l qua hm ny. Hm ny thng c khai bo nh sau : LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); Trong tham s u tin l nh danh ca ca s, tham s th 2 l nh danh thng ip, v cui cng l 2 tham s WPARAM v LPARAM b sung thng tin km theo thng ip. Chng ta s tm hiu mt hm x l ca s WndProc sau:

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {

Trang 16

NGN NG LP TRNHHDC hdc; PAINTSTRUCT ps; RECT rect; /*X l cc thng ip cn thit vi ng dng*/ switch (msg) { case WM_CREATE: /*Vit on m khi to ca s*/ return 0; case WM_PAINT: /*Vit on m khi t v li ca 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: /*Vit on m khi kch thc ca s thay i*/ return 0; case WM_DESTROY: /*Ca s b ng*/ PostQuitMessage (0); return 0; }

LP TRNH C TRN WINDOWS

Trang 17

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

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

Thng thng chng ta ch chn x l cc thng ip cn thit c lin quan n chc nng ca ng dng. Cc thng ip khc th giao cho hm x l mc nh lm vic (hm DefWindowProc).

1.4.5. X l thng ipSau khi ca s c hin th trn mn hnh, th chng trnh phi c cc thng tin nhp ca ngi dng t bn phm hay thit b chut. Windows s duy tr mt hng i thng ip cho mi chng trnh chy trn n. Khi mt s kin nhp thng tin xut hin, Windows s dch s kin ny thnh dng thng ip v a n vo hng i thng ip ca ng dng tng ng. Mt ng dng nhn cc thng ip t hng i thng ip bng cch thc thi mt on m sau:while ( GetMessage(&msg, NULL, 0 ,0) ) { TranslateMessage (&msg); DispatchMessage (&msg); }

Trong msg l mt bin cu trc kiu MSG c nh ngha trong tp tin tiu WINUSER.H. typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG; Trang 18

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Kiu d liu POINT l mt kiu cu trc khc, c nh ngha trong tp tin tiu WINDEF.H, v c m t : typedef struct tagPOINT { LONG x; LONG y; } POINT, *PPOINT; ngha ca cc trng trong cu trc MSG hwnd : nh danh ca ca s m thng ip pht sinh. message : nh danh ca thng ip, v d nh thng ip pht sinh khi bm nt chut tri l WM_LBUTTONDOWN c gi tr 0x0201. wParam : Tham s 32-bit cha cc thng tin ph thuc vo tng thng ip c th. lParam : Tham s 32-bit ph thuc vo thng ip. time : Thi gian t thng ip trong hng i. pt : Ta ca chut khi t thng ip vo hng i Hm GetMessage s tr v 0 nu msg cha thng ip c nh danh WM_QUIT (0x0012), khi vng lp thng ip ngng v ng dng kt thc. Ngc li th hm s tr v mt gi tr khc 0 vi cc thng ip khc.

1.4.6. Xy dng mt ng dng u tinMt ng dng thng c giao din nn tng l mt khung ca s, to c ca s ny chng ta thc hin bng cch khai bo mt lp ca s v ng k lp ca s . ca s tng tc c th chng ta phi vit hm x l ca s WndProc khi tt c cc thng ip lin quan n ca s s c truyn vo cho hm ny. on chng trnh sau l khung sn cho cc chng trnh vit trn Windows, bao gm 2 hm chnh l : WinMain : hm chnh ca chng trnh thc hin cc chc nng : Khai bo lp ca s. ng k lp ca s va khai bo. To v hin th lp ca s trn. Vng lp nhn thng ip.

WndProc : Hm x l thng ip gi n ca s./* HELLOWORLD.C */

Trang 19

NGN NG LP TRNH#include

LP TRNH C TRN WINDOWS

LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { 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; }

Trang 20

NGN NG LP TRNHhwnd = CreateWindow ( szAppName, // Tn lp ca s TEXT (" The Hello World Program"), // Tiu ca s WS_OVERLAPPEDWINDOW, // Kiu ca s CW_USEDEFAULT, // Ta x CW_USEDEFAULT, // Ta y CW_USEDEFAULT, // Chiu ngang CW_USEDEFAULT, // Chiu dc NULL, // Ca s cha NULL, // Thc 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

LP TRNH C TRN WINDOWS

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect;

Trang 21

NGN NG LP TRNHswitch ( msg ) { 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

LP TRNH C TRN WINDOWS

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

Bng di y lit k ngha ca cc hm c s dng trong 2 hm WinMain v WndProc ca chng trnh HELLOWORLD.C. Tn hm LoadIcon LoadCurso r GetStockO bject RegisterCla Nhn mt i tng ha, trong trng hp ca chng trnh th ly mt chi t t li nn ca ca s. ng k mt lp ca s cho ca s ng dng trong ngha Np mt biu tng s dng trong chng trnh. Nap mt con tr chut cho chng trnh.

Trang 22

NGN NG LP TRNH ss MessageBo x CreateWin dow ShowWindo w UpdateWin dow GetMesssag e TranslateM essage DispatchMe ssage BeginPaint GetClientR ect DrawText EndPaint PostQuitMe ssage DefWindow Proc chng trnh. Hin th mt thng ip.

LP TRNH C TRN WINDOWS

To mt ca s da trn mt lp ca s. Hin th ca s ln mn hnh. Yu cu ca s v li chnh bn thn n. Nhn mt thng ip t hng i thng ip. Dch thng ip bn phm. Gi thng ip n hm x l ca s. Khi to chc nng v ca ca s. Ly hnh ch nht lu vng lm vic. Hin th mt chui vn bn. Kt thc vic v ca s. a thng ip thot vo hng i thng ip. Thc hin vic x l mc nh cc thng ip.

Bng 1.3 M t cc hm c s dng trong chng trnh minh ha

1.4.7. Mt s qui c t tn binKhi vit mt chng trnh ng dng ln vi nhiu kiu khai bo bin khc nhau, nu vic khai bo cc tn bin khng thch hp s lm cho chng trnh phc tp thm, i khi lm kh ngay c ngi vit ra cc m ngun . V vy cc lp trnh vin thng qui c sao cho mt tn bin va gi c chc nng ca n va xc nh c kiu loi. C rt nhiu phong cch t tn, trong s th c phong cch t tn theo c php Hungary (Hungarian Notation) l c dng nhiu nht. Qui c rt n gin l bt u tn bin th vit ch thng v cc ch u th Trang 23

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

hin kiu d liu ca bin, v c gi l cc tin t. V d nh bin szCmdLine l mt bin lu chui nhp t dng lnh, sz l th hin cho bin kiu chui kt thc k t 0, ngoi ra ta hay thy hInstance v hPrevInstance, trong h vit tt cho kiu handle, kiu d liu nguyn thng c khai bo dng tin t l ch i. C php Hungary ny gip cho ngi lp trnh rt nhiu trong khu kim tra li ca chng trnh, v khi nhn vo hai bin ta c th d dng nhn bit c s khng tng thch gia hai kiu d liu th hin trong tn ca hai bin. Bng m t mt s tin t khi t tn bin ca cc kiu d liu : Tin t c by n i x,y b w l dw s sz h p Lpsz Kiu d liu char, WCHAR, TCHAR BYTE short int bin lu ta x, y BOOL WORD long DWORD string chui kt thc bi k t 0 handle pointer con tr di chui k t kt thc k t 0Bng 1.4 M t kiu t tn bin

Trang 24

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Chng 2 HP THOI V THANH TRNH N2.1. M UHp thoi (dialog) v thanh trnh n (menu) l cc thnh phn khng th thiu trong vic t chc giao tip gia ngi s dng v chng trnh. Hp thoi c xem nh l mt loi ca s c bit, l cng c mm do, linh hot a thng tin vo chng trnh mt cch d dng. Trong khi menu l cng c gip ngi dng thc hin cc thao tc n gin hn, thng qua cc nhm chc nng thng s dng.

2.2. HP THOIHp thoi phi hp gia ngi s dng vi chng trnh bng mt s phn t iu khin m cc phn t ny nhn nhim v thu nhn thng tin t ngi dng v cung cp thng tin n ngi dng khi ngi dng tc ng n cc phn t iu khin. Cc phn t iu khin ny nhn ca s cha l mt hp thoi. Cc phn t iu khin thng l cc Button, List Box, Combo Box, Check Box, Radio Button, Edit Box, Scroll Bar, Static. Tng t nh cc thng ip gi n th tc WndProc ca ca s chnh.Windows s gi cc thng ip x l hp thoi n th tc x l hp thoi DlgProc. Hai th tc WndProc v th Trang 25

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

tc DlgProc tuy cch lm vic ging nhau nhng gia chng c nhng im khc bit cn lu . Bn trong th tc x l hp thoi bn cn khi to cc phn t iu khin bn trong hp thoi bng thng ip WM_INITDIALOG, cui cng l ng hp thoi, cn th tc x l WndProc th khng c. C ba loi hp thoi c bn. Hp thoi trng thi (modal), hp thoi khng trng thi (modeless) v hp thoi thng dng (common dialog) m chng ta s cp c th trong cc phn di.

2.2.1. Hp thoi trng thiHp thoi trng thi (modal) l loi hp thoi thng dng trong cc ng dng ca chng ta. Khi hp thoi trng thi c hin th th bn khng th chuyn iu khin n cc ca s khc, iu ny c ngha bn phi ng hp thoi hin hnh trc khi mun chuyn iu khin n cc ca s khc. 2.2.1.1. Cch to hp thoi n gin Sau y l chng trnh to ra mt hp thoi n gin. Hp thoi c to ra c ni dung nh sau. Khi hp thoi hin ln c xut hin dng ch "HELLO WORLD", bn trn hp thoi c mt biu tng ca hp thoi l mt icon, v pha di hp thoi l mt nt bm (Button) c tn l OK, khi nhp chut vo nt OK th hp thoi "HELLO WORLD" c ng li.

Hnh 2.1 Hp thoi n gin

on code chng trnh nh sau (V d 2.1): DIALOG.CPP (trch dn)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) {

Trang 26

NGN NG LP TRNHstatic HINSTANCE hInstance ; 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) ; }

LP TRNH C TRN WINDOWS

/*----------------------hm x l thng ip hp thoi-------------------------------*/ BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) {

Trang 27

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

LP TRNH C TRN WINDOWS

DIALOG1.RC (trch dn)/*---------------------------------------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------------------------------------------*/ MENU1 MENU DISCARDABLE BEGIN

Trang 28

NGN NG LP TRNHPOPUP "Dialog1" BEGIN MENUITEM "&Show", IDC_SHOW END END

LP TRNH C TRN WINDOWS

2.2.1.2. Hp thoi v to mu template cho hp thoi Trong v d 2.1 trn, ta to hp thoi bng cch dng cc cu lnh cha trong file ti nguyn DIALOG1.RC. Cch lm ny gip ta hiu cu trc lnh ca Windows, tuy nhin cng c Visual C++ Developer Studio, ta c th thit lp mt hp thoi trc quan hn nh sau : Chn Insert t thc n Resource View thm mt hp thoi, mn hnh c th hin nh trong hnh 2.2. Miscrosoft s hin th hp thoi trc quan cng vi thanh cng c bn c th thm cc thnh phn iu khin vo hp thoi. Chng ta c th iu chnh cc thuc tnh ca hp thoi nh tn hp thoi, ID hp thoi, v tr hin th ca hp thoi trn ca s chnh, kch thc ch v kiu ch th hin trn hp thoi...vv bng cch nhn chut phi trn hp thoi th ca s Properties ca hp thoi c hin th (hnh 2.3).

Hnh 2.2 Thm mt Dialog trong Resource View

Hnh 2.3 Hp thoi Properties ca Dialog

Trang 29

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Trong ca s Properties ny chn tab Styles, b mc chn Title Bar v khng cn to tiu cho ca s. Sau ng ca s Properties ca hp thoi li. By gi bt u thit k din mo cho hp thoi. Xa nt Cancel v khng cn n nt ny. thm mt biu tng vo hp thoi ta nhn nt Picture ln thanh cng c v kch chut vo hp thoi ri ko khung ch nht theo kch thc mong mun. y l ni m biu tng c hin th. Nhn chut phi vo khung ch nht va to, chn Properties t trnh n xut hin v nguyn nh danh ca biu tng l IDC_STATIC. nh danh ny s c Windowns t khai bo trong file Resource.h vi gi tr -1. Gi tr -1 l gi tr ca tt c cc nh danh m chng trnh khng cn tham chiu n. Tip n l chn i tng Icon trong trong mc Type, ri g nh danh ca Icon cn thm vo trong mc Image. Nu to ra biu tng Icon trc th ch vic chn Icon t danh sch cc Icon trong mc Image. thm dng ch "HELLO WORLD" vo hp thoi, chn Static Text t bng cng c v t i tng vo hp thoi. Nhn chut phi hin th Properties ca Static Text, sau vo mc caption nh dng ch "HELLO WORD" vo y. Dch v chy chng trnh sau xem file DIALOG1.RC di dng text, ni dung hp thoi 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 END Dng u tin l tn ca hp thoi "DIALOG1" k tip l t kha DIALOG, DISCARDABLE v tip sau l 4 s nguyn. Hai s nguyn u tin ch v tr dng, ct ca hp thoi s c hin th trn ca s chnh. Hai s nguyn tip theo xc nh kch thc ca hp thoi theo th t ct v dng. Lu : Cc thng s nh ta v kch thc ca hp thoi khng tnh theo n v Pixel m tnh theo kch c ca Font ch. S o ca ta x v chiu rng da trn 1/4 n v rng trung bnh ca Font ch. S o ca ta y v chiu cao da trn 1/8 n v cao trung bnh ca Font ch. Theo sau lnh STYLE l cc thuc tnh ca hp thoi m bn cn thm vo. Thng thng hp thoi modal s dng cc hng WS_POPUP v DS_MODALFRAME ngoi ra cn Trang 30

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

c cc hng WS_CAPTION, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUP, WS_VSCROLL, WS_HSCROLL, WS_SYSMENU, .... Lnh BEGIN v lnh END c th c thay bng { v }. Trong v d trn, hp thoi s dng 3 kiu iu khin l DEFPUSHBUTTON (kiu nt bm mc nh), ICON (biu tng), v kiu CTEXT (vn bn c canh gia). Mt kiu iu khin c khai bo tng qut nh sau. Control-type "text", id , xPos, yPos, xWidth, yHeight, iStyle. Control-type l cc t kha khai bo kiu iu khin nh DEFPUSHBUTTON, ICON, CTEXT, . id l nh danh ca cc iu khin, thng thng mt iu khin c mt nh danh ring c gi cng vi thng ip WM_COMMAND n cc th tc x l thng ip ca ca s cha. xPos, yPos l v tr ct, dng him th ca iu khin trn ca s cha. xWidth, yHeight l chiu rng v chiu cao ca iu khin . i s cui cng l iStyle, i s ny ty chn dng nh ngha thm cc kiu ca s m iu khin cn th hin chng thng l cc hng WS_ c khai bo trong tp tin .h" ca Windows. 2.2.1.3. Th tc x l thng ip ca hp thoi Th tc x l thng ip ca hp thoi dng x l tt c cc thng ip t b qun l hp thoi ca Windows gi n hp thoi. Th tc ny c Windows gi khi c s tc ng ln cc phn t iu khin nm trong hp thoi. Xt th tc x l hp thoi DialogProc trong v d 2.1. Th tc ny c 4 tham s nh th tc WndProc, v th tc ny c nh ngha kiu tr v l CALLBACK.Tuy hai th tc ny tng t ging nhau nhng thc s gia chng c mt vi s khc bit ng ch . Th tc DialogProc tr v gi tr kiu BOOL, trong khi th tc WindProc th tr v gi tr LRESULT. Th tc DialogProc tr v gi tr TRUE (gi tr khc 0) nu n x l thng ip v ngc li nu khng x l cc thng ip th th tc tr v gi th l FALSE (tr 0). Cn th tc WindProc th gi hm DefWindowProc vi cc thng ip khng cn x l. Th tc DialogProc khng cn x l thng ip WM_DESTROY, cng khng cn x l thng ip WM_PAINT v cng khng nhn c thng ip WM_CREATE m l thng ip WM_INITDIALOG dng khi to hp thoi. Ngoi x l thng ip WM_INITDIALOG, th tc x l thng ip hp thoi ch x l mt thng ip duy nht khc l WM_COMMAND. y cng l thng ip c gi n ca s cha khi ta kch hot (nt nhn ang nhn c focus) ln cc thnh phn iu khin. Ch danh ID ca nt OK" l IDOK s c cha trong word thp ca i s wParam. Khi nt ny c nhn, th tc DialogProc gi hm EndDialog kt thc x l v ng hp thoi. Cc thng ip gi n hp thoi khng i qua hng i m n c Windows gi trc tip hm DialogProc truyn cc thng ip vo cho th tc x l hp thoi.V vy, khng phi bn tm v hiu ng ca cc phm tt c quy nh trong chng trnh chnh. 2.2.1.4. Gi hin th hp thoi v cc vn lin quan

Trang 31

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Trong th tc WndProc khi x l thng ip WM_CREATE Windows ly v nh danh hInstance ca chng trnh v lu n trong bin tnh hInstance nh sau. hInstance = ((LPCREATESTRUCT) lParam)->hInstance; Dialog1 kim tra thng ip WM_COMMAND xem word thp ca i s wParam c bng gi tr IDC_SHOW (ch danh ca thnh phn Show trong thc n). Nu phi, tc chn mc Show trn trnh n ca ca s chnh v yu cu hin th hp thoi, lc ny chng trnh gi hin th hp thoi bng cch gi hm. DialogBox (hInstance, TEXT ("DIALOG1"), hwnd, DialogProc) i s u tin ca hm ny phi l hInstance ca chng trnh gi, i s th hai l tn ca hp thoi cn hin th, i s th 3 l ca s cha m hp thoi thuc v, cui cng l a ch ca th tc x l cc thng ip ca hp thoi. Chng trnh khng th tr iu khin v hm WndProc cho n khi hp thoi c ng li. Gi tr tr v ca hm DialogBox l gi tr ca i s th hai trong hm EndDialog nm bn trong th tc x l thng ip hp thoi. Tuy nhin chng ta cng c th gi thng ip n hm WndProc yu cu x l ngay c khi hp thoi ang m nh hm SendMessage nh sau : SendMessage(GetParent(hDlg), message, wParam, lParam) Tuy Visual C++ Developer cung cp cho chng ta b son tho hp thoi trc quan m ta khng cn phi quan tm n ni dung trong tp tin .RC. Tuy nhin vi cch thit k mt hp thoi bng cc cu lnh gip chng ta hiu chi tit hn cu trc lnh ca Windows hn th na tp lnh dng thit k hp thoi phong ph v a dng hn rt nhiu so vi nhng g m ta trc quan c trn b son tho ca Developer. Bng cch s dng cc lnh c bit trong tp tin Resource editor ca Visual C++ ta c th to ra nhiu i tng m trong b son tho khng c. Thm hng WS_THINKFRAME vo mc STYLE co gin hp thoi (tng ng vi trong boder ta chn mc Resizing). t ni dung tiu cho hp thoi ta ch vic thm hng WS_CAPTION trong STYLE. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Hello Dialog1" C th dng cch khc thm tiu cho hp thoi, bng cch trong khi x l thng ip WM_INITDIALOG thm vo dng lnh: SetWindowText(hDlg,TEXT("Hello Dialog"));

Trang 32

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Khi hp thoi c tiu ri, c th thm cc chc nng phng to v thu nh hp thoi bng hng WS_MINIMIZEBOX, WS_MAXIMIZEBOX. C th thm trnh n vo hp thoi nu mun bng on lnh.DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Hello Dialog1" MENU MENU1

Trong MENU1 l tn ca trnh n ta to. Trong Visual C++ Developer ta ch cn chn tn thc n trong mc Menu nh hnh sau.

Hnh 2.4 Chn menu trong Dialog Propertier

T ca s Properties trn th chn mc "Font" nh Font ch cho hp thoi. Gi hm DialogBoxIndirect to ra mt hp thoi m khng cn dng resource script. Hp thoi to ra bng hm ny trong khi chng trnh ang thc hin c gi l hp thoi to t ng. Trong v d 3-1 ta ch dng 3 kiu iu khin l cc kiu ICON, CTEXT, DEFPUSHBUTTON. Ngoi ra cn c cc kiu iu khin c lit k trong bng sau. Kiu iu khin PUSHBUTTON DEFPUSHBUTTON CHECKBOX RADIOBUTTON GROUPBOX Lp ca s Button Button Button Button Button Kiu ca s BS_BUSHBUTTON BS_DEFBUSHBUTTON | WS_TABSTOP BS_CHECKBOX | WS_TABSTOP BS_RADIOBUTTON | WS_TABSTOP BS_GROUPBOX | WS_TABSTOP

Trang 33

NGN NG LP TRNH LTEXT CTEXT RTEXT ICON EDITTEXT SCROLLBAR LISTBOX COMBOBOX Static Static Static Static Edit Scrollbar Listbox Combobox

LP TRNH C TRN WINDOWS 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_TABSTOPBng 2.1 Cc kiu iu khin

Cc kiu iu khin c khai bo trong resource script c dng nh sau, ngoi tr kiu iu khin LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT. Control-type "text", id, xPos, yPos, xWidth, yHeight, iStyle Cc kiu iu khin LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT c khai bo trong resource script vi cu trc nh trn nhng khng c trng "text". Thm thuc tnh cho cc kiu iu khin bng cch thay i tham s iStyle. V d ta mun to radio button vi chui din t nm bn tri ca nt th ta gn trng iStyle bng BS_LEFTTEXT c th nh sau. RADIOBUTTON Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT Trong resource script ta cng c th to mt kiu iu khin bng lnh tng qut sau. CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight Trong class l tn lp mun to v d thay v to mt radio button bng cu lnh.RADIOBUTTON "Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT

Thay bng on lnh sau:CONTROL"Radio1",IDC_RADIO1,"button",106,10,53,15,BS_LEFTTEXT

2.2.1.5. V d chng trnh v hp thoi. minh ha cho vic trao i thng ip gia cc thnh phn iu khin bn trong hp thoi (ng vai tr l mt ca s cha) vi cc thnh phn iu khin con nm bn trong hp Trang 34

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

thoi, v c ch qun l hp thoi ca Windows. Chng ta tin hnh xem xt v d 2-2. Kt qu thc hin ca chng trnh nh trong hnh 2.5. Ca s hp thoi gm c ba nhm nt chn radio.Nhm th nht dng chn i tng v l hnh ch nht hay hnh ellipse, nhm th hai dng chn mu t cho hnh v, nhm th 3 dng chn kiu t cho hnh v. Khi thay i vic chn mu t, kiu t th mu t v kiu t ca hnh v cnh bn s thay i theo mu t, v kiu t va mi chn. Khi nhn nt OK th hp thoi ng li v mu t, kiu t cng hnh v va mi v s c hin th ln ca s chnh. Nu nhn nt Cancel hoc nhn phm Esc th hp thoi c ng li nhng hnh v, mu t v kiu t khng c hin th ln ca s chnh. Trong v d ny nt OK v nt Cancel c ch danh ID ln lt l IDOK v IDCANCEL.Thng thng t ch danh cho cc phn t iu khin nm trong hp thoi c bt u bng ch ID. Biu tng chic xe p trn hp thoi l mt icon. Trn thanh tiu ca ca s chnh c mt biu tng, biu tng cng l mt icon ( l mt ly tr). Khi t cc nt radio vo hp thoi bng cng c Developer studio nh phi t cc nt theo th t nh hnh 2-5. Th khi Windows mi pht sinh m cho cc nt theo th t tng dn, iu ny gip chng ta d dng kim sot cc thao tc trn tp cc nt radio. Bn nh b lun mc chn Auto trong phn thit lp Properties ca cc nt chn radio. Bi v cc nt radio mang thuc tnh Auto yu cu vit t m lnh hn ngng chng thng kh hiu so vi cc nt khng c thuc tnh Auto. Chn thuc tnh Group, Tab stop trong phn thit k Properties ca nt OK, nt Cancel, v hai nt radio u tin trong ba nhm radio c th chuyn focus (chn) bng phm Tab trn bn phm.

Hnh 2.5 Minh ha trao i thng ip qua cc iu khin

Chng trnh minh ha (V d 2.2) : DIALOG2.CPP (trch dn)#include #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM); int iCurrentColor = IDC_BLACK, iCurrentFigure = IDC_RECT;

Trang 35

NGN NG LP TRNHint iCurrenBrush = IDC_HS_BDIAGONAL;

LP TRNH C TRN WINDOWS

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) ; 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)

Trang 36

NGN NG LP TRNHhbrush=CreateHatchBrush(HS_BDIAGONAL, crColor[iColor - IDC_BLACK]); hBrush = (HBRUSH) SelectObject (hdc, hbrush) ; if (iFigure == IDC_RECT)

LP TRNH C TRN WINDOWS

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) ; } 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 ;

Trang 37

NGN NG LP TRNHcase WM_COMMAND: switch (LOWORD (wParam)) { case IDC_SHOW:

LP TRNH C TRN WINDOWS

if (DialogBox (hInstance, TEXT ("DIALOG"), hwnd, DialogProc)) InvalidateRect (hwnd, NULL, TRUE) ; 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)

Trang 38

NGN NG LP TRNH{ case WM_INITDIALOG: iColor = iCurrentColor ; iFigure = iCurrentFigure ; iBrush = iCurrenBrush;

LP TRNH C TRN WINDOWS

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:

Trang 39

NGN NG LP TRNHcase IDC_YELLOW: case IDC_BLUE: case IDC_MAGENTA: case IDC_CYAN: case IDC_WHITE: iColor = LOWORD (wParam) ;

LP TRNH C TRN WINDOWS

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 40

NGN NG LP TRNH} break; case WM_PAINT: PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ; break ; } return FALSE ; }

LP TRNH C TRN WINDOWS

2.2.1.6. Lm vic vi cc thnh phn iu khin trong hp thoi Cc thnh phn iu khin con u gi thng ip WM_COMMAND n ca s cha ca n v ca s cha c th thay i trng thi ca cc thnh phn iu khin con nh kch hot, nh du (check), b du check (uncheck) bng cch gi cc thng ip n cc thnh phn iu khin con nm trong n. Tuy nhin trong Windows cung cp c ch trao i thng ip gia cc thnh phn iu khin con vi ca s cha. Chng ta bt u tm hiu cc c ch trao i thng ip . Trong v d 2.2 mu template ca hp thoi Dialog2 c th hin trong tp tin ti nguyn DIALOG2.RC gm c cc thnh phn. Thnh phn GROUPBOX c tiu do chng ta g vo, thnh phn ny ch n gin l mt khung vin bao quanh hai nhm nt chn radio, v hai nhm ny hon ton c lp vi nhau trong mi nhm. Khi mt trong nhng nt radio c kch hot th ca s iu khin con gi thng ip WM_COMMAND n ca s cha ( y l hp thoi) vi word thp ca i s wParam cha thnh phn ID ca iu khin con, word cao ca i s wParam cho bit m thng bo. Sau cng l i s lParam mang handle ca ca s iu khin con. M thng bo ca nt chn radio lun lun l BN_CLICKED (mang gi tr 0). Windows s chuyn thng ip WM_COMMAND cng vi cc i s wParam v lParam n th tc x l thng ip ca hp thoi (DialogProc). Khi hp thoi nhn c thng ip WM_COMMAND cng vi cc i s lParam v wParam, hp thoi kim tra trng thi ca tt c cc thnh phn iu khin con nm trong n v thit lp cc trng thi cho cc thnh phn iu khin con ny. C th nh du mt nt chn bng cch gi thng ip SendMessage (hwndCtrl ,MB_SETCHECK, 1, 0); V ngc li mun b chn mt nt no th dng hm. SendMessage (hwndCtrl, MB_SETCHECK, 0, 0);

Trang 41

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Trong i s hwndCtrl l handle ca ca s iu khin con. Chng ta c th gp rc ri khi mun s dng hai hm trn bi v khng bit handle ca cc thnh phn iu khin con. Chng ta ch bit handle ca cc thnh phn iu khin con khi nhn c thng ip WM_COMMAND. gii quyt c vng mc trn, trong Windows cung cp mt hm ly handle ca ca s con khi bit c nh danh ID ca n bng hm. hwndCtrl = GetDlgItem (hDlg, id); // hDlg l handle ca hp thoi C th ly c ch danh ID ca thnh phn iu khin con khi bit c handle ca n bng hm sau. id = GetWindowLong (hwndCtrl, GWL_ID); Tuy nhin, chng ta c th qun l ID ca cc thnh phn iu khin con, cn handle l do Windows cp ngu nhin, do vic dng handle nhn v ID ca cc thnh phn iu khin con l t dng n. Khi hp thoi nhn c thng ip WM_COMAND th chng ta phi kim tra nt radio no c chn (xc nh mu cn chn), v tin hnh b chn cc nt khc bng on lnh 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) ; for( i = IDC_BLACK, i < IDC_WHITE,i++) SendMessage(GetDlgItem(hDlg, i),MB_SETCHECK, i == LOWORD( wParam), 0).

Trang 42

NGN NG LP TRNHreturn TRUE ; }

LP TRNH C TRN WINDOWS

Trong iColor dng lu gi tr mu hin hnh c chn. Vng lp for dng kim tra trng thi ca tt c cc nt radio thng qua ID ca chng. Hm GetDlgItem dng ly handle ca nt c chn v lu vo bin i. Hm SendMessage dng gi thng ip MB_SETCHECK ti cc nt radio. Nu word thp ca i s wParam bng ch danh ID ca nt c chn th nt c nh du v cc nt khc s khng c chn. Ch :Trong cc v d trn thng dng hai nt OK v nt Cancel, hai nt ny c Windows t nh danh mc nh theo th t l IDOK v IDCANCEL. Thng thng ng hp thoi bng cch nhn chut vo mt trong hai nt OK hoc Cancel. Trong Windows, khi nhn nt Enter th Windows lun pht sinh thng ip WM_COMMAND, bt k i tng no ang nhn focus. LOWORD ca i s wParam mang gi tr ID ca nt nhn mc nh (nt OK), ngoi tr c mt nt ang nhn focus (trong trng hp ny th LOWORD ca i s wParam mang ch danh ca nt ang nhn focus). Nu nhn nt Esc hay nhn Ctrl+Break, th Windows gi thng ip WM_COMMAND vi thnh phn LOWORD ca i s wParam c gi tr IDCANCEL (nh danh mc nh ca nt Cancel). Do khng cn phi x l thm cc phm g ng hp thoi. Trong v d 2.2 x l hai trng hp khi nhn nt Cancel v nt OK ta dng on chng trnh sau.switch (LOWORD (wParam)) { case IDOK: iCurrentColor = iColor ; iCurrentFigure = iFigure ; EndDialog (hDlg, TRUE) ; return TRUE ; case IDCANCEL: EndDialog (hDlg, FALSE) ; return TRUE ; }

Hm EndDialog dng kt thc v ng hp thoi.Trong trng hp nhn nt OK th hai gi tr iCurrentColor v gi tr iCurrentFigure c lu li cho ca s cha (c hai bin trn Trang 43

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

u l bin ton cc). Ch rng, hai gi tr khc bit (TRUE, FALSE) ca i s th hai trong li gi hm EndDialog. Gi tr ny s c tr ngc v t li gi hm DialogBox trong th tc 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 nu hm DialogBox tr v gi tr TRUE, tc nt OK c nhn. Lc th tc WndProc s cp nht li ni dung ca ca s chnh, bng cch ghi li s thay i gi tr ca hai bin ton cc iCurrentColor v gi tr iCurrentFigure dng v li hnh ch nht hay hnh ellipse vi mu c chn l iCurrentColor. V ngc li nu nhn nt Cancel th gi tr iCurrentColor v gi tr iCurrentFigure s khng thay i, tc th tc WndProc s dng li gi tr c. Gi tr TRUE hay FALSE thng bo cho ca s chnh bit rng ngi dng t chi hay chp thun ty chn trong hp thoi. V TRUE v FALSE c kiu s nguyn (1,0) nn i s th hai trong li gi hm EndDialog c kiu s nguyn (int). Do kt qu tr v ca hm ny cng c kiu l s nguyn. V d nu bn bm nt OK th tr tr v ca hm bng 1. Nu bn bm nt Cancel th tr tr v ca hm bng 0, v nu trong chng trnh c s dng nt bm mc nh Inoge th khi bm nt ny tr tr ca hm s l 2. 2.2.1.7. V trong hp thoi Trong v d 2.2 chng ta dng phng php v trn hp thoi y l cng vic khc thng. By gi ta tm hiu cng vic tin hnh nh th no. Trong file RESOURCE.RC c thnh phn iu khin l. LTEXT "",IDC_PAINT, 5, 22, 92, 93 Khi chng ta chn nt radio thay i mu, hnh v hay nhn c thng ip WM_PAINT th th tc DialogProc thc hin thao tc v vo thnh phn iu khin ca hp thoi bng hm PaintTheBlock. Hm ny c khai bo nh sau. Trang 44

NGN NG LP TRNH PaintTheBlock(hCtrBlock, iColor, iFigure);

LP TRNH C TRN WINDOWS

Trong hCtrBlock l handle ca thnh phn iu khin c nh danh l IDC_PAINT. Handle ca thnh phn iu khin ny c ly v bi hm. hCtrBlock=GetDlgItem(hDlg, IDC_PAINT); Ni dung ca hm PaintTheBlock nh sau.void PaintTheBlock(HWND hCtrl, int iColor, int iFigure) { InvalidateRect(hCtrl, NULL, TRUE); UpdateWinDow(hCtrl); PaintWinDow(hCtrl, iColor, iFigure); }

Hm InvalidateRect(hCtrl, NULL, TRUE) v UpdateWindow(hCtrl) c nhim v lm cho ca s con cn phi v li. Hm PaintWindow dng v ra mn hnh ellipse hay ch nht. u tin hm ny ly DC (device context) ca thit b c handle l hCtrl, v v ln thit b ny dng hnh nh cng vi mu t c chn. Kch thc ca ca s con cn v c ly bng hm GetClientRect.Hm ny tr v kch thc ca vng client cn v theo n v tnh l pixel. Chng ta v trn vng client ca cc iu khin con ch khng v trc tip ln vng client ca hp thoi. Khi hp thoi nhn c thng ip WM_PAINT th thnh phn iu khin c nh danh IDC_PAINT c v li. Cch x l thng ip WM_PAINT ging nh th tc x l WndProc ca ca s chnh, nhng th tc x l hp thoi khng gi hm BeginPaint v hm EndPaint bi v n khng t v ln ca s ca chnh n. Nu mun v hiu ha mt phn t iu kin, tc bin i nt sang trng thi v hiu ha th dng hm. EnableWindow(hwndCtrl, bEnable); i s hwndCtrl l ch danh ca thnh phn iu khin mun v hiu ha, thnh phn th hai l bEnable mang hai gi tr TRUE hay FALSE, nu thnh phn ny mang gi tr FALSE th iu khin ny c v hiu ha, cn ngc li nu thnh phn ny mang gi tr TRUE th iu khin c hiu ha tr li.

2.2.2. Hp thoi khng trng thi

Trang 45

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Trong phn trn tho lun loi hp thoi, th nht l hp thoi trng thi, v by gi tip tc tho lun n loi hp thoi th hai, hp thoi khng trng thi (modeless). hiu r cch s dng cng nh nhng thao tc trn hp thoi khng trng thi, chng ta th t tm hiu qua cc mc sau. 2.2.2.1. S khc nhau gia hp thoi trng thi v hp thoi khng trng thi Hp thoi khng trng thi khc vi hp thoi trng thi ch. Sau khi hin th hp thoi khng trng thi chng ta c th chuyn thao tc n cc ca s khc m khng cn ng hp thoi dng ny li. iu ny thun tin i vi ngi dng khi ngi dng mun trc quan cc s thao tc cng mt lc. V d nh trnh son tho Studio Deverloper bn c th thao tc qua li gia hai hp thoi, l hp thoi bn cn thit k v mt hp thoi cha cc loi iu khin m bn dng thit k. Vi cch lm ny gip ngi dng trc quan hn so vi cch ch cho php ngi dng ch thao tc trn mt ca s. S dng hm DialogBox gi hp thoi trng thi v ch nhn c kt qu tr v khi hp thoi ny b ng cng vi hm DialogBox kt thc. Gi tr tr v ca hm ny do i s th hai ca hm kt thc hp thoi (EndDialog) quy nh. Cn i vi hp thoi khng trng thi th c to ra bng hm. hDlgModeless=CreateDialog(hInstance, szTemplate, hwndParent, DialogProc); Nhng hm ny tr quyn iu khin v cho ni gi ngay lp tc v gi tr tr v l handle ca ca hp thoi hin hnh. V c th c nhiu ca s thao tc cng mt lc nn bn lc handle ny d dng truy cp khi bn cn. Phi t ch WS_VISIBLE cho hp thoi khng trng thi, bng cch chn mc More Styles trong ca s Properties ca hp thoi. Nu nh khng bt ch VISIBLE ln th chng trnh phi c cu lnh ShowWindow sau li gi hm CreateDialog khi mun hin th hp thoi dng ny ln mn hnh. hDlgModeless=CreateDialog(hInstance, szTemplate, hwndParent, DialogProc); ShowWindow(hDlgModeless,SW_SHOW); Cc thng ip gi n hp thoi dng modal do trnh qun l Windows iu khin cng khc vi cc thng ip gi n hp thoi dng modeless phi i qua hng i ca chng trnh chnh. Bi v cc thng ip ca hp thoi dng modeless dng chung vi cc thng ip ca ca s chng trnh chnh. Nh vy chng ta phi lc ra thng ip no l thng ip gi n hp thoi khi thao tc trn hp thoi t trong vng lp nhn thng ip. lm c iu ny chng ta dng handle ca hp thoi (lu trong bin ton cc) c tr v t li gi hm CreateDialog v chuyn hng chng bng on lnh nh sau.while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless==0 || !IsDialogMessage (hDlgModeless, &msg);

Trang 46

NGN NG LP TRNH{ TranslateMessage(&msg); DispatchMessage(&msg); } }

LP TRNH C TRN WINDOWS

Nu thng ip ly ra t hng i dnh cho hp thoi th hm IsDialogMessage kim tra v gi n cc th tc x l hp thoi. V lc ny hm tr v gi tr TRUE, cn ngc li th hm tr v gi tr FALSE. Nu dng thm chc nng phm tng tc th on chng trnh trn cvit li nh sau. while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless==0 || !IsDialogMessage(hDlgModeless, &msg); { if(TranslateAccelerator (hwnd, hAccel, &msg) { TranslateMessage(&msg); DispatchMessage(&msg); } } }

Nn ch rng bin hDlgModeless lun mang gi tr 0 cho n lc c mt hp thoi c khi to bng cu lnh CreateDialog th gi tr ca n mi c thay i. Khi ca s hp thoi b hy nh t hDlgModeless v gi tr 0. iu ny gip Windows khng gi nhm thng ip x l n cc ca s khc. kt thc v ng hp thoi dng Modeless bn dng hm DestroyWindow ch khng phi dng hm EndDialog nh hp thoi dng Modal. 2.2.2.2. V d v hp thoi khng khng trng thi minh ha cch dng hp thoi khng trng thi (modeless) ta xt v d 2.3. Chng trnh v d 2.3 sau khi chy c kt qu nh sau.

Trang 47

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Hnh 2.6 Minh ha hp thoi khng trng thi

Khi dng chut chn loi hnh v trn radio button, loi hnh v c chn s v cng lc ln control tnh ca hp thoi v ca s chnh. Dng chut chn mu t cho hnh v c chn, bng cch r chut ln 3 thanh cun Scrollbar. Chng trnh minh ha (V d 2.3) : * MODELESS.CPP (trch dn)void PaintWindow (HWND hwnd, int iColor[], int iFigure) { HBRUSH hBrush ; HDC hdc ; RECT rect ; 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)) ;

Trang 48

NGN NG LP TRNHReleaseDC (hwnd, hdc) ; }

LP TRNH C TRN WINDOWS

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) ; } 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 ;

Trang 49

NGN NG LP TRNHstatic 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) ; } return TRUE ; case WM_COMMAND: { switch( LOWORD(wParam)) { case IDC_RECT: case IDC_ELLIPSE: iFigure = LOWORD(wParam) ; hwndParent = GetParent (hDlg) ;

LP TRNH C TRN WINDOWS

CheckRadioButton(hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ; PaintTheBlock(hCtrlBlock, iColor, iFigure) ; PaintTheBlock (hwndParent, iColor, iFigure) ;

Trang 50

NGN NG LP TRNHreturn 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)) { 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;

LP TRNH C TRN WINDOWS

Trang 51

NGN NG LP TRNHcase 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) ; InvalidateRect(hwndParent,NULL,TRUE);

LP TRNH C TRN WINDOWS

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. MENUTrong giao din ng dng Windows, thnh phn quan trng thng khng th thiu l menu ca chng trnh. Menu xut hin ngay di thanh tiu ca chng trnh ng dng. Ngoi ra trong mt s ng dng thanh menu c th di chuyn c.

Trang 52

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Tht ra menu cng kh n gin, v chng c t chc thnh cc nhm trn thanh chnh (File, Edit, View,), mi mc lit k trong menu chnh c th cha mt hay nhiu mc lit k gi l menu popup hay dropdown, v vi mi mc lit k trong menu popup ny c th c cc mc con ca n,. Cc mc lit k trn menu c th dng kch hot mt lnh, hay chn trng thi (check, uncheck). Cc mc lit k trn menu c 3 dng: c hiu lc (enabled), khng c hiu lc (disabled), v mu xm (grayed). Vi quan im lp trnh th ta ch cn hai trng thi l c hiu lc v khng c hiu lc m thi, do trng thi mu xm s ch cho ngi dng bit l trng thi ca mc lit k c hiu lc hay khng. V vy khi vit chng trnh nhng mc no khng c hiu lc th ta thit lp trng thi mu xm, khi ngi dng s bit rng mc lit k khng c hiu lc.

2.3.1. Thit lp Menu to mt menu v a vo chng trnh bao gm cc bc sau: *To menu trong tp tin ti nguyn *.RC: to menu trong tp tin ti nguyn, thng c 2 cch chnh l: dng mt trnh son tho m tp tin ti nguyn v son tho theo cu trc tp tin RC cung cp cho ti nguyn menu. Thng thng, cch ny t s dng, v cc mi trng pht trin C trn Windows (Borland C for Windows, Visual C) u cung cp cc cng c cho php to menu mt cch d dng. *Ci t menu vo ca s ca chng trnh ng dng: phn ny n gin l khi nh ngha lp ca s ta thit lp thuc tnh lpszMenuName ca cu trc lp WNDCLASS bng tn menu c khai bo trong tp tin ti nguyn. V d : wndclass.lpszMenuName = "MENU1"; Ngoi ra, c th ci t menu vo ca s bng cch dng lnh : hMenu = LoadMenu ( hInstance, TEXT("MENU1") ); Lnh ny s tr v mt nh danh ca menu c np, khi c c nh danh menu ny th khi a vo ca s c 2 cch sau: *Trong hm to ca s CreateWindow, tham s th 9 ca hm l nh danh cho menu, thit lp tham s ny l nh danh ca menu va to. hwnd = CreateWindow ( TEXT("MyClass"), TEXT("Window Caption"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, NULL ); *Khi gi hm to ca s CreateWindow, tham s th 9 c thit lp NULL, sau trong chng trnh dng lnh: SetMenu(hWnd, hMenu); thit lp menu cho ca s.

Trang 53

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

*Thm cc on chng trnh x l menu: Windows pht sinh thng ip WM_COMMAND v gi n chng trnh khi ngi dng chn mt mc lit k c hiu lc trn thanh menu. Khi ch cn x l thng ip WM_COMMAND bng cch kim tra 16 bit thp ca tham s wParam l xc nh c ID ca mc lit k no trn menu c chn.

2.3.2. V d minh ha Menu*Tp tin ti nguyn cha khai bo menu : MENUDEMO.RCMENUDEMO MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New", IDM_FILE_NEW 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"

Trang 54

NGN NG LP TRNHBEGIN

LP TRNH C TRN WINDOWS

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 MENUITEM "&Help...", IDM_APP_HELP MENUITEM "&About ...", IDM_APP_ABOUT END END

*Tp tin tiu cha 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

Trang 55

NGN NG LP TRNH#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

LP TRNH C TRN WINDOWS

*Tp tin cha m ngun : MENUDEMO.C#include #include "menudemo.h" 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 ;

Trang 56

NGN NG LP TRNHwndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) {

LP TRNH C TRN WINDOWS

MessageBox(NULL, TEXT("This program requires Windows "), szAppName, MB_ICONERROR) ; return 0 ; } 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 chi t, cc hng 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) {

Trang 57

NGN NG LP TRNHcase WM_COMMAND: hMenu = GetMenu (hwnd) ; // Ly nh danh ca menu

LP TRNH C TRN WINDOWS

switch (LOWORD (wParam)) // Kim tra nh danh mc chn { case IDM_FILE_NEW: case IDM_FILE_OPEN: case IDM_FILE_SAVE: case IDM_FILE_SAVE_AS: MessageBeep(0) ; //Pht ra ting ku bp return 0 ; case IDM_APP_EXIT: /*Gi thng ip ng ng dng li*/ 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:

Trang 58

NGN NG LP TRNH/* B check ca mc chn trc */ CheckMenuItem(hMenu,iSelection, MF_UNCHECKED); iSelection = LOWORD (wParam) ; /*Ly ID mc mi*/ /* Check mc chn mi*/ CheckMenuItem (hMenu, iSelection, MF_CHECKED) ; /* Thit lp mu tng ng vi mc chn mi*/

LP TRNH C TRN WINDOWS

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 59

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Chng 3 CC I TNG IU KHIN3.1. M UCc i tng iu khin (control) l cc thnh phn tng tc trc quan, th hin r c ch giao tip ha gia ng dng v ngi dng. Nh cc i tng ny, cc chng trnh ng dng trong Windows tr nn thn thin v d dng. V th, chng l cc thnh phn c bn khng th thiu trong hu ht cc ng dng. Trong chng ny, chng ta s tm hiu cc to lp v x l cho cc i tng iu khin thng qua cc lp (class) sau : Lp Button (nt bm). Lp Static (tnh). Lp Edit Box (son tho). Lp List Box (danh sch). Lp Combo Box. Lp Scroll Bar (thanh cun).

Trang 60

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

3.2. GII THIU TNG QUANMt kiu iu khin c xem nh l mt ca s con. C th to nhiu ca s con trong cng mt ca s cha. Cc ca s con xc nh handle ca s ca cha bng cch gi hm : hwndParent = GetParent (hwnd); hwnd l handle ca ca s con cn ly handle ca ca s cha. V khi ly c handle ca ca s cha, ca s con c quyn gi cc thng ip n ca s cha thng qua hm. SendMessage(hwndParent, message, wParam, lParam); message l thng ip cn gi n th tc x l ca ca s cha. wParam l ch danh ID ca ca s con, cn lParam ghi li trng thi ca ca s con. Vy chng ta c th to mt thnh phn iu khin dng ca s con hay cn gi l "child window control". Ca s con c nhim v x l cc thng ip nh bn phm, thng ip chut v thng bo cho ca s cha khi trng thi ca ca s con thay i. Nh vy ca s con tr thnh cng c giao tip (cho php nhp v xut) gia ngi dng vi chng trnh. Tuy chng ta c th to ra mt ca s con cho chnh mnh, nhng chng ta nn tn dng cc lp ca s con c Windows nh ngha sn hay cn gi l nhng kiu iu khin chun. Nhng kiu iu khin chun ny thng l cc nt bm (button), hp kim tra (check box), hp son tho (edit box), hp danh sch (list box), combo box, cc thanh cun v chui ch. V d mun to ra mt nt bm trn mn hnh ch cn gi hm CreateWindows, m chng cn phi quan tm n cch v, cch nhn chut hay l chp khi b kch hot. Tt c iu ny u do Windows x l. iu quan trng lphi chn thng ip WM_COMMAND ca cc iu khin x l thng ip ny theo nhng mc ch khc nhau. Cc kiu iu khin con thng c dng trong hp thoi. Nh minh ha trong chng 2, cc iu khin nhn hp thoi lm ca s cha. Tuy nhin, cng c th to cc kiu iu khin con trc tip trn vng ca s chnh, bng cch gi hm CreateWindow v iu chnh v tr cng vi kch thc ca n cho thch hp bng hm MoveWindow. Th tc x l thng ip ca ca s cha gi cc thng ip n cc khiu iu khin con, v ngc li cc child window control gi cc thng ip yu cu ca s cha x l cc thng ip . to mt ca s ng dng bnh thng. u tin phi ng k lp ca s bng hm RegisterClass. Tip theo l khi to lp ng k thng qua hm CreateWindow. Cn trng hp mun to mt lp c nh ngha sn th khng cn ng k cho lp ca s con mun to. S dng cc kiu iu khin trc tip trn ca s chnh i hi cc tc v cp thp hn so vi dng cc kiu iu khin trn hp thoi. V cc kiu iu khin to ra trn ca s chnh khng c h tr cc tin ch. V d nh chng ta khng th s dng phm bm tab chuyn focus gia cc kiu iu khin vi nhau.

3.3. LP BUTTONTrang 61

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

tm hiu cc kiu iu khin, xem xt v d 3.1 sau. Trong v d ny to ra 9 ca s con chun trn mt ca s cha nh hnh 3.1.

Hnh 3.1 Minh ha cc lp Button

Nhp chut vo cc nt, lc cc nt s gi thng ip WM_COMMAND n th tc x l thng ip WndProc ca ca s cha. Th tc WndProc x l v in ra mn hnh cc thng s lParam v wParam ca thng ip gi ti ny.Trong lParam l handle ca ca s con gi thng ip n ca s cha. wParam c hai phn LOWORD v HIWORD, LOWORD cho bit ID ca ca s con, HIWORD l m thng bo. M thng bo nt bm l mt trong nhng 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_KILLFOCUSBng 3.1 nh danh m thng bo Button

Gi tr 0 1 2 3 4 5 6 7

Trang 62

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Khng bao gi thy c cc gi tr ca nt bm, ch bit rng gi tr t 1 n 4 dnh cho kiu button BS_USERBUTTON, gi tr 5 dnh cho kiu BS_RADIOBUTTON, BS_AUTORADIOBUTTON, BS_OWNEDRAW, hay cc nt bm khc nu nt bm bao gm kiu BS_NOTYFY. Gi tr 5,6 dnh cho cc kiu nt bm bao gm c c NOTYFY. Sau y l chng trnh chnh. * CONTROL1.CPP (trch dn)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) ; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

Trang 63

NGN NG LP TRNHstatic 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++)

LP TRNH C TRN WINDOWS

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 ; rect.right = LOWORD(lParam) ; rect.bottom = HIWORD(lParam) ; return 0 ; case WM_PAINT :

Trang 64

NGN NG LP TRNHInvalidateRect (hwnd, &rect, TRUE) ; hdc = BeginPaint (hwnd, &ps) ; SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); SetBkMode (hdc, TRANSPARENT) ;

LP TRNH C TRN WINDOWS

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 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }

to ra mt child window control bn dng cu trc CreateWindow vi cc thng s nh sau.

Trang 65

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

: cxChar

-> hInstance, NULL) ;

Trong tn lp l c nh. Tn ca s do chng ta t. Kiu ca s s dng l WS_CHILD, WS_VISIBLE v mt trong 9 kiu button (BS_PUSHBUTTON, BS_CHECKBOX,...). Tip theo l 4 thng s xc nh v tr x, v tr y, kch thc theo chiu rng, kch thc chiu cao ca ca s con trn vng client ca ca s cha. hwnd l handle ca ca s cha. ID l ch danh ca mi ca s con (mi ca s con c duy nht mi s ID). ID ny phi p kiu HMENU ch nh trnh n. lParam thc cht l mt con tr n cu trc LPCREATESTRUCT c thnh phn hInstance. D mun ly th qun hInstance th phi p kiu lParam.

3.3.1. Lp Push ButtonTrong v d 3.1 c hai Push Button c to ra bng hm CreateWindow vi kch thc v v tr c xc nh bi ngi lp trnh. Cc Push Button c s dng bt tt mt hnh ng tc thi ch khng gi c trng thi bt hay tt lu di nh checkbox c. Trn y l hai kiu ca s BS_PUSHBUTTON v BS_DEFBUTTON (kiu nt bm mc nh). Hai kiu ny khi thit k th khc nhau nhng khi s dng th n c chc nng hon ton ging nhau. Khi nhn chut vo nt ny th nt ny gi thng ip WM_COMMAND n ca s cha vi m thng bo BN_CLICK. C th tc ng n nt bm ny bng cch gi hm. SendMessage( hwndButton, BM_SETSTASE, 1, 0 ); Nu mun nt nhn ny tr li trng thi bnh thng th gi hm : SendMessage(hwndButton, BM_SETSTASE, 0, 0 ); hwndButton l nh danh ca ca s con c tr v bi hm CreateWindow.

3.3.2. Lp Check BoxMt check box l l mt hp vung km theo ch. Thng thng ch nm bn tri ca hp. Tuy nhin, cng c th t ch nm bn phi bng cch thm vo kiu BS_LEFTTEXT khi to mt button. Cc check box cho php ngi dng chn cc ty chn, n hot ng nh mt cng tc. C hai loi check box thng dng l BS_CHECKBOX v BS_AUTOCHECKBOX. Khi s dng loi BS_CHECKBOX, chng ta t t du check box Trang 66

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

bng cch gi n kiu iu khin ny thng ip BS_SETCHECK. Thng s wParam trong hm SendMessage c t gi tr 1 to nh du, v bng 0 khi mun hy nh du. Ly trng thi ca mt check box bng cch gi n kiu iu khin ny thng ip BM_GETCHECK. Dng on chng trnh sau bt tt du check khi x l thng ip WM_COMMAND c gi n t cc kiu iu khin.SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)!SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0), 0);

Ch ton t ! (NOT) ng trc hm SendMessage. Gi tr lParam l handle ca ca s con gi n ca s cha trong thng ip WM_COMMAND. Mun bit trng thi ca check box no th gi ti n thng ip BM_GETCHECK. khi ng mt check box loi BS_CHECKBOX vi trng thi c nh du, bng cch gi n n mt thng ip BM_SETCHECK theo cu trc. SendMessage (hwndButton,BM_SETCHECK, 1, 0); Cn check box BS_AUTOCHECK l loi nt bm m t n nh du bt hay tt cho chnh n. Mun ly trng thi ca check box hin hnh, ch cn gi thng ip BM_GETCHECK n kiu iu khin ny theo cu trc. iCheck = SendMessage (hwndButton, BM_SETCHECK, 1, 0); iCheck mang gi tr TRUE nu check box trng thi chn, cn ngc li iCheck mang gi tr FALSE. Ngoi ra cn c hai loi check box khc l BS_3STATE v BS_AUTO3STATE. Hai loi ny cn c thm trng thi th 3, l trng thi nt check box c mu xm xut hin khi bn gi thng ip WM_SETCHECK vi tham s wParam bng 2 n check box ny. Mu xm cho bit ngi dng chn la khng thch hp hay khng xc nh.

3.3.3. Lp Radio ButtonMt radio button l mt vng trn c km theo ch. Ti mt thi im ch c mt radio button c nhn. Cc radio thng c nhm li s dng cho vic la chn duy nht trong nhm. Trng thi cc radio button khng bt tt nh check box. C ngha, khi nhn chut vo radio button th button ny c nh du, v khi ta nhn chut vo mt ln na th radio cng vn trng thi nh du. C hai kiu radio button l BS_RADIOBUTTON v BS_AUTORADIOBUTTON, nhng kiu th hai ch s dng trong hp thoi. Khi nhn thng ip WM_COMMAND t radio button, th chng ta phi nh du radio bng cch gi thng ip BM_SETCHECK vi thng s wParam bng 1 nh sau. SendMessage(hwndButton, BM_SETCHECK, 1, 0); Tt c cc radio button trong cng mt nhm, nu bn mun tt du check th bn gi n chng thng ip BM_SETCHECK vi thng s wParam bng 0 nh sau.

Trang 67

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

SendMessage(hwndButton, BM_SETCHECK, 0, 0);

3.3.4. Lp Group BoxGroup box c kiu BS_GROUPBOX, y l loi button c bit. Mt group box ch n gin l mt ng vin c dng tiu trn nh. Group box khng x l cc thng ip bn phm, khng x l cc thng ip chut v cng khng gi thng ip WM_COMMAND n ca s cha ca n. Cc group box thng c s dng bao quanh cc kiu iu khin khc.

3.4. LP STATICTo ra mt lp tnh bng cch s dng "static" khi to lp ca s trong hm CreateWindow. Lp tnh khng nhn nhp d liu t bn phm cng nh t chut, v khng gi thng ip WM_COMMAND n ca s cha. Khi di chuyn hay nhn chut vo cc ca s con tnh, ca s con ny by thng ip WM_NCHITTEST v tr v gi tr HTTRANSPARENT n Windows. iu ny lm cho Windows gi cng thng ip WM_NCHITTEST cho ca s cha. Ca s cha thng gi thng ip ny n th tc DefWindowProc. Cc kiu ca s tnh sau y dng v mt hnh ch nht hay mt khung ln vng client ca ca s con. Cc kiu FRAME l nhng ng bao hnh ch nht, cc kiu RECT l nhng hnh ch nht : SS_BLACKRECT, SS_GRAYRECT, SS_ WHITERECT. SS_BLACKFRAME, SS_GRAYFAME, SS_WHITEFRAME.

3.5. LP EDIT TEXTTrong mt phng din no th lp son tho (edit text) c xem l mt ca s c nh ngha sn n gin nht. Nhng xt mt kha cnh khc th n li phc tp nht. Dng tn lp "edit" cng vi cc thng s v tr x, v tr y, chiu rng, chiu cao trong hm CreateWindow to ra ca s son tho. Khi ca s son tho nhn focus th chng ta c th g ch vo, xo cc ch, nh du cc chvv. Cc thao tc trn c Windows h tr hon ton. Mt trong nhng ng dng thng xuyn nht, v n gin nht ca lp son tho l to ra mt ca s cho php ngi dng nhp cc ch vo. minh ha cho ca s nhp ta xt v d 3.2 sau. *#include #define ID_EDIT 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); TCHAR szAppName[] = TEXT ("PopPad1") ;

Trang 68

NGN NG LP TRNHlParam) { static HWND hwndEdit ; switch (message) { case WM_CREATE :

LP TRNH C TRN WINDOWS

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM

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); 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) ; }

Trang 69

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

Hn ch ca edit box c nh ngha sn l s k t ngi dng nhp vo phi khng qu 30.000 k t ch.

3.5.1. Cc kiu lp Edit TextTrong v d trn to mt edit box bng cch gi hm CreateWindow. C kiu ca s l WS_CHILD, cng mt s ty chn. Chng ta c th canh tri, phi, gia cc ch trong vng ca s edit box bng cch thay i thng s kiu ca s ES_LEFT, ES_RIGHT, ES_CENTER trong hm CreateWindow. C th to mt edit control cho php hin th nhiu hng bng cch chn kiu ca s ES_MULTILINE. Mt edit control mc nh ch cho php nhp mt hng k t cho n cui edit box. S dng ES_AUTOHSCROLL, ES_AUTOVSCROLL to mt edit control c thanh cun ngang, v cun ng t ng. C th thm thanh cun ngang v ng vo edit control bng cch s dng kiu ca s WS_HSCROLL, WS_VSCROLL. Dng kiu ca s WS_BORDER to ng vin cho edit control. Kch thc ca edit control c xc nh bng cch gi hm MoveWindow khi hm WndProc x l thng ip WM_SIZE. Trong v d trn th kch thc ca edit control c t bng kch thc ca ca s chnh. MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); Cc edit control gi thng ip WM_COMMAND cng cc thng s wParam, lParam n window ca s cha. Vi ngha : LOWORD(wParam) l ID ca s con, HIWORD(wParam) l m thng bo. lParam l handle ca edit control. M thng bo EN_SETFORCUS EN_KILLFORCUS EN_CHANGE EN_UPDATE EN_ERRSPACE EN_MAXTEXT EN_HSCROLL EN_VSCROLL ngha Endit control nhn focus nhp. Endit control mt focus nhp. Ni dung ca edit control s thay i. Ni dung ca edit control thay i. Edit control chy qu thi gian. Edit control chy qu khng gian khi chn. Thanh cun ng ca edit control b tc ng. Thanh cun nm ca edit control b tc ng.Bng 3.2 Danh sch m thng bo ca edit Control.

Trang 70

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

3.5.2. Cc thng ip n mt lp Edit TextCc th t thng ip sau cho php ct, sao chp, xo cc phn ch c chn (selected). SendMessage (hwndEdit, WM_CUT, 0, 0); SendMessage (hwndEdit, WM_COPY, 0, 0); SendMessage (hwndEdit, WM_CLEAR, 0, 0); Vi WM_CUT ct phn ch c nh du a vo vng Clipboard. WM_COPY sao chp phn ch c nh du a vo Clipboard nhng phn nh du vn cn trn edit control. WM_CLEAR xa phn ch c nh du m khng a vo clipboard. Chn phn ch nm trong clipboard vo vng son tho edit control bng cch gi hm. SendMessage (hwndEdit, WM_PASTE , 0, 0); Nhn bt u v kt thc ca phn ch chn bng cch gi hm : SendMessage (hwndEdit, EM_GETSEL, (WPARAM)&iStart, (LPARAM)&iEnd ); iStart lu v tr bt u v iEnd lu v tr kt thc. thay th phn ch chn bng ch khc, ta dng hm ; SendMessage(hwndEdit,EM_REPLACESEL,0,(LPARAM)szString); Trong szString l chui mun thay th. i vi edit control nhiu dng, ta m s dng ch bng hm. iCount = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0); Cc dng trong edit control c nh s bt th t t 0. Ly chiu di ca mt dng bng lnh. iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0). Chp hng ny vo b m bng cch gi hm. iLength = SendMessage ( hwdEdit, EM_GETLINE, iLine, (LPARAM)Buffer ).

3.6. LP LIST BOXList box l tp hp cc chui k t c gi gn trong mt hnh ch nht. Mt chng trnh c th thm hoc xa cc chui trong list box bng cch gi cc thng ip n th tc Trang 71

NGN NG LP TRNH

LP TRNH C TRN WINDOWS

window ca list box. List box control gi thng ip WM_COMMAND n ca s cha khi c mt mc trong list box b nh du. Ca s cha xc nhn cc mc trong list box b nh du. Mt list box c th chn c mt mc hay nhiu mc cng mt lc (ty theo loi list box n hay kp).

3.6.1 Cc kiu List BoxChng ta to mt ca s con list box bng hm CreateWindow vi lp ca s l "listbox" cng vi loi ca s WS_CHILD. Tuy nhin kiu ca s con mt nh ny khng gi thng ip WM_COMMAND n ca s cha, c ngha chng trnh t kim tra vic nh du cc danh mc trong list box. V th, cc kiu iu khin list box thng nh ngha kiu list box LBS_NOTYFY, iu ny cho php ca s cha nhn thng ip WM_COMMAND t list box. Nu mun sp xp cc mc trong list box th s dng kiu LBS_SORT. Theo mc nh, nhng list box to ra l nhng list box n. V th, nu mun to ra mt list box kp (tc list box cho php ngi dng chn nhiu dng cng lc) th phi s dng loi list box LBS_MULTIPLESEL.Thng thng, List box s t cp nht khi mt mc c thm vo. Tuy nhin c th ngn cn vic cp nht ny bng kiu LBS_NOREDRAW. Vic lm ny i khi khng thch lm, thay vo chng ta c th s dng thng ip WM_SETREDRAW ngn chn tm thi vic v li ca list box. Theo mc nh, cc mc trong list box khng c ng