Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 23 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
23
Dung lượng
0,9 MB
Nội dung
NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Chương T NG QUAN L P TRÌNH C TRÊN WINDOWS 1.1 M ð U ð l p trình Microsoft Windows®, c n n m đư c ñ c ñi m b n nh t c a h ñi u hành Chương s gi i thi u khái quát ñ c ñi m h ñi u hành Microsoft Windows, v n đ liên quan đ n l p trình b ng ngơn ng C, đ ng th i đưa m t chương trình m u làm sư n cho chương trình đư c vi t sau Trong ph n đ u, tìm hi u sơ lư c l ch s phát tri n c a h u hành Microsoft Windows® nh ng đ c ñi m n n t ng c a Windows Ph n ti p theo s trình bày nh ng khái ni m yêu c u b n c a vi c l p trình C Windows Ngoài ra, ph n gi i thi u ch cơng c mà h u hành cung c p cho ngư i l p trình hay ngư i phát tri n ng d ng Windows ch Cu i chương ph n xây d ng m t chương trình ñơn gi n nh t Windows Chương trình ñư c xem khuôn m u c a m t chương trình ng d ng n hình, h u h t đo n chương trình ñư c vi t minh h a sách ñ u l y chương trình làm khung sư n ñ phát tri n cho phù h p v i t ng u c u Thêm vào đó, m t s ki u d li u m i ñư c ñ nh nghĩa Windows nh ng qui c v cách ñ t tên bi n ñư c gi i thi u ph n Te Ph n chi ti t chuyên sâu c a vi c l p trình b ng ngơn ng C mơi trư ng Windows s đư c trình bày chương ti p theo 1.2 H ðI U HÀNH MICROSOFT WINDOWS 1.2.1 Gi i thi u Gi a th p niên 80, công ty ph n m m máy tính Microsoft cơng b phiên b n đ u tiên c a dịng h u hành Windows Microsoft Windows® 1.0 ðây h u hành dùng giao di n ñ h a khác v i giao di n ký t (text hay console) c a MS-DOS Tuy nhiên ph i ñ n phiên b n th hai (Windows 2.0 - tháng 11 năm 1987) m i có bư c c i ti n đáng k , s m r ng giao ti p gi a bàn phím thi t b chu t giao di n ñ h a (GUI-Graphic User Interface) trình đơn (menu) h p tho i (dialog) Trong phiên b n Windows ch yêu c u b vi x lý Intel 8086 hay 8088 ch y real-mode ñ truy xu t megabyte b nh Tháng năm 1990, Microsoft công b phiên b n ti p theo Windows 3.0 S thay ñ i l n phiên b n Windows 3.0 h tr protected-mode 16 bit c a b vi x lý 286, 386, 486 c a Intel S thay ñ i cho phép ng d ng Windows truy xu t 16 megabyte b nh Ti p bư c v i s phát tri n phiên b n Windows 3.1 ñ i năm 1992, Microsoft đưa cơng ngh Font TrueType, âm nh c (multimedia), liên k t nhúng ñ i tư ng (OLE- Object Linking and Embedding), ñưa h p tho i chung ñã ñư c chu n hóa Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Trong s phát tri n m nh m c a nh ng th p niên 90, Microsoft cơng b ti p dịng h u hành Windows v i ng d ng công ngh m i (1993) H ñi u hành l y tên Windows® NT® (Windows New Technology), phiên b n h ñi u hành ñ u tiên c a Windows h tr 32 bit cho b x lý 386, 486 Pentium Trong h u hành ng d ng ph i truy xu t b nh v i ñ a ch 32-bit t p l nh hay ch th 32-bit Ngoài Windows NT ñư c thi t k ñ ch y b vi x lý (CPU) khác Intel có th ch y máy tr m (workstation) H u hành Windows 95 đư c cơng b năm 1995 m t h ñi u hành 32-bit cho Intel 386 tr v sau Tuy thi u tính b o m t Windows NT vi c thích nghi v i máy tr m cơng ngh RISC, bù l i h ñi u hành yêu c u ph n c ng không cao Song song v i s phát tri n ph n m m cơng ngh ph n c ng phát tri n không ð t n d ng s c m nh c a ph n c ng th h Windows ti p theo ngày hoàn thi n Như Windows 98 phát tri n t Window 95 có nhi u c i thi n hi u làm vi c, h tr thi t b ph n c ng t t hơn, cu i vi c tích h p ch t ch v i Internet Word Wide Web Windows 2000 h ñi u hành ñư c xem n ñ nh t t c a dòng Windows, phiên b n tăng cư ng tính b o m t thích h p m i trư ng m ng giao di n ñ p 1.2.2 ð c ñi m chung c a h ñi u hành Microsoft Windows Te ch Windows m t h ñi u hành s d ng giao ti p ngư i dùng ñ h a (GUI), hay cịn g i h u hành tr c quan (Visual interface) GUI s d ng ñ h a d a hình nh nh phân (Bitmapped video display) Do t n d ng đư c tài nguyên th c c a hình, cung c p m t mơi trư ng giàu tính tr c quan sinh đ ng Windows khơng đơn ñi u MS-DOS (hay m t s h ñi u hành giao di n console) mà hình đư c s d ng ch ñ th hi n chu i ký t , ngư i dùng gõ t bàn phím (keyboard) hay đ xu t thơng tin d ng văn b n Trong giao di n ngư i dùng đ h a, hình giao ti p v i ngư i s d ng ña d ng hơn, ngư i dùng có th nh p d li u thông qua chu t b ng cách nh n vào nút nh n (button) hôp ch n (combo box)…thi t b bây gi đư c nh p, có th bàn phím thi t b chu t (mouse device) Thi t b chu t m t thi t b đ nh v hình, s d ng thi t b chu t ngư i dùng có th nh p d li u m t cách tr c quan b ng cách kích ho t m t nút l nh, hay làm vi c v i ñ i tư ng ñ h a liên quan ñ n t a ñ hình ð giao ti p mơi trư ng đ h a, Windows ñưa m t s thành ph n g i ñi u n chung (common control), ñi u n chung ñ i tư ng ñư c ñưa vào h p tho i ñ giao ti p v i ngư i dùng Bao g m : h p văn b n (text box), nút nh n (button), nút ch n (check box), h p danh sách (list box), h p ch n (combo box)… Th t m t ng d ng Windows không ph i ph c t p chúng có hình th c chung Chương trình ng d ng thu ng chi m m t ph m vi hình ch nh t hình g i m t c a s Trên c a m i c a s tiêu ñ (title bar) Các ch c c a chương trình đư c li t kê th c ñơn l a ch n c a chương trình (menu) , hay xu t hi n dư i d ng tr c quan công c (toolbar) Các công c ch a ch c ñư c s d ng thư ng xuyên th c ñơn ñ gi m th i gian cho ngư i dùng ph i m th c ñơn Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS ch n Thông thư ng c n l y thông tin hay cung c p thông tin cho ngư i dùng m t ng d ng s ñưa m t h p tho i, h p tho i s ch a ñi u n chung ñ giao ti p v i ngư i dùng Windows t o m t s h p tho i chu n Open Files, m t s h p tho i tương t Windows m t h ñi u hành ña nhi m, tùy thu c vào b nh mà ta có th ch y nhi u ng d ng m t lúc, có th ñ ng th i chuy n qua l i gi a ng d ng th c thi chúng Trong phiên b n c a Windows® 98 NT® tr v sau, chương trình ng d ng t b n thân chúng chia thành nhi u ti u trình (thread) đ x lý v i t c ñ x lý nhanh t o c m giác nh ng chương trình ng d ng ch y ñ ng th i v i Trong Windows, chương trình ng d ng th c thi đư c chia s nh ng th t c mà Windows cung c p s n, t p tin cung c p nh ng th t c ñư c g i thư vi n liên k t ñ ng (Dynamic Link Libraries - DLL) Windows có ch liên k t nh ng chương trình ng d ng v i th t c ñư c cung c p thư vi n liên k t ñ ng ch Kh tương thích c a Windows r t cao Các chương trình ng d ng ñư c vi t cho Windows không truy xu t tr c ti p ph n c ng c a nh ng thi t b đ ho hình máy in Mà thay vào đó, h u hành cung c p m t ngôn ng l p trình đ h a (g i Giao ti p thi t b ñ ho - Graphic Device Interface - GDI) cho phép hi n th nh ng ñ i tư ng ñ h a m t cách d dàng Nh v y m t ng d ng vi t cho Windows s ch y v i b t c thi t b hình hay b t kì máy in, mi n cài đ t trình ñi u n thi t b h tr cho Windows Chương trình ng d ng khơng quan tâm đ n ki u thi t b k t n i v i h th ng Te Như gi i thi u ph n khái ni m liên k t ñ ng thành ph n quan tr ng c a Windows, đư c xem h t nhân c a h u hành, b n thân c a Windows t p thư vi n liên k t ñ ng Windows cung c p r t nhi u hàm cho nh ng chương trình ng d ng ñ cài ñ t giao di n ngư i dùng hi n th văn b n hay đ h a hình Nh ng hàm ñư c cài ñ t thư vi n liên k t đ ng hay cịn g i DLL ðó t p tin có d ng ph n m r ng *.DLL hay *.EXE, h u h t ñư c ch a thư m c \Windows\System, \Windows\system32 c a Windows® 98 thư m c \WinNT\System, \WinNT\System32 c a Windows® NT® Trong phiên b n sau này, h th ng liên k t ñ ng ñư c t o r t nhi u, nhiên, h u h t hàm ñư c g i thư vi n phân thành ñơn v sau: Kernel, User, GDI Kernel cung c p hàm th t c mà m t h t nhân h ñi u hành truy n th ng qu n lý, qu n lý b nh , xu t nh p t p tin tác v Thư vi n ñư c cài ñ t t p tin KRNL386.EXE 16 bit KERNEL32.DLL 32 bit User qu n lý giao di n ngư i dùng, cài ñ t t t c khung c a s m c lu n lý Thư vi n User ñư c cài ñ t t p tin USER.EXE 16 bit USER32.DLL 32 bit GDI cung c p toàn b giao di n thi t b đ ho (Graphics Device Interface), cho phép chương trình ng d ng hi n th văn b n ñ ho thi t b xu t ph n c ng hình máy in Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Trong Windows 98, thư vi n liên k t ñ ng ch a kho ng vài ngàn hàm, m i hàm có tên đ c t , ví d CreateWindow, hàm dùng ñ t o m t c a s cho ng d ng Khi s d ng hàm mà Windows cung c p cho ng d ng ph i khai báo t p tin tiêu ñ h hay hpp (header file) Trong m t chương trình Windows, có s khác bi t ta g i m t hàm c a thư vi n C m t hàm c a Windows hay thư vi n liên k t ñ ng cung c p ðó biên d ch mã máy, hàm thư vi n C s ñư c liên k t thành mã chương trình Trong hàm Windows s đư c g i chương trình c n dùng đ n ch khơng liên k t vào chương trình ð th c hi n đư c l i g i m t chương trình Windows *.EXE ln ch a m t tham chi u ñ n thư vi n liên k t ñ ng khác mà c n dùng Khi đó, m t chương trình Windows đư c n p vào b nh s t o tr tham chi u ñ n nh ng hàm thư vi n DLL mà chương trình dùng, n u thư vi n chưa đư c n p vào b nh trư c bây gi s ñư c n p 1.3 L P TRÌNH TRÊN MICROSOFT WINDOWS 1.3.1 ð c m chung Windows h ñi u hành ñ h a tr c quan, dó tài nguyên c a h th ng cung c p r t ña d ng địi h i ngư i l p trình ph i nghiên c u r t nhi u ñ phát hay h t s c m nh c a h ñi u hành Te ch Theo nh ng m c đích ti p c n c a nhà l p trình ng d ng Windows ph i h t s c thân thi n v i ngư i dùng thông qua giao di n đ h a s n có c a Windows V lý thuy t m t ngư i dùng làm vi c ñư c v i m t ng d ng c a Windows có th làm vi c ñư c v i nh ng ng d ng khác Nhưng th c t ñ s d ng m t ng d ng cho ñ t hi u qu cao Windows c n ph i có m t s hu n luy n tr giúp hay t i thi u ph i cho bi t chương trình ng d ng làm vi c th ða s ng d ng Windows ñ u có chung m t giao di n tương tác v i ngư i dùng gi ng Ví d ng d ng Windows ña s ñ u có th c đơn ch a m c : File, Edit, Tool, Help… Và h p tho i thư ng ch a ph n t ñi u n chung : Edit Control, Button Control, Checkbox… 1.3.2 S khác bi t v i l p trình MS-DOS Khi m i bư c vào l p trình Windows đa s ngư i h c r t l l m, nh t nh ng ngư i ñã t ng làm vi c v i MS-DOS Do MS-DOS h ñi u hành ñơn nhi m giao ti p qua giao di n console Nên vi t chương trình khơng ph c t p Cịn đ i v i Windows ngư i l p trình s làm vi c v i b cơng c l p trình đ h a ña d ng v i cách x lý ña nhi m, đa lu ng c a Windows Vì v y vi c l p trình Windows s giúp cho ngư i l p trình đ nhàm chán v i giao di n console c a MS-DOS Vi c c g ng phát huy s c m nh tài nguyên c a Windows s làm cho nh ng ng d ng m nh m , ña d ng, thân thi n, d s d ng 1.3.3 M t s yêu c u ñ i v i ngư i l p trình Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS ði u trư c tiên c a ngư i h c l p trình C Windows ph i bi t l p trình C, sách khơng có tham v ng hư ng d n ngư i h c có th thơng th o l p trình C Windows mà chưa qua m t l p hu n luy n C Tuy nhiên, không nh t thi t ph i hồn tồn thơng th o C m i h c đư c l p trình Windows ð có th l p trình n n Windows ngồi u c u v vi c s d ng công c l p trình, ngư i h c cịn c n ph i có b n v Windows, t i thi u dùng qua m t s ng d ng Windows Th t s yêu c u khơng q khó khăn đ i v i ngư i h c hi n t i h u Windows quen thu c v i m i ngư i, nh ng ngư i mà ñã s d ng máy tính Ngồi nh ng u c u trên, đơi ngư i l p trình Windows c n có u th m m , cách trình bày hình nh, u n h p tho i t t s làm cho ng d ng ti n l i, rõ ràng, thân thi n v i ngư i dùng 1.3.4 B công c giao di n l p trình ng d ng API ch H ñi u hành Windows cung c p hàng trăm hàm đ cho nh ng ng d ng có th s d ng truy c p tài nguyên h th ng Nh ng hàm ñư c g i giao di n l p trình ng d ng API (Application Programming Interface) Nh ng hàm ñư c ch a thư vi n liên k t ñ ng DLL c a h th ng Nh có c u trúc đ ng m i ng d ng đ u có th truy c p ñ n hàm ñó Khi biên d ch chương trình, đ n đo n mã g i hàm API chương trình d ch khơng thêm mã hàm vào mã th c thi mà ch thêm tên DLL ch a hàm tên c a hàm Do mã hàm API th c t khơng ñư c s d ng xây d ng chương trình, ch đư c thêm vào chương trình đư c n p vào b nh đ th c thi Te Trong API có m t s hàm có ch c trì s đ c l p thi t b ñ h a, hàm g i giao di n thi t b ñ h a GDI (Graphics Device Interface) Do s ñ c l p thi t b nên hàm GDI cho phép ng d ng có th làm vi c t t v i nhi u ki u thi t b ñ h a khác 1.3.5 Cơ ch thơng p Khơng gi ng ng d ng ch y MS-DOS, ng d ng Win32® x lý theo s ki n (event - driven), theo ch ng d ng ñư c vi t s liên t c ch cho h ñi u hành truy n d li u nh p vào H th ng s ñ m nhi m vi c truy n t t c d li u nh p c a ng d ng vào c a s khác c a ng d ng M i m t c a s s có riêng m t hàm g i hàm x lý c a s thư ng ñư c ñ t tên WndProc, h th ng s g i hàm có b t c d li u nh p ñư c truy n ñ n c a s , hàm s x lý d li u nh p tr quy n u n v cho h th ng H th ng truy n d li u nh p vào th t c x lý c a c a s thông qua m t hình th c g i thơng ñi p (message) Thông ñi p ñư c phát sinh t ng d ng h th ng H th ng s phát sinh m t thơng p có m t s ki n nh p vào (input even), ví d ngư i dùng nh n m t phím, di chuy n thi t b chu t, hay kích vào u n (control) cu n,… Ngoài h th ng phát sinh thơng p đ ph n ng l i m t s thay ñ i c a h th ng m t ng d ng mang ñ n, ñi u x y ng d ng làm c n ki t tài nguyên hay ng d ng t thay đ i kích thư c c a c a s Trang NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS M t ng d ng có th phát sinh thơng p c n u c u c a s c a th c hi n m t nhi m v hay dùng đ thông tin gi a c a s H th ng g i thơng p vào th t c x lý c a s v i b n tham s : ñ nh danh c a c a s , đ nh danh c a thơng p, hai tham s cịn l i đư c g i tham s c a thơng p (message parameters) ð nh danh c a c a s xác ñ nh c a s mà thông ñi p ñư c ch ñ nh H th ng s dùng ñ nh danh ñ xác ñ nh c n ph i g i thơng p đ n th t c x lý c a c a s ð nh danh thơng p m t h ng s th hi n m c đích c a thơng ñi p Khi th t c x lý c a s nh n thơng p s dùng ñ nh danh ñ bi t hình th c c n th c hi n Ví d , m t thơng p đư c truy n đ n th t c c a s có đ nh danh WM_PAINT có ý nghĩa r ng c a s vùng làm vi c thay ñ i c n ph i v l i vùng Tham s thơng p lưu giá tr hay v trí c a d li u, ñư c dùng b i th t c c a s x lý thông ñi p Tham s ph thu c vào lo i thơng p đư c truy n đ n, có th s nguyên, m t t p bit dùng làm c hi u, hay m t tr ñ n m t c u trúc d li u đó,… Khi m t thơng p khơng c n dùng đ n tham s h th ng s thi t l p tham s có giá tr NULL M t th t c c a s ph i ki m tra xem v i lo i thơng p c n dùng tham s ñ quy t ñ nh cách s d ng tham s Có hai lo i thơng p : ch Thơng p ñư c ñ nh nghĩa b i h th ng (system-defined messages) : Te D ng thơng p ñư c h th ng ñ nh nghĩa cho c a s , ñi u n, tài nguyên khác h th ng Thư ng ñư c b t ñ u v i ti n t sau : WM_xxx, LB_xxx, CB_xxx,… Thơng p ñư c ñ nh nghĩa b i ng d ng (application-defined message) : M t ng d ng có th t o riêng thơng p đ s d ng b i nh ng c a s c a hay truy n thơng tin gi a c a s ng d ng N u m t ng d ng đ nh nghĩa thơng p riêng th t c c a s nh n ñư c thông ñi p ph i cung c p hàm x lý tương ng ð i v i thơng p h th ng, đư c cung c p giá tr ñ nh danh t 0x0000 ñ n 0x03FF, nh ng ng d ng không ñư c đ nh nghĩa thơng p có giá tr kho ng Thơng p đư c ng d ng đ nh nghĩa có giá tr đ nh danh t 0x0400 đ n 0x7FFF L trình c a thơng p t lúc g i đ n lúc x lý có hai d ng sau: Thơng p đư c g i vào hàng đ i thơng ñi p ñ ch x lý (queue message): bao g m ki u thơng p đư c phát sinh t bàn phím, chu t thơng p : WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, WM_CHAR Trang NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Thơng ñi p ñư c g i tr c ti p ñ n th t c x lý không qua hàng ñ i (nonqueue message), bao g m thông ñi p th i gian, thơng p v , thơng p WM_TIMER, WM_PAINT, WM_QUIT X lý thơng p : M t ng d ng ph i xóa x lý nh ng thơng p ñư c g i t i hàng ñ i c a ng d ng ð i v i m t ng d ng đơn ti u trình s d ng m t vịng l p thơng p (message loop) hàm WinMain đ nh n thơng ñi p t hàng ñ i g i t i th t c x lý c a s tương ng V i nh ng ng d ng nhi u ti u trình m i m t ti u trình có t o c a s s có m t vịng l p thơng p đ x lý thơng p c a nh ng c a s ti u trình 1.4 CÁCH VI T M T NG D NG TRÊN MICROSOFT WINDOWS 1.4.1 Các thành ph n b n t o nên m t ng d ng 1.4.1.1 C a s Trong m t ng d ng ñ h a 32-bit, c a s (window) m t vùng hình ch nh t hình, nơi mà ng d ng có th hi n th thông tin nh n thông tin vào t ngư i s d ng Do v y, nhi m v ñ u tiên c a m t ng d ng ñ h a 32-bit t o m t c a s ch M t c a s s chia s hình v i c a s khác m t ng d ng hay ng d ng khác Ch m t c a s m t th i m nh n đư c thơng tin nh p t ngư i dùng Ngư i s d ng có th dùng bàn phím, thi t b chu t hay thi t b nh p li u khác ñ tương tác v i c a s ng d ng Te T t c c a s ñ u ñư c t o t m t c u trúc ñư c cung c p s n g i l p c a s (window class) C u trúc m t t p mô t thu c tính mà h th ng dùng khn m u đ t o nên c a s M i m t c a s ph i thành viên c a m t l p c a s T t c l p c a s ñ u ñư c x lý riêng bi t 1.4.1.2 H p tho i ñi u n H p tho i (Dialog) dùng ñ tương tác v i ngư i dùng m t chương trình ng d ng M t h p tho i thư ng ch a nhi u ñ u n ô nh p văn b n (edit text), nút b m (button), ghi (static control), h p danh sách (list box)… Nút b m (button): g m có Push Button dùng kích ho t m t thao tác, Check Box dùng ñ ch n m t hai tr ng thái (TRUE hay FALSE), Radio Button gi ng Check Box m t nhóm Radio Button ph i đư c ch n lo i tr Chú thích (static): dùng đ ch a ghi h p tho i, ngồi n i dung có th thay đ i trình s d ng h p tho i H p li t kê (list box): Ch n m t hay nhi u d li u ñư c li t kê danh sách, n u h p ch a nhi u dịng h p khơng hi n th h t m u thơng tin ph i kèm theo m t cu n (scroll bar) Ô nh p văn b n (edit text): Dùng nh p văn b n, n u có nhi u dịng thư ng kèm theo cu n Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Thanh cu n (scroll bar): vi c dùng kèm v i list box hay edit box cu n cịn có th s d ng đ c l p nh m t o thư c ño… Th c ñơn (menu): m t danh sách ch a thao tác v i m t ñ nh danh mà ngư i dùng có th ch n H u h t ng d ng có c a s khơng th thi u th c đơn Thanh cơng c (toolbar): m t d ng menu ch ch a thao tác c n thi t dư i d ng bi u tư ng đ c trưng Ngồi cịn r t nhi u u n mà cơng c l p trình cung c p cho ngư i l p trình hay t h t o d a nh ng thành ph n ñư c cung c p s n 1.4.1.3 ng d ng n hình Windows 1.4.1.4 Các ki u t p tin ñ xây d ng m t ng d ng Windows Chương trình ngu n Tương t chương trình C chu n, bao g m t p tin tiêu ñ (header) ch a t p tin *.h, *.hpp Còn mã ngu n (source code) ch a t p tin *.c hay *.cpp T p tin ñ nh nghĩa ch T p tin có ph n m r ng *.def, dùng đ nh nghĩa u n chương trình t o vi t ng d ng t o DLL, ngồi cịn dùng đ khai báo vùng nh heap ch y chương trình Lúc trư c v n đ tương thích v i Windows 3.1 nên t p tin thư ng ñư c dùng, cịn ngày chúng đư c dùng đ n Te Các file ch a tài nguyên c a ng d ng • Các file *.ico bi u tư ng (icon) đư c dùng chương trình Thơng thư ng cơng c l p trình Windows ñ u có tool ñ t o nh • Con tr chu t c a ng d ng có th đư c v l i dư i d ng bi u tư ng lưu ñĩa v i d ng file *.cur • Các file d ng nh bitmap dùng ñ minh h a ñư c lưu d ng file *.bmp • T p tin tài nguyên *.rc ph n khai báo tài nguyên th c ñơn, h p tho i, ñ nh danh ch ñ n t p tin d ng *.ico, *.cur, *.bmp, 1.4.1.5 Các ki u d li u m i Các ki u d li u Windows thư ng ñư c ñ nh nghĩa nh toán t typedef t p tin windows.h hay t p tin khác Thông thư ng t p tin ñ nh nghĩa Microsoft vi t ho c cơng ty vi t trình biên d ch C t o ra, nh t thi t ph i tương thích v i h u hành Windows 98, hay NT d a ki n trúc 32-bit M t vài ki u d li u m i có tên vi t t t r t d hi u UINT m t d li u thư ng ñư c dùng mà ñơn gi n ki u unsigned int, Windows 9x ki u có kích thư c 32-bit ð i v i ki u chu i có ki u PSTR ki u m t tr ñ n m t chu i tương t char* Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Tuy nhiên, có m t s ki u ñư c khái báo tên thi u rõ ràng WPARAM LPARAM Tên ñư c ñ t có ngu n ng c l ch s sâu xa Khi cịn h u hành Windows 16-bit tham s th c a hàm WndProc ñư c khai báo ki u WORD, v i kích thư c 16-bit , cịn tham s th có ki u LONG 32-bit ðây lý ngư i ta thêm ti n t "W", "L" vào t "PARAM" Tuy nhiên, phiên b n Windows 32-bit, WPARAM ñư c ñ nh nghĩa UINT LPARAM đư c đ nh nghĩa m t ki u LONG, c hai tham s đ u có giá tr 32-bit ði u m t s nh m l n WORD v n giá tr 16-bit Window 98 Trong th t c x lý c a s WndProc giá tr tr v ki u LRESULT Ki u ñơn gi n ñư c ñ nh nghĩa ki u LONG Ngồi ra, có m t ki u thư ng xuyên dùng ki u HANDLE m t s nguyên 32-bit ñư c s d ng m t ki u đ nh danh Có nhi u ki u ñ nh danh nh t thi t t t c ph i có kích thư c v i HANDLE B ng sau mô t m t s ki u d li u m i: Ý nghĩa HANDLE S nguyên 32-bit, ñ nh danh HWND S nguyên 32-bit, ñ nh danh BYTE Giá tr 8-bit không d u WORD S nguyên 16-bit không d u ch Te DWORD Ki u S nguyên 32-bit không d u UINT S nguyên không d u 32-bit LONG long 32-bit BOOL Bool LPSTR Con tr chu i LPCSTR H ng tr chu i WPARAM 32-bit LPARAM 32-bit BSTR Giá tr 32-bit tr đ n kí t LPVOID Con tr 32-bit đ n m t ki u khơng xác đ nh LPTSTR Gi ng LPSTR có th chuy n sang d ng Unicode DBCS Trang 10 NGƠN NG L P TRÌNH LPCTSTR L P TRÌNH C TRÊN WINDOWS Gi ng LPCTSTR có th chuy n sang d ng Unicode DBCS B ng 1.1 Mô t ki u d li u m i 1.4.2 Khuôn m u chung t o m t ng d ng M t ng d ng ñơn gi n nh t c a Windows bao g m có hai hàm WinMain x lý c a s WinProc Do hai hàm quan tr ng không th thi u ng d ng Windows Hàm WinMain th c hi n ch c sau : ð nh nghĩa l p c a s ng d ng ðăng ký l p c a s v a ñ nh nghĩa T o th hi n c a s c a l p ñã cho Hi n th c a s Kh i đ ng chu trình x lý thơng p • • • • • Te 1.4.3 Hàm WinMain ch Hàm x lý WinProc có ch c x lý t t c thơng p có liên quan đ n c a s Hàm c a m t ng d ng ch y Windows hàm WinMain, ñư c khai báo sau: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow); Chúng ta s tìm hi u m t hàm WinMain m u sau ñây int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); // tên ng d ng HWND hwnd; MSG msg; WNDCLASS wndclass; // bi n ñ ñ nh nghĩa m t c a s Trang 11 L P TRÌNH L P TRÌNH C TRÊN WINDOWS /* ð nh nghĩa ki u c a s */ wndclass.style = SC_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; // Hàm th t c c a s wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; // ð nh danh ng d ng wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCusor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; // Khơng có menu wndclass.lpszClassName = szAppName; // tên ng d ng ch /* ðăng ký l p c a s */ if (!RegisterClass(&wndclass)) return 0; /* T o l p c a s */ Te NGÔN NG hwnd = CreateWindow (szAppName, // Tên c a s "Hello Program", // Tiêu ñ WS_OVERLAPPEDWINDOW, // Ki u c a s CW_USEDEFAULT, // T a ñ x CW_USEDEFAULT, // T a ñ y CW_USEDEFAULT, // Chi u r ng CW_USEDEFAULT, // Chi u dài NULL, // C a s cha NULL, // Khơng có menu hInstacne, // ð nh danh ng d ng Trang 12 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS NULL); // Tham s b sung /* Hi n th c a s */ ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); /* Chu trình x lý thơng p*/ while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; ch } ð nh nghĩa m t l p c a s : Te ð u tiên c a viêc xây d ng m t ng d ng Windows ph i ñ nh nghĩa m t l p c a s cho ng d ng Windows cung c p m t c u trúc WNDCLASS g i l p c a s , l p ch a nh ng thu c tính t o thành m t c a s typedef struct _WNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; Trang 13 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASS, *PWNDCLASS; Ý nghĩa thu c tính c a c u trúc WNDCLASS đư c mơ t b ng sau : Ý nghĩa ghi style Ki u l p K t h p nhi u ki u giá tr khác b ng toán t OR lpfnWndProc Con tr ñ n th t c window cbClsExtra S byte ñư c c p phát thêm sau c u trúc window-class M c ñ nh cbWndExtra S byte ñư c c p phát thêm sau m t instance c a window M c ñ nh hInstance ð nh danh ch a th t c c a s c a l p window hIcon ð nh danh c a bi u tư ng Dùng hàm LoadIcon hCursor ð nh danh c a tr chu t Dùng hàm LoadCursor hbrBackground ð nh danh c a ch i tô n n Dùng hàm GetStockObject lpszMenuName Tên th c ñơn Tên th c ñơn g n v i c a s , th c dơn ñư c khai báo t p tin tài nguyên lpszClassName Tên l p Te ch Thu c tính B ng 1.2 Mơ t thu c tính c a l p c a s ðăng ký l p c a s : Sau ñ nh nghĩa m t l p c a s , ph i ñăng ký l p c a s b ng hàm RegisterClass : ATOM RegisterClass( CONST WNDCLASS * lpWndClass ); T oc as : Trang 14 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS L p c a s đ nh nghĩa nh ng đ c tính chung c a c a s , cho phép t o nhi u c a s d a m t l p Khi t o m t c a s c a hàm CreateWindow, ta ch ñ nh ñ c tính riêng c a c a s này, phân bi t v i c a s khác t o m t l p Khai báo hàm t o c a s : HWND CreateWindow( LPCSTR lpClassName, // Tên l p c a s ñã ñăng ký LPCSTR lpwindowName, // Tên c a c a s DWORD dwStyle, // Ki u c a c a s int x, // V trí ngang ban đ u int y, // V trí d c ban đ u int nWidth, // ð r ng ban ñ u int nHeight, // ð cao ban ñ u ch HWND hWndParent, // ð nh danh c a c a s cha MENU hMenu, // ð nh dang c a th c ñơn Te INSTANCE hInstance, // ð nh danh th hi n ng d ng PVOID lpParam // Các tham s ban ñ u ); Hi n th c a s : Sau g i hàm CreateWindow, m t c a s ñư c t o bên Windows, u có ý nghĩa Windows ñã cáp phát m t vùng nh ñ lưu gi t t c thông tin v c a s ñã ñư c ch ñ nh hàm CreateWindow Nh ng thơng s s đư c Windows tìm l i c n thi t d a vào ñ nh danh mà hàm t o c a s tr v Tuy nhiên, lúc c a s chưa xu t hi n hình Windows, đ xu t hi n c n ph i g i hàm ShowWindow Hàm ShowWindow có khai báo sau: BOOL ShowWindow( HWND hWnd, // ð nh danh c a c a s c n th hi n int nCmdShow // Tr ng thái hi n th Trang 15 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS ); M t s tr ng thái c a tham s nCmdShow: • • • • SW_HIDE : n c a s SW_MAXIMIZE : Phóng c a s tồn b hình SW_MINIMIZE : thu nh thành bi u tư ng hình SW_RESTORE : Hi n th dư i d ng chu n 1.4.4 Hàm x lý c a s WndProc M t chương trình Windows có th ch a nhi u m t hàm x lý c a s M t hàm x lý c a s k t h p v i m t l p c a s ñ c thù Hàm x lý c a s thư ng ñư c ñ t tên WndProc Hàm WndProc có ch c giao ti p v i bên ngoài, t c v i Windows, tồn b thơng p g i ñ n c a s ñi u ñư c x lý qua hàm Hàm thư ng ñư c khai báo sau : LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); Te ch Trong tham s đ u tiên đ nh danh c a c a s , tham s th đ nh danh thơng p, cu i tham s WPARAM LPARAM b sung thơng tin kèm theo thơng p Chúng ta s tìm hi u m t hàm x lý c a s WndProc sau: LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; /*X lý thơng p c n thi t v i ng d ng*/ switch (msg) { case WM_CREATE: Trang 16 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS /*Vi t đo n mã t o c a s */ return 0; case WM_PAINT: /*Vi t đo n mã tơ v l i c a s */ hdc = BeginPaint ( hwnd, &ps); GetClientRect (hwnd, &rect); DrawText(hdc, "Hello", -1, &rect, DT_SINGLELINE| DT_CENTER| DT_VCENTER); EndPaint ( hwnd, &ps); return 0; case WM_SIZE: /*Vi t đo n mã kích thư c c a s thay ñ i*/ ch return 0; /*C a s b đóng*/ Te case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc ( hwnd, msg, wParam, lParam); } Thơng thư ng ch ch n đ x lý thơng p c n thi t có liên quan đ n ch c c a ng d ng Các thơng p khác giao cho hàm x lý m c ñ nh làm vi c (hàm DefWindowProc) 1.4.5 X lý thơng p Sau c a s ñư c hi n th hình, chương trình ph i đ c thông tin nh p c a ngư i dùng t bàn phím hay thi t b chu t Windows s trì m t hàng đ i thơng p cho Trang 17 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS m i chương trình ch y Khi m t s ki n nh p thông tin xu t hi n, Windows s d ch s ki n thành d ng thơng p đưa vào hàng đ i thơng p c a ng d ng tương ng M t ng d ng nh n thơng p t hàng ñ i thông ñi p b ng cách th c thi m t ño n mã sau: while ( GetMessage(&msg, NULL, ,0) ) { TranslateMessage (&msg); DispatchMessage (&msg); } Trong msg m t bi n c u trúc ki u MSG ñư c ñ nh nghĩa t p tin tiêu ñ WINUSER.H typedef struct tagMSG { ch HWND hwnd; WPARAM wParam; Te UINT message; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG; Ki u d li u POINT m t ki u c u trúc khác, ñư c ñ nh nghĩa t p tin tiêu đ WINDEF.H, có mơ t : typedef struct tagPOINT { LONG x; LONG y; Trang 18 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS } POINT, *PPOINT; Ý nghĩa c a trư ng c u trúc MSG hwnd : ð nh danh c a c a s mà thông ñi p phát sinh message : ð nh danh c a thơng p, ví d thơng p phát sinh b m nút chu t trái WM_LBUTTONDOWN có giá tr 0x0201 wParam : Tham s 32-bit ch a thông tin ph thu c vào t ng thơng p c th lParam : Tham s 32-bit ph thu c vào thơng p time : Th i gian đ t thơng p hàng ñ i pt : T a ñ c a chu t đ t thơng p vào hàng ñ i Hàm GetMessage s tr v n u msg ch a thơng p có đ nh danh WM_QUIT (0x0012), vịng l p thơng p ngưng ng d ng k t thúc Ngư c l i hàm s tr v m t giá tr khác v i thơng p khác 1.4.6 Xây d ng m t ng d ng ñ u tiên ch M t ng d ng thư ng có giao di n n n t ng m t khung c a s , ñ t o ñư c c a s th c hi n b ng cách khai báo m t l p c a s ñăng ký l p c a s ð c a s tương tác đư c ph i vi t hàm x lý c a s WndProc t t c thơng p liên quan đ n c a s s ñư c truy n vào cho hàm ðo n chương trình sau khung sư n cho chương trình vi t Windows, bao g m hàm : • • • • Te WinMain : hàm c a chương trình th c hi n ch c : Khai báo l p c a s ðăng ký l p c a s v a khai báo T o hi n th l p c a s Vịng l p nh n thơng p WndProc : Hàm x lý thơng p g i đ n c a s /* HELLOWORLD.C */ #include 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 NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS 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 = wndclass.lpszMenuName = NULL; ( HBRUSH ) GetStockObject ( WHITE_BRUSH ); ch wndclass.lpszClassName = szAppName; { Te if ( !RegisterClass ( &wndclass ) ) MessageBox(NULL, TEXT (" The program requires Windows"), szAppName, MB_ICONERROR ); return 0; } hwnd = CreateWindow ( szAppName, // Tên l p c a s TEXT (" The Hello World Program"), // Tiêu ñ c a s WS_OVERLAPPEDWINDOW, // Ki u c a s CW_USEDEFAULT, // T a ñ x CW_USEDEFAULT, // T a ñ y CW_USEDEFAULT, // Chi u ngang CW_USEDEFAULT, // Chi u d c Trang 20 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS NULL, // C a s cha NULL, // Th c ñơn hInstance, // ð nh danh NULL ); // Tham s ShowWindow ( hwnd, iCmdShow ); UpdateWindow ( hwnd ); while ( GetMessage ( &msg, NULL, 0, 0) ) { TranslateMessage (&msg); DispatchMessage (&msg) ; } ch } // End WinMain return msg.wParam; { Te LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) HDC hdc; PAINTSTRUCT ps; RECT rect; switch ( msg ) { case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint ( hwnd, &ps); GetClientRect ( hwnd, &rect ); Trang 21 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS DrawText( hdc, TEXT("Hello World"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER ); EndPaint ( hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } // End switch return DefWindowProc ( hwnd, msg, wParam, lParam); } B ng dư i ñây li t kê ý nghĩa c a hàm ñư c s d ng hàm WinMain WndProc c a chương trình HELLOWORLD.C Ý nghĩa ch Tên hàm N p m t bi u tư ng ñ s d ng chương LoadIcon LoadCursor Te trình Nap m t tr chu t cho chương trình GetStockObject Nh n m t ñ i tư ng ñ h a, trư ng h p c a chương trình l y m t ch i tơ đ tơ l i n n c a c a s RegisterClass ðăng ký m t l p c a s cho c a s chương trình ng d ng MessageBox Hi n th m t thơng p CreateWindow T o m t c a s d a m t l p c a s ShowWindow Hi n th c a s lên hình UpdateWindow Yêu c u c a s v l i b n thân GetMesssage Nh n m t thơng p t hàng ñ i thông ñi p TranslateMessage D ch thông ñi p bàn phím DispatchMessage G i thơng p đ n hàm x lý c a s Trang 22 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS BeginPaint Kh i t o ch c v c a c a s GetClientRect L y hình ch nh t lưu vùng làm vi c DrawText Hi n th m t chu i văn b n EndPaint K t thúc vi c v c a s PostQuitMessage ðưa thơng p vào hàng đ i thơng p DefWindowProc Th c hi n vi c x lý m c đ nh thơng p B ng 1.3 Mơ t hàm đư c s d ng chương trình minh h a 1.4.7 M t s qui c ñ t tên bi n Te ch Khi vi t m t chương trình ng d ng l n v i nhi u ki u khai báo bi n khác nhau, n u vi c khai báo tên bi n không thích h p s làm cho chương trình ph c t p thêm, đơi làm khó c ngư i vi t mã ngu n Vì v y l p trình viên thư ng qui c cho m t tên bi n v a g i ñư c ch c c a v a xác đ nh đư c ki u lo i Có r t nhi u phong cách đ đ t tên, s có phong cách ñ t tên theo cú pháp Hungary (Hungarian Notation) ñư c dùng nhi u nh t Qui c r t ñơn gi n b t ñ u tên bi n vi t ch thư ng ch ñ u th hi n ki u d li u c a bi n, ñư c g i ti n t Ví d bi n szCmdLine m t bi n lưu chu i nh p t dòng l nh, sz th hi n cho bi n ki u chu i k t thúc ký t 0, ta hay th y hInstance hPrevInstance, h vi t t t cho ki u handle, ki u d li u nguyên thư ng ñư c khai báo d ng ti n t ch i Cú pháp Hungary giúp cho ngư i l p trình r t nhi u khâu ki m tra l i c a chương trình, nhìn vào hai bi n ta có th d dàng nh n bi t ñ ơc s khơng tương thích gi a hai ki u d li u th hi n tên c a hai bi n B ng mô t m t s ti n t ñ t tên bi n c a ki u d li u : Ti n t Ki u d li u c char, WCHAR, TCHAR by BYTE n short i int x,y bi n lưu t a ñ x, y b BOOL Trang 23 L P TRÌNH L P TRÌNH C TRÊN WINDOWS w WORD l long dw DWORD s string sz chu i k t thúc b i kí t h handle p pointer Lpsz tr dài chu i ký t k t thúc kí t ch B ng 1.4 Mơ t ki u đ t tên bi n Te NGÔN NG Trang 24 ... bar) C? ?c ch c c a chương trình đư c li t kê th c ñơn l a ch n c a chương trình (menu) , hay xu t hi n dư i d ng tr c quan c? ?ng c (toolbar) C? ?c công c ch a ch c ñư c s d ng thư ng xuyên th c ñơn... L P TRÌNH L P TRÌNH C TRÊN WINDOWS MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance... thích v i Windows 3.1 nên t p tin thư ng đư c dùng, c? ??n ngày chúng đư c dùng đ n Te C? ?c file ch a tài nguyên c a ng d ng • C? ?c file *.ico bi u tư ng (icon) đư c dùng chương trình Thơng thư ng c? ?ng