Giáo trình Lập trình C trên Windows

NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
LP TRÌNH C TRÊN  
WINDOWS  
Trang 1  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Chương 1  
TNG QUAN LP TRÌNH C TRÊN WINDOWS  
1.1. MỞ ĐẦU  
Để lp trình trên Microsoft Windows®, chúng ta cn nm được các đặc đim cơ bn nht  
ca hệ điu hành này. Chương này sgii thiu khái quát các đặc đim hệ điu hành Microsoft  
Windows, các vn đề liên quan đến lp trình bng ngôn ngC, đồng thi đưa ra mt chương  
trình mu làm sườn cho các chương trình được viết sau này.  
Trong phn đầu, chúng ta tìm hiu sơ lược lch sphát trin ca hệ điu hành Microsoft  
Windows® và nhng đặc đim nn tng ca Windows.  
Phn tiếp theo strình bày nhng khái nim và yêu cu căn bn ca vic lp trình C trên  
Windows. Ngoài ra, phn này cũng gii thiu các cơ chế và các công cmà hệ điu hành cung  
cp cho người lp trình hay người phát trin các ng dng trên Windows.  
Cui chương là phn xây dng mt chương trình đơn gin nht trên Windows. Chương  
trình này được xem như là khuôn mu ca mt chương trình ng dng đin hình, và hu hết các  
đon chương trình được viết minh ha trong sách đều ly chương trình này làm khung sườn để  
phát trin cho phù hp vi tng yêu cu. Thêm vào đó, mt skiu dliu mi được định nghĩa  
trên Windows và nhng qui ước vcách đặt tên biến cũng được gii thiu trong phn này.  
Phn chi tiết và chuyên sâu hơn ca vic lp trình bng ngôn ngC trên môi trường  
Windows sẽ được trình bày trong các chương tiếp theo.  
1.2. HỆ ĐIU HÀNH MICROSOFT WINDOWS  
1.2.1. Gii thiu  
Gia thp niên 80, công ty phn mm máy tính Microsoft công bphiên bn đầu tiên ca  
dòng hệ điu hành Windows là Microsoft Windows® 1.0. Đây là hệ điu hành dùng giao din  
đồ ha khác vi giao din ký t(text hay console) ca MS-DOS. Tuy nhiên phi đến phiên bn  
thhai (Windows 2.0 - tháng 11 năm 1987) thì mi có bước ci tiến đáng k, đó là smrng  
giao tiếp gia bàn phím và thiết bchut và giao din đồ ha (GUI-Graphic User Interface) như  
trình đơn (menu) và hp thoi (dialog). Trong phiên bn này Windows chyêu cu bvi xlý  
Intel 8086 hay 8088 chy real-mode để truy xut 1 megabyte bnh.  
Tháng 5 năm 1990, Microsoft công bphiên bn tiếp theo là Windows 3.0. Sthay đổi  
ln trong phiên bn này là Windows 3.0 htrprotected-mode 16 bit ca các bvi xlý 286,  
386, và 486 ca Intel. Sthay đổi này cho phép các ng dng trên Windows truy xut 16  
megabyte bnh. Tiếp bước vi sphát trin là phiên bn Windows 3.1 ra đời năm 1992,  
Microsoft đưa công nghFont TrueType, âm nhc (multimedia), liên kết và nhúng đối tượng  
(OLE- Object Linking and Embedding), và đưa ra các hp thoi chung đã được chun hóa.  
Trang 2  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Trong sphát trin mnh mca nhng thp niên 90, Microsoft công btiếp dòng hệ  
điu hành Windows vi ng dng công nghmi (1993). Hệ điu hành này ly tên là  
Windows® NT® (Windows New Technology), đây là phiên bn hệ điu hành đầu tiên ca  
Windows htr32 bit cho bxlý 386, 486 và Pentium. Trong hệ điu hành này thì các ng  
dng phi truy xut bnhvi địa chlà 32-bit và các tp lnh hay chth32-bit. Ngoài ra  
Windows NT cũng được thiết kế để chy các bvi xlý (CPU) khác ngoài Intel và có thchy  
trên các máy trm (workstation).  
Hệ điu hành Windows 95 được công bnăm 1995 cũng là mt hệ điu hành 32-bit cho  
Intel 386 trvsau. Tuy thiếu tính bo mt như Windows NT và vic thích nghi vi máy trm  
công nghRISC, nhưng bù li hệ điu hành này yêu cu phn cng không cao.  
Song song vi sphát trin phn mm thì công nghphn cng cũng phát trin không  
kém. Để tn dng sc mnh ca phn cng thì các thế hWindows tiếp theo ngày càng hoàn  
thin hơn. Như Windows 98 phát trin tWindow 95 và có nhiu ci thin như hiu năng làm  
vic, htrcác thiết bphn cng tt hơn, và cui cùng là vic tích hp cht chvi Internet và  
Word Wide Web.  
Windows 2000 là hệ điu hành được xem là n định và tt ca dòng Windows, phiên bn  
này tăng cường các tính năng bo mt thích hp trong mi trường mng và giao din đẹp.  
1.2.2. Đặc đim chung ca hệ điu hành Microsoft Windows  
Windows là mt hệ điu hành sdng giao tiếp người dùng đồ ha (GUI), hay còn gi là  
hệ điu hành trc quan (Visual interface). GUI sdng đồ ha da trên màn hình nh nhphân  
(Bitmapped video display). Do đó tn dng được tài nguyên thc ca màn hình, và cung cp mt  
môi trường giàu tính trc quan và sinh động.  
Windows không đơn điu như MS-DOS (hay mt shệ điu hành giao din console) mà  
màn hình được sdng chỉ để thhin chui ký t, do người dùng gõ tbàn phím (keyboard)  
hay để xut thông tin dng văn bn. Trong giao din người dùng đồ ha, màn hình giao tiếp vi  
người sdng đa dng hơn, người dùng có thnhp dliu thông qua chut bng cách nhn vào  
các nút nhn (button) các hôp chn (combo box)…thiết bbây giờ đưc nhp, có thlà bàn phím  
và thiết bchut (mouse device). Thiết bchut là mt thiết bị định vtrên màn hình, sdng  
thiết bchut người dùng có thnhp dliu mt cách trc quan bng cách kích hot mt nút  
lnh, hay làm vic vi các đối tượng đồ ha liên quan đến ta độ trên màn hình.  
Để giao tiếp trong môi trường đồ ha, Windows đưa ra mt scác thành phn gi là các  
điu khin chung (common control), các điu khin chung là các đối tượng được đưa vào trong  
hp thoi để giao tiếp vi người dùng. Bao gm : hp văn bn (text box), nút nhn (button), nút  
chn (check box), hp danh sách (list box), hp chn (combo box)…  
Tht ra mt ng dng trên Windows không phi là quá phc tp vì chúng có hình thc  
chung. Chương trình ng dng thung chiếm mt phm vi hình chnht trên màn hình gi là  
mt ca s. Trên cùng ca mi ca slà thanh tiêu đề (title bar). Các chc năng ca chương  
trình thì được lit kê trong thc đơn la chn ca chương trình (menu) , hay xut hin dưới dng  
trc quan hơn là các thanh công c(toolbar). Các thanh công cnày cha các chc năng được  
sdng thường xuyên trong thc đơn để gim thi gian cho người dùng phi mthc đơn và  
Trang 3  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
chn. Thông thường khi cn ly thông tin hay cung cp thông tin cho người dùng thì mt ng  
dng sẽ đưa ra mt hp thoi, trong hp thoi này scha các điu khin chung để giao tiếp vi  
người dùng. Windows cũng ra to mt scác hp thoi chun như Open Files, và mt shp  
thoi tương tnhư nhau.  
Windows là mt hệ điu hành đa nhim, tùy thuc vào bnhmà ta có thchy nhiu  
ng dng cùng mt lúc, và cũng có thể đồng thi chuyn qua li gia các ng dng và thc thi  
chúng. Trong các phiên bn ca Windows® 98 và NT® trvsau, các chương trình ng dng tự  
bn thân chúng chia thành nhiu tiu trình (thread) để xlý và vi tc độ xlý nhanh to cm  
giác nhng chương trình ng dng này chy đồng thi vi nhau.  
Trong Windows, chương trình ng dng khi thc thi được chia snhng thtc mà  
Windows cung cp sn, các tp tin cung cp nhng thtc trên được gi là thư vin liên kết  
động (Dynamic Link Libraries - DLL). Windows có cơ chế liên kết nhng chương trình ng  
dng vi các thtc được cung cp trong thư vin liên kết đng.  
Khnăng tương thích ca Windows cũng rt cao. Các chương trình ng dng được viết  
cho Windows không truy xut trc tiếp phn cng ca nhng thiết bị đồ honhư màn hình và  
máy in. Mà thay vào đó, hệ điu hành cung cp mt ngôn nglp trình đồ ha (gi là Giao tiếp  
thiết bị đồ ho- Graphic Device Interface - GDI) cho phép hin thnhng đối tượng đồ ha mt  
cách ddàng. Nhvy mt ng dng viết cho Windows schy vi bt cthiết bmàn hình nào  
hay bt kì máy in, min là đã cài đặt trình điu khin thiết bhtrcho Windows. Chương trình  
ng dng không quan tâm đến kiu thiết bkết ni vi hthng.  
Như gii thiu phn trên khái nim liên kết động là thành phn quan trng ca  
Windows, nó được xem như là ht nhân ca hệ điu hành, vì bn thân ca Windows là các tp  
thư vin liên kết động. Windows cung cp rt nhiu hàm cho nhng chương trình ng dng để  
cài đặt giao din người dùng và hin thvăn bn hay đồ ha trên màn hình. Nhng hàm này được  
cài đặt trong thư vin liên kết động hay còn gi là DLL. Đó là các tp tin có dng phn mrng  
*.DLL hay *.EXE, hu hết được cha trong thư mc \Windows\System,  
\Windows\system32 ca Windows® 98 và các thư mc \WinNT\System, \WinNT\System32  
ca Windows® NT®.  
Trong các phiên bn sau này, hthng liên kết đng được to ra rt nhiu, tuy nhiên, hu  
hết các hàm được gi trong thư vin này phân thành 3 đơn vsau: Kernel, User, và GDI.  
Kernel cung cp các hàm và thtc mà mt ht nhân hệ điu hành truyn thng qun lý,  
như qun lý bnh, xut nhp tp tin và tác v. Thư vin này được cài đặt trong tp tin  
KRNL386.EXE 16 bit và KERNEL32.DLL 32 bit.  
User qun lý giao din người dùng, cài đặt tt ckhung ca sổ ở mc lun lý. Thư vin  
User được cài đặt trong tp tin USER.EXE 16 bit và USER32.DLL 32 bit.  
GDI cung cp toàn bgiao din thiết bị đồ ho(Graphics Device Interface), cho phép  
chương trình ng dng hin thvăn bn và đồ hotrên các thiết bxut phn cng như màn hình  
và máy in.  
Trang 4  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Trong Windows 98, thư vin liên kết động cha khong vài ngàn hàm, mi hàm có tên  
đặc t, ví dCreateWindow, hàm này dùng để to mt ca scho ng dng. Khi sdng các  
hàm mà Windows cung cp cho thì các ng dng phi khai báo trong các tp tin tiêu đề .h hay  
.hpp (header file).  
Trong mt chương trình Windows, có skhác bit khi ta gi mt hàm ca thư vin C và  
mt hàm ca Windows hay thư vin liên kết động cung cp. Đó là khi biên dch mã máy, các  
hàm thư vin C sẽ được liên kết thành mã chương trình. Trong khi các hàm Windows sẽ được  
gi khi chương trình cn dùng đến chkhông liên kết vào chương trình. Để thc hin được các  
li gi này thì mt chương trình Windows *.EXE luôn cha mt tham chiếu đến thư vin liên kết  
động khác mà nó cn dùng. Khi đó, mt chương trình Windows được np vào bnhsto con  
trtham chiếu đến nhng hàm thư vin DLL mà chương trình dùng, nếu thư vin này chưa được  
np vào bnhtrước đó thì bây gisẽ được np.  
1.3. LP TRÌNH TRÊN MICROSOFT WINDOWS  
1.3.1. Đặc đim chung  
Windows là hệ điu hành đồ ha trc quan, do dó các tài nguyên ca hthng cung cp  
rt đa dng đòi hi người lp trình phi nghiên cu rt nhiu để phát hay hết sc mnh ca hệ  
điu hành.  
Theo như nhng mc đích tiếp cn ca các nhà lp trình thì các ng dng trên Windows  
phi hết sc thân thin vi người dùng thông qua giao din đồ ha sn có ca Windows. Vlý  
thuyết thì mt người dùng làm vic được vi mt ng dng ca Windows thì có thlàm vic  
được vi nhng ng dng khác. Nhưng trong thc tế để sdng mt ng dng cho đạt hiu quả  
cao trong Windows thì cn phi có mt shun luyn trgiúp hay ti thiu thì phi cho biết  
chương trình ng dng làm vic như thế nào.  
Đa scác ng dng trong Windows đều có chung mt giao din tương tác vi người  
dùng ging nhau. Ví dnhư các ng dng trong Windows đa số đều có thanh thc đơn cha các  
mc như : File, Edit, Tool, Help… Và trong hp thoi thì thường cha các phn tử điu khin  
chung như : Edit Control, Button Control, Checkbox.  
1.3.2. Skhác bit vi lp trình trên MS-DOS  
Khi mi bước vào lp trình trên Windows đa sngười hc rt llm, nht là nhng  
người đã tng làm vic vi MS-DOS. Do MS-DOS là hệ điu hành đơn nhim và giao tiếp qua  
giao din console. Nên khi viết chương trình không phc tp.  
Còn đối vi Windows người lp trình slàm vic vi bcông clp trình đồ ha đa dng  
cùng vi cách xđa nhim, đa lung ca Windows. Vì vy vic lp trình trên Windows sẽ  
giúp cho người lp trình đỡ nhàm chán vi giao din console ca MS-DOS. Vic cgng phát  
huy các sc mnh tài nguyên ca Windows slàm cho nhng ng dng càng mnh m, đa dng,  
thân thin, và dsdng.  
1.3.3. Mt syêu cu đối vi người lp trình  
Trang 5  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Điu trước tiên ca người hc lp trình C trên Windows là phi biết lp trình C, sách này  
không có tham vng hướng dn người hc có ththông tho lp trình C trên Windows mà chưa  
qua mt lp hun luyn C nào. Tuy nhiên, không nht thiết phi hoàn toàn thông tho C mi hc  
được lp trình Windows.  
Để có thlp trình trên nn Windows ngoài yêu cu vvic sdng công clp trình,  
người hc còn cn phi có căn bn vWindows, ti thiu thì cũng đã dùng qua mt số ứng dng  
trong Windows. Tht syêu cu này không quá khó khăn đối vi người hc vì hin ti hu như  
Windows quá quen thuc vi mi người, nhng người mà đã sdng máy tính.  
Ngoài nhng yêu cu trên, đôi khi người lp trình trên Windows cũng cn có khiếu thm  
m, vì cách trình bày các hình nh, các điu khin trên các hp thoi tt thì slàm cho ng dng  
càng tin li, rõ ràng, và thân thin vi người dùng.  
1.3.4. Bcông cgiao din lp trình ng dng API  
Hệ điu hành Windows cung cp hàng trăm hàm để cho nhng ng dng có thsdng  
truy cp các tài nguyên trong hthng. Nhng hàm này được gi là giao din lp trình ng dng  
API (Application Programming Interface). Nhng hàm trên được cha trong các thư vin liên  
kết đng DLL ca hthng. Nhcó cu trúc đng này mi ng dng đều có thtruy cp đến các  
hàm đó. Khi biên dch chương trình, đến đon mã gi hàm API thì chương trình dch không thêm  
mã hàm này vào mã thc thi mà chthêm tên DLL cha hàm và tên ca chính hàm đó. Do đó mã  
các hàm API thc tế không được sdng khi xây dng chương trình, và nó chỉ được thêm vào  
khi chương trình được np vào bnhớ để thc thi.  
Trong API có mt shàm có chc năng duy trì sự độc lp thiết bị đồ ha, và các hàm này  
gi là giao din thiết bị đồ ha GDI (Graphics Device Interface). Do sự độc lp thiết bnên các  
hàm GDI cho phép các ng dng có thlàm vic tt vi nhiu kiu thiết bị đồ ha khác nhau.  
1.3.5. Cơ chế thông đip  
Không ging như các ng dng chy trên MS-DOS, các ng dng Win32® thì xlý theo  
các skin (event - driven), theo cơ chế này các ng dng khi được viết sliên tc chcho hệ  
điu hành truyn các dliu nhp vào. Hthng sẽ đảm nhim vic truyn tt ccác dliu  
nhp ca ng dng vào các ca skhác nhau ca ng dng đó. Mi mt ca sscó riêng mt  
hàm gi là hàm xlý ca sthường được đặt tên là WndProc, hthng sgi hàm này khi có  
bt cdliu nhp nào được truyn đến ca s, hàm này sxlý các dliu nhp đó và trả  
quyn điu khin vcho hthng.  
Hthng truyn các dliu nhp vào thtc xlý ca ca sthông qua mt hình thc  
gi là thông đip (message). Thông đip này được phát sinh từ ứng dng và hthng. Hthng  
sphát sinh mt thông đip khi có mt skin nhp vào (input even), ví dnhư khi người dùng  
nhn mt phím, di chuyn thiết bchut, hay kích vào các điu khin (control) như thanh  
cun,… Ngoài ra hthng cũng phát sinh ra thông đip để phn ng li mt sthay đổi ca hệ  
thng do mt ng dng mang đến, điu này xy ra khi ng dng làm cn kit tài nguyên hay ng  
dng tthay đổi kích thước ca ca s.  
Trang 6  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Mt ng dng có thphát sinh ra thông đip khi cn yêu cu các ca sca nó thc hin  
mt nhim vnào đó hay dùng để thông tin gia các ca s.  
Hthng gi thông đip vào thtc xlý ca svi bn tham s: định danh ca ca s,  
định danh ca thông đip, và hai tham scòn li được gi là tham sca thông đip (message  
parameters). Định danh ca ca sxác định ca smà thông đip được chỉ định. Hthng sẽ  
dùng định danh này để xác định cn phi gi thông đip đến thtc xlý ca ca s.  
Đnh danh thông đip là mt hng sthhin mc đích ca thông đip. Khi thtc xlý  
ca snhn thông đip thì nó sdùng định danh này để biết hình thc cn thc hin. Ví d, khi  
mt thông đip được truyn đến thtc ca sđịnh danh là WM_PAINT thì có ý nghĩa rng  
ca svùng làm vic thay đổi và cn phi vli vùng này.  
Tham sthông đip lưu giá trhay vtrí ca dliu, được dùng bi thtc ca skhi xử  
lý thông đip. Tham snày phthuc vào loi thông đip được truyn đến, nó có thlà số  
nguyên, mt tp các bit dùng làm chiu, hay mt con trỏ đến mt cu trúc dliu nào đó,…  
Khi mt thông đip không cn dùng đến tham sthì hthng sthiết lp các tham snày  
có giá trNULL. Mt thtc ca sphi kim tra xem vi loi thông đip nào cn dùng tham số  
để quyết định cách sdng các tham snày.  
Có hai loi thông đip :  
Thông đip được định nghĩa bi hthng (system-defined messages) :  
Dng thông đip này được hthng định nghĩa cho các ca s, các điu khin, và các tài  
nguyên khác trong hthng. Thường được bt đầu vi các tin tsau : WM_xxx, LB_xxx,  
CB_xxx,…  
Thông đip được định nghĩa bi ng dng (application-defined message) :  
Mt ng dng có thto riêng các thông đip để sdng bi nhng ca sca nó hay  
truyn thông tin gia các ca strong ng dng.  
Nếu mt ng dng định nghĩa các thông đip riêng thì thtc ca snhn được thông  
đip này phi cung cp các hàm xlý tương ng.  
Đối vi thông đip hthng, thì được cung cp giá trị định danh t0x0000 đến 0x03FF,  
nhng ng dng không được định nghĩa thông đip có giá trtrong khong này.  
Thông đip được ng dng định nghĩa có giá trị định danh t0x0400 đến 0x7FFF.  
Ltrình ca thông đip tlúc gi đi đến lúc xlý có hai dng sau:  
Thông đip được gi vào hàng đợi thông đip để chxlý (queue message): bao gm  
các kiu thông đip được phát sinh tbàn phím, chut như thông đip : WM_MOUSEMOVE,  
WM_LBUTTONDOWN, WM_KEYDOWN, WM_CHAR.  
Trang 7  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Thông đip được gi trc tiếp đến thtc xlý không qua hàng đợi (nonqueue message),  
bao gm các thông đip thi gian, thông đip v, và thông đip thoát như WM_TIMER,  
WM_PAINT, và WM_QUIT.  
Xlý thông đip : Mt ng dng phi xóa và xlý nhng thông đip được gi ti hàng  
đợi ca ng dng đó. Đối vi mt ng dng đơn tiu trình thì sdng mt vòng lp thông đip  
(message loop) trong hàm WinMain để nhn thông đip thàng đợi và gi ti thtc xlý ca  
stương ng. Vi nhng ng dng nhiu tiu trình thì mi mt tiu trình có to ca sthì scó  
mt vòng lp thông đip để xlý thông đip ca nhng ca strong tiu trình đó.  
1.4. CÁCH VIT MT NG DNG TRÊN MICROSOFT WINDOWS  
1.4.1. Các thành phn cơ bn to nên mt ng dng  
1.4.1.1. Ca sổ  
Trong mt ng dng đồ ha 32-bit, ca s(window) là mt vùng hình chnht trên màn  
hình, nơi mà ng dng có thhin ththông tin ra và nhn thông tin vào tngười sdng. Do  
vy, nhim vụ đầu tiên ca mt ng dng đồ ha 32-bit là to mt ca s.  
Mt ca sschia smàn hình vi các ca skhác trong cùng mt ng dng hay các  
ng dng khác. Chmt ca strong mt thi đim nhn được thông tin nhp tngười dùng.  
Người sdng có thdùng bàn phím, thiết bchut hay các thiết bnhp liu khác để tương tác  
vi ca sng dng.  
Tt ccác ca sổ đều được to tmt cu trúc được cung cp sn gi là lp ca sổ  
(window class). Cu trúc này là mt tp mô tcác thuc tính mà hthng dùng như khuôn mu  
để to nên các ca s. Mi mt ca sphi là thành viên ca mt lp ca s. Tt ccác lp ca  
snày đều được xlý riêng bit.  
1.4.1.2. Hp thoi và các điu khin  
Hp thoi (Dialog) dùng để tương tác vi người dùng trong mt chương trình ng dng.  
Mt hp thoi thường cha nhiu các đều khin như ô nhp văn bn (edit text), nút bm (button),  
ghi chú (static control), hp danh sách (list box)…  
Ø Nút bm (button): gm có Push Button dùng kích hot mt thao tác, Check Box  
dùng để chn mt trong hai trng thái (TRUE hay FALSE), Radio Button cũng ging như  
Check Box nhưng mt nhóm các Radio Button phi được chn loi trnhau.  
Ø Chú thích (static): dùng để cha các ghi chú trong hp thoi, ngoài ra ni dung  
có ththay đổi trong quá trình sdng hp thoi.  
Ø Hp lit kê (list box): Chn mt hay nhiu dliu được lit kê trong danh sách,  
nếu hp cha nhiu dòng và hp không hin thhết các mu thông tin thì phi kèm theo mt  
thanh cun (scroll bar).  
Ø Ô nhp văn bn (edit text): Dùng nhp văn bn, nếu ô có nhiu dòng thì thường  
kèm theo thanh cun.  
Trang 8  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Ø Thanh cun (scroll bar): ngoài vic dùng kèm vi list box hay edit box thì thanh  
cun còn có thsdng độc lp nhm to các thước đo…  
Ø Thc đơn (menu): là mt danh sách cha các thao tác vi mt định danh mà  
người dùng có thchn. Hu hết các ng dng có ca sthì không ththiếu thc đơn.  
Ø Thanh công c(toolbar): đây là mt dng menu nhưng chcha các thao tác cn  
thiết dưới dng các biu tượng đặc trưng.  
Ngoài ra còn rt nhiu các điu khin mà các công clp trình cung cp cho người lp  
trình hay thto ra da trên nhng thành phn được cung cp sn.  
1.4.1.3. ng dng đin hình trên Windows  
1.4.1.4. Các kiu tp tin để xây dng mt ng dng trên Windows  
Chương trình ngun  
Tương tnhư các chương trình C chun, bao gm các tp tin tiêu đề (header) cha trong  
tp tin *.h, *.hpp. Còn mã ngun (source code) cha trong tp tin *.c hay *.cpp.  
Tp tin định nghĩa  
Tp tin này có phn mrng là *.def, dùng định nghĩa các điu khin do chương trình  
to ra khi viết ng dng to DLL, ngoài ra còn dùng để khai báo vùng nhheap khi chy chương  
trình. Lúc trước do vn đề tương thích vi Windows 3.1 nên tp tin này thường được dùng, còn  
ngày nay chúng ít được dùng đến.  
Các file cha tài nguyên ca ng dng  
·
Các file *.ico là các biu tượng (icon) được dùng trong chương trình. Thông  
thường các công clp trình trên Windows đều có các tool để to các nh này.  
Con trchut ca ng dng có thể được vli dưới dng các biu tượng và lưu  
trên đĩa vi dng file *.cur.  
·
·
·
Các file dng nh bitmap dùng để minh ha được lưu dng file *.bmp.  
Tp tin tài nguyên *.rc là phn khai báo các tài nguyên như thc đơn, hp thoi,  
và các định danh chỉ đến các tp tin dng *.ico, *.cur, *.bmp,...  
1.4.1.5. Các kiu dliu mi  
Các kiu dliu trên Windows thường được định nghĩa nhtoán ttypedef trong tp tin  
windows.h hay các tp tin khác. Thông thường các tp tin định nghĩa này do Microsoft viết ra  
hoc các công ty viết trình biên dch C to ra, nht thiết nó phi tương thích vi hệ điu hành  
Windows 98, hay NT da trên kiến trúc 32-bit.  
Mt vài kiu dliu mi có tên viết tt rt dhiu như UINT là mt dliu thường được  
dùng mà đơn gin là kiu unsigned int, trong Windows 9x kiu này có kích thước là 32-bit. Đối  
vi kiu chui thì có kiu PSTR kiu này là mt con trỏ đến mt chui tương tnhư char*.  
Trang 9  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Tuy nhiên, cũng có mt skiu được khái báo tên thiếu rõ ràng như WPARAM và  
LPARAM. Tên này được đặt vì có ngun ngc lch ssâu xa. Khi còn hệ điu hành Windows  
16-bit thì tham sth3 ca hàm WndProc được khai báo là kiu WORD, vi kích thước 16-bit  
, còn tham sth4 có kiu LONG là 32-bit. Đây là lý do người ta thêm tiến t"W", "L" vào từ  
"PARAM". Tuy nhiên, trong phiên bn Windows 32-bit, thì WPARAM được định nghĩa như là  
UINT LPARAM thì được định nghĩa như mt kiu LONG, do đó chai tham snày đều có  
giá trlà 32-bit. Điu này là mt snhm ln vì WORD vn là giá tr16-bit trong Window 98.  
Trong thtc xlý ca sWndProc giá trtrvlà kiu LRESULT. Kiu này đơn gin  
được định nghĩa như là kiu LONG.  
Ngoài ra, có mt kiu thường xuyên dùng là kiu HANDLE là mt snguyên 32-bit  
được sdng như mt kiu định danh. Có nhiu kiu định danh nhưng nht thiết tt cphi có  
cùng kích thước vi HANDLE.  
Bng sau mô tmt skiu dliu mi:  
Kiu  
Ý nghĩa  
HANDLE  
HWND  
BYTE  
Snguyên 32-bit, định danh.  
Snguyên 32-bit, định danh.  
Giá tr8-bit không du.  
Snguyên 16-bit không du.  
Snguyên 32-bit không du.  
Snguyên không du 32-bit.  
long 32-bit.  
WORD  
DWORD  
UINT  
LONG  
BOOL  
Bool.  
LPSTR  
LPCSTR  
WPARAM  
LPARAM  
BSTR  
Con trchui.  
Hng con trchui.  
32-bit.  
32-bit.  
Giá tr32-bit trỏ đến kí t.  
Con tr32-bit đến mt kiu không xác định.  
Ging như LPSTR nhưng có thchuyn sang dng Unicode  
LPVOID  
LPTSTR  
và DBCS.  
Trang 10  
NGÔN NGLP TRÌNH  
LPCTSTR  
LP TRÌNH C TRÊN WINDOWS  
Ging như LPCTSTR nhưng có thchuyn sang dng  
Unicode và DBCS.  
Bng 1.1 Mô tcác kiu dliu mi  
1.4.2. Khuôn mu chung to mt ng dng  
Mt ng dng đơn gin nht ca Windows bao gm có hai hàm là WinMain và xlý  
ca sWinProc. Do đó hai hàm này là quan trng và không ththiếu trong các ng dng  
Windows.  
Hàm WinMain thc hin các chc năng sau :  
·
·
·
·
·
Đnh nghĩa lp ca sổ ứng dng.  
Đăng ký lp ca sva định nghĩa.  
To ra thhin ca sca lp đã cho.  
Hin thca s.  
Khi động chu trình xlý thông đip.  
Hàm xWinProc có chc năng xlý tt ccác thông đip có liên quan đến ca s.  
1.4.3. Hàm WinMain  
Hàm chính ca mt ng dng chy trên Windows là hàm WinMain, được khai báo như  
sau:  
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR  
szCmdLine, int iCmdShow);  
Chúng ta stìm hiu mt hàm WinMain mu sau đây.  
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR  
szCmdLine, int iCmdShow)  
{
static TCHAR szAppName[] = TEXT("HelloWin"); // tên ng dng  
HWND hwnd;  
MSG msg;  
WNDCLASS wndclass; // biến để định nghĩa mt ca sổ  
Trang 11  
NGÔN NGLP TRÌNH  
/* Đnh nghĩa kiu ca s*/  
wndclass.style = SC_HREDRAW | CS_VREDRAW;  
LP TRÌNH C TRÊN WINDOWS  
wndclass.lpfnWndProc = WndProc; // Hàm thtc 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; // Không có menu  
wndclass.lpszClassName = szAppName; // tên ng dng  
/* Đăng ký lp ca s*/  
if (!RegisterClass(&wndclass)) return 0;  
/* To lp ca s*/  
hwnd = CreateWindow (szAppName, // Tên ca sổ  
"Hello Program", // Tiêu đề  
WS_OVERLAPPEDWINDOW, // Kiu ca sổ  
CW_USEDEFAULT, // Ta độ x  
CW_USEDEFAULT, // Ta độ y  
CW_USEDEFAULT, // Chiu rng  
CW_USEDEFAULT, // Chiu dài  
NULL, // Ca scha  
NULL, // Không có menu  
hInstacne, // Đnh danh ng dng  
Trang 12  
NGÔN NGLP TRÌNH  
NULL); // Tham sbsung  
LP TRÌNH C TRÊN WINDOWS  
/* Hin thca s*/  
ShowWindow (hwnd, iCmdShow);  
UpdateWindow (hwnd);  
/* Chu trình xlý các thông đip*/  
while (GetMessage (&msg, NULL, 0, 0))  
{
TranslateMessage (&msg);  
DispatchMessage (&msg);  
}
return msg.wParam;  
}
Đnh nghĩa mt lp ca s:  
Đầu tiên ca viêc xây dng mt ng dng Windows là phi định nghĩa mt lp ca sổ  
cho ng dng. Windows cung cp mt cu trúc WNDCLASS gi là lp ca s, lp này cha  
nhng thuc tính to thành mt ca s.  
typedef struct _WNDCLASS  
{
UINT style;  
WNDPROC lpfnWndProc;  
int cbClsExtra;  
HINSTANCE hInstance;  
HICON hIcon;  
HCURSOR hCursor;  
HBRUSH hbrBackground;  
Trang 13  
NGÔN NGLP TRÌNH  
LPCSTR lpszMenuName;  
LP TRÌNH C TRÊN WINDOWS  
LPCSTR lpszClassName;  
} WNDCLASS, *PWNDCLASS;  
Ý nghĩa thuc tính ca cu trúc WNDCLASS được mô ttrong bng sau :  
Thuc tính  
Ý nghĩa  
Kiu lp  
ghi chú  
style  
Kết hp nhiu kiu giá trkhác nhau  
bng toán tOR.  
lpfnWndProc  
cbClsExtra  
Con trỏ đến thtc window  
Sbyte được cp phát thêm sau Mc định  
cu trúc window-class  
cbWndExtra  
hInstance  
Sbyte được cp phát thêm sau Mc định  
mt instance ca window  
Đnh danh cha thtc ca sổ  
ca lp window  
hIcon  
Đnh danh ca biu tượng  
Đnh danh ca con trchut  
Đnh danh ca chi tô nn  
Tên thc đơn  
Dùng hàm LoadIcon  
hCursor  
Dùng hàm LoadCursor  
hbrBackground  
lpszMenuName  
Dùng hàm GetStockObject  
Tên thc đơn gn vi ca s, thc dơn  
này được khai báo trong tp tin tài  
nguyên.  
lpszClassName  
Tên lp  
Bng 1.2 Mô tthuc tính ca lp ca sổ  
Đăng ký lp ca s:  
Sau khi định nghĩa mt lp ca s, phi đăng ký lp ca sổ đó bng hàm RegisterClass :  
ATOM RegisterClass( CONST WNDCLASS * lpWndClass );  
To ca s:  
Trang 14  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
Lp ca sổ định nghĩa nhng đặc tính chung ca ca s, cho phép to ra nhiu ca sổ  
da trên mt lp. Khi to ra mt ca sca hàm CreateWindow, ta chỉ định các đặc tính riêng  
ca ca snày, và phân bit nó vi các ca skhác to ra cùng mt lp.  
Khai báo hàm to ca s:  
HWND CreateWindow(  
LPCSTR lpClassName, // Tên lp ca sổ đã đăng ký  
LPCSTR lpwindowName, // Tên ca ca sổ  
DWORD dwStyle, // Kiu ca ca sổ  
int x, // Vtrí ngang ban đu  
int y, // Vtrí dc ban đu  
int nWidth, // Độ rng ban đu  
int nHeight, // Độ cao ban đu  
HWND hWndParent, // Đnh danh ca ca scha  
MENU hMenu, // Đnh dang ca thc đơn  
INSTANCE hInstance, // Đnh danh thhin ng dng  
PVOID lpParam // Các tham sban đu  
);  
Hin thca s:  
Sau khi gi hàm CreateWindow, mt ca sổ được to ra bên trong Windows, điu này  
có ý nghĩa là Windows đã cáp phát mt vùng nhớ để lưu gitt ccác thông tin vca sổ đã  
được chỉ định trong hàm CreateWindow. Nhng thông snày sẽ được Windows tìm li khi cn  
thiết da vào định danh mà hàm to ca strv. Tuy nhiên, lúc này ca schưa xut hin trên  
màn hình Windows, để xut hin cn phi gi hàm ShowWindow.  
Hàm ShowWindow có khai báo như sau:  
BOOL ShowWindow(  
HWND hWnd, // Đnh danh ca ca scn thhin  
int nCmdShow // Trng thái hin thị  
Trang 15  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
);  
Mt strng thái ca tham snCmdShow:  
·
·
·
·
SW_HIDE : n ca s.  
SW_MAXIMIZE : Phóng ca sra toàn bmàn hình.  
SW_MINIMIZE : thu nhthành biu tượng trên màn hình.  
SW_RESTORE : Hin thdưới dng chun.  
1.4.4. Hàm xca sWndProc  
Mt chương trình Windows có thcha nhiu hơn mt hàm xlý ca s. Mt hàm xlý  
ca sluôn kết hp vi mt lp ca sổ đặc thù. Hàm xlý ca sthường được đặt tên  
WndProc.  
Hàm WndProc có chc năng giao tiếp vi bên ngoài, tc là vi Windows, toàn bcác  
thông đip gi đến ca sổ điu được xlý qua hàm này.  
Hàm này thường được khai báo như sau :  
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM );  
Trong đó tham số đầu tiên là định danh ca ca s, tham sth2 là định danh thông  
đip, và cui cùng là 2 tham sWPARAM LPARAM bsung thông tin kèm theo thông  
đip.  
Chúng ta stìm hiu mt hàm xlý ca sWndProc sau:  
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam,  
LPARAM lParam)  
{
HDC hdc;  
PAINTSTRUCT ps;  
RECT rect;  
/*Xlý các thông đip cn thiết vi ng dng*/  
switch (msg)  
{
case WM_CREATE:  
Trang 16  
NGÔN NGLP TRÌNH  
/*Viết đon mã khi to ca s*/  
LP TRÌNH C TRÊN WINDOWS  
return 0;  
case WM_PAINT:  
/*Viết đon mã khi tô vli 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:  
/*Viết đon mã khi kích thước ca sthay đổi*/  
return 0;  
case WM_DESTROY:  
/*Ca sbị đóng*/  
PostQuitMessage (0);  
return 0;  
}
return DefWindowProc ( hwnd, msg, wParam, lParam);  
}
Thông thường chúng ta chchn để xlý các thông đip cn thiết có liên quan đến chc  
năng ca ng dng. Các thông đip khác thì giao cho hàm xlý mc định làm vic (hàm  
DefWindowProc).  
1.4.5. Xlý thông đip  
Sau khi ca sổ được hin thtrên màn hình, thì chương trình phi đọc các thông tin nhp  
ca người dùng tbàn phím hay thiết bchut. Windows sduy trì mt hàng đợi thông đip cho  
Trang 17  
NGÔN NGLP TRÌNH  
LP TRÌNH C TRÊN WINDOWS  
mi chương trình chy trên nó. Khi mt skin nhp thông tin xut hin, Windows sdch sự  
kin này thành dng thông đip và đưa nó vào hàng đợi thông đip ca ng dng tương ng.  
Mt ng dng nhn các thông đip thàng đợi thông đip bng cách thc thi mt đon  
mã sau:  
while ( GetMessage(&msg, NULL, 0 ,0) )  
{
TranslateMessage (&msg);  
DispatchMessage (&msg);  
}
Trong đó msg là mt biến cu trúc kiu MSG được định nghĩa trong tp tin tiêu đề  
WINUSER.H.  
typedef struct tagMSG  
{
HWND hwnd;  
UINT message;  
WPARAM wParam;  
LPARAM lParam;  
DWORD time;  
POINT pt;  
} MSG, *PMSG;  
Kiu dliu POINT là mt kiu cu trúc khác, được định nghĩa trong tp tin tiêu đề  
WINDEF.H, và có mô t:  
typedef struct tagPOINT  
{
LONG x;  
LONG y;  
Trang 18  
NGÔN NGLP TRÌNH  
} POINT, *PPOINT;  
Ý nghĩa ca các trường trong cu trúc MSG  
LP TRÌNH C TRÊN WINDOWS  
ü hwnd : Đnh danh ca ca smà thông đip phát sinh.  
ü message : Đnh danh ca thông đip, ví dnhư thông đip phát sinh khi bm nút  
chut trái là WM_LBUTTONDOWN có giá tr0x0201.  
ü wParam : Tham s32-bit cha các thông tin phthuc vào tng thông đip cụ  
th.  
ü lParam : Tham s32-bit phthuc vào thông đip.  
ü time : Thi gian đặt thông đip trong hàng đợi.  
ü pt : Ta độ ca chut khi đặt thông đip vào hàng đợi  
Hàm GetMessage strv0 nếu msg cha thông đip có định danh WM_QUIT  
(0x0012), khi đó vòng lp thông đip ngưng và ng dng kết thúc. Ngược li thì hàm strvề  
mt giá trkhác 0 vi các thông đip khác.  
1.4.6. Xây dng mt ng dng đầu tiên  
Mt ng dng thường có giao din nn tng là mt khung ca s, để to được ca snày  
chúng ta thc hin bng cách khai báo mt lp ca sđăng ký lp ca sổ đó. Để ca stương  
tác được thì chúng ta phi viết hàm xlý ca sWndProc khi đó tt ccác thông đip liên quan  
đến ca ssẽ được truyn vào cho hàm này. Đon chương trình sau là khung sườn cho các  
chương trình viết trên Windows, bao gm 2 hàm chính là :  
WinMain : hàm chính ca chương trình thc hin các chc năng :  
·
·
·
·
Khai báo lp ca s.  
Đăng ký lp ca sva khai báo.  
To và hin thlp ca strên.  
Vòng lp nhn thông đip.  
WndProc : Hàm xlý thông đip gi đến ca s.  
/* HELLOWORLD.C */  
#include <windows.h>  
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;  
Trang 19  
NGÔN NGLP TRÌNH  
MSG msg;  
LP TRÌNH C TRÊN WINDOWS  
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, // Tên lp ca sổ  
TEXT (" The Hello World Program"), // Tiêu đề ca sổ  
WS_OVERLAPPEDWINDOW, // Kiu ca sổ  
CW_USEDEFAULT, // Ta độ x  
CW_USEDEFAULT, // Ta độ y  
CW_USEDEFAULT, // Chiu ngang  
CW_USEDEFAULT, // Chiu dc  
Trang 20  
Tải về để xem bản đầy đủ
pdf 202 trang baolam 09/05/2022 6000
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình C trên Windows", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_lap_trinh_c_tren_windows.pdf