ĐẠI HỌC BÁCH KHOA HÀ NỘI Khoa Công Nghệ Thông Tin BÁO CÁO BÀI TẬP LỚN MÔN HỆ ĐIỀU HÀNH Đề tài Tìm hiểu lập trình API trong windows Giáo viên hướng dẫn Nhóm sinh viên thực hiện Nguyễn Tuấn Anh Trần Quốc Huy 20080075 20081166 Chu Gia Khôi 20081409 Vũ Hồng Quân 20082128 Hoàng Thanh Tùng 20082997 1 Mục lục Mục lục 2 MỞ ĐẦU 2 II, SƠ BỘ WINDOW API, CÁCH THỨC LÀM VIỆC 4 Các thư viện lập trình của Windows SDK – Software Development Kit 4 Các khái niệm cơ bản 4 Các thành phần giao diện đồ họa (GUI – Grap.
Trang 1KhoaCôngNghệThôngTin
BÁOCÁOBÀITẬPLỚNMÔNHỆĐ
IỀUHÀNH
Giáoviênhướngdẫn:
Nhómsinhviênthựchiện:
NguyễnTuấnAnh
TrầnQuốcHuy 20080075 20081166
ChuGiaKhôi 20081409
VũHồngQuân 20082128
HoàngThanh Tùng 20082997
1
Trang 2Mụclục
Mục lục .2
I.
MỞ ĐẦU 2 II,
SƠ BỘ WINDOW API, CÁCHTHỨC LÀM VIỆC 4
1.
Các thưviện lập trình củaWindows SDK – Software Development Kit 4 2.
Các khái niệm cơ bản .4 3.
Các thànhphầngiao diệnđồ họa (GUI – Graphics UserInterface) .5 4.
Qui trình hoạtđộngcủachương trình ứng dụng .6 5.
Ví dụ 6
III,
MỘTSỐTHÀNH PHẦN CƠBẢN 12
1.
Tài nguyêncủaứng dụng (Resources) 12
2.
Một số kiểu dữ liệumới .13
3.
Một số hàmđồhọa cơ sở: 15
4.
HỘP THOẠI VÀ ĐIỀU KHIỂN .17
IV.Kết luận 21
I.MỞĐẦU:
Trang 3Cácứng dụng của Windows rất dễsửdụng, nhưng rất khó đối vớingườiđãtạo lập ra chúng.Đểđạtđược tính dễdùngđòi hỏi người lập trìnhphảibỏrarấtnhiềucôngsứcđểcàiđặt
Lập trình trên Windows khóvàphức tạp hơn nhiều so với lập trìnhtrênDOS.TuynhiênlậptrìnhtrênWindowssẽgiảiquyếtđượcmộtsốvấn đềkhók h ănt r o n g m ôit r ườngD O S n h ưxâyd ựngg i a o d i ệnn g ườid ùng, quảnlýbộnhớảo,độclậpthiếtbịvàora,thâmnhậpInternet,khảnăngchiasẻtàin guyên,
Windowsc u n g c ấpc ách àmđ ểngườil ậpt r ìnht h âmn h ậpc ácđ ặc trưngc ủah ệ điềuhànhgọilàgiaodiệnlậptrình ứngdụng(Application Programming Interface – API) Những hàm nàyđượcđặt trong các thưviệnliên kếtđộng (Dynamic Link Library – DLL) Các chương trìnhứng dụng sửdụng chúng thông qua các lời gọi hàm vàchỉchia sẻđược khi trong máy cócàiđặtWindows
Trang 41 CácthưviệnlậptrìnhcủaWindowsSDK–SoftwareDevelopmentKit:
- LàbộthưviệnlậptrìnhnềntảngcủaHĐHWindows
- Cung cấp tất cảcác công cụcần thiếtđểxây dựng 1ứng dụng trênWindows
- Được sửdụng nhưlàthưviện cơsởđểtạo ra những thưviện caocấp hơn trong những ngôn ngữlập trình VD: OWL của BorlandC, MFC củaVisualC++,…
- MộtsốthànhphầncơbảncủaSDK:
• Win32API
• GDI/GDI+
• WindowsMultimedia
• OpenGL
• DirectX
• COM/COM+
• ADO(ActiveXDataObject)
• OLEDB
• …
2 Các khái ni ệ m c ơ b ả n:
Message:Traođổithôngtingiữachươngtrìnhứngdụngvàhệđiềuhành ThủtụcWindow:ĐượcgọibởihệthốngđểxửlýcácMessagenhậnđược.
HàngđợiMessage:Mỗichươngtrìnhcó1hàngđợiMessageđểchứacácMe
ssage.MỗichươngtrìnhcóvònglặpMessage
Handle:Mộtgiátrị32bitskhôngdấu(unsigned)doHĐHtạorađểlàm
địnhdanhchomộtđốitượng(cửasổ,file,vùngnhớ,menu,…)
ID( I d e n t i f i e r ) :M ộtg i át
danhcho1đốitượng(menuitem,control)
Trang 5ựcthicủaứngdụng
Callback:Thuộctínhcủa1hàm/
thủtụcsẽđượcgọibởiHĐH,khôngphảibởiứngdụng
3 Các thành ph ầ n giaodi ệ n đ ồ h ọ a (GUI– Graphics User Interface)
CácdạngGUIcơbản:
- SDI–SingleDocumentInterface:
+Mộtcửasổlàmviệc
+Chophépthayđổikíchthướccửasổ(Resizeable)
+Khôngcócáccửasổcon
+Vídụ:NotePad,Paint,…
- MDI–MultiDocumentInterface:
+Mộtcửasổlàmviệc chính(Frame
window)vànhiềucửasổcon(Childwindow)
+Chophépthayđổikíchthướccửasổ(Resizeable)
+ChophépMaximize/Minimize/Closecáccửasổcon
+Vídụ:Word,Excel,VC++,…
-Dialog:
+Mộtcửasổlàmviệc
+Thườngcókíchthướccốđịnh
+Thườngkhôngcómenubar
+Thườngcócácbutton,edit box,listbox,…
+Vídụ:Calculator,CDPlayer,…
-Cửasổ:
-Địnhnghĩa:
+Là1vùngchữnhậttrênmànhình
+Dùngđểhiểnthịkếtquảoutput
+Vànhậncácinput từngười dùng
- Côngv i ệcđ ầut i ênc ủa1 vi
ệc ứngd ụngG U I l àt ạo1 c ửas ổ làm
Trang 6- Nguyêntắcquảnlý:
+Môhìnhphâncấp:mỗicửasổđềucó1cửasổcha(parentwindow),ngo ạitrừcửasổnềnDesktop
+Tạimỗithờiđiểm,chỉcó1cửasổnhậninputtừuser(Active/
Focusedwindow)
- Phânloại:
+CửasổDesktop
+Cửasổtiêuchuẩn
+Cửasổhộpthoại(Dialogbox)
+Các control
4 Qui trình ho ạ t đ ộ ng c ủ a ch ươ ng trình ứ ng d ụ ng :
- Cửasổđượchiểnthịlênmànhình
- Chờcửasổgửithôngđiệp
- CácthôngđiệpđượcWindowsgửitrảlạichươngtrìnhứngdụngthôngqualời gọihàmcủachúngtrongchươngtrìnhứngdụng
- Khinhậnđượcthôngđiệp,chươngtrìnhứngdụnggọicáchàmAPIvàhàmc ủariêngchúngđểthựchiệncôngviệcmongmuốn
- Lập trình trên Windows làlập trình trên cơsởthôngđiệp, quátrình traođổi thông tin và điều khiển dựa trên thôngđiệp Córất nhiều thôngđiệpđượcphátsinhngẩunhiênnhưnhấnphímhaychuột,chọnmenu,
- Tương tác củaứng dụng với người sửdụng thông qua một hay nhiềucửasổ,tạolậpcáccửa sổkhi cần thiếtvàquảnlýthôngtintrongđó
5 Ví d ụ
#include<windows.h>
LRESULTCALLBACKXulyMessage(HWND,UNIT,WPARAM,LPARAM);
charszAppName[]=“Vidu”;
intWINAPIWinMain(HANDLEhInst,HANDLEhPrevInst,
LPSTRlpszCmdLine,intnCmdShow) {
HWNDhwnd;MSGmsg;WNDCLAS
SEXwndclass;wndclass.cbSize=siz
eof(wndclass);
wndclass.style=CS_HREDRAW|CS_VREDRAW;
Trang 7wndclass.cbClsExtra= 0;
wndclass.cbWndExtra =
0;wndclass.hInstance=hInst
;
wndclass.hIcon = LoadIcon (NULL,
IDI_APPLICATION);wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);wndclass.hbrBackground=GetStockObject(WH ITE_BRUSH);wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
wndclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);R
egisterClassEx(&wndclass);
hwnd= C r e a t e W i n d o w ( s z A p p
N a m e , “Vidumodau”,
WS_OVERLAPPEDWINDOW,CW_USE
DEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,HWND_DESKTOP,
NULL,
hInst,N
ULL);
ShowWindow(hwnd, n CmdS how )
;UpdateWindow (hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);DispatchMes
sage(&msg);
}
returnmsg.wParam;
}
LRESULTC A L L B A C K X u l y M e s s a g e ( H W N D hwn d, UI NTi Ms g,
WPARAMwParam,LPARAMlParam) {
HDChdc;PAINTS
TRUCTps;
RECTrect;switc
h(iMsg)
{
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);Ge
tClientRect(hwnd,&rect);
DrawText(hdc,“LaptrinhCforWin”,1,&rect,
DT_SINGLELINE| D T _ C E N T E R |
D T _ V C E N T E R ) ;
Trang 8EndPaint(hwnd,&ps);b reak;
Trang 9PostQuitMessage(0);break;
default:
returnDefWindowProc(hwnd,iMsg,wParam,lParam);
}
return0;
}
Tasẽkhảosátvídụtrênđểnắmđượcnguyênlýhoạtđộngcủachúng.Trênđâylàđoạ nchươngtrìnhđơngiảntrênWindows,chươngtrìnhchỉhiểnthị1khung cửa sổvà1 dòng chữnhưng córất nhiều lệnh màcúpháp rất
khónhớ.Dovậy,nguyêntắclậptrìnhtrênWindowschủyếulàsaochépvàchỉnhsử anhữngnơicầnthiếtdựavàomộtchươngtrìnhmẫucósẵn
a Hàm WinMain()được thực hiệnđầu tiên hay còn gọi là điểm vào củachươngtrình
Tathấyhàmnàycó4thamsố:
+hInst, hPrevinst: Chỉsốchương trình khi chúngđang chạy VìWindows làhệđiều hànhđa nhiệm, cóthểcónhiều bản củacùng một chương trình cùng chạy vào cùng một thờiđiểm nênphải quản lýchặt chẽchúng hInst làchỉsốbản chương trìnhvừa khởiđộng, hPrevinst làchỉsốcủa bảnđã được khởiđộngtrướcđóvàchúngluôncógiátrịNULL
+lpszCmdLine: chứađịa chỉđầu của xâu kýtựcácđối sốdònglệnh +n C m d S h o w : Chobiếtcáchthứchiểnthịcửasổkhichươngtrình khởiđộng.Windowscóthể gángiátrị SW_SHOWNORMAL hayS W _ S H O W M I N N O A C T I V E
Cácthamsốtrêndohệđiềuhànhtruyềnvào
ĐịnhnghĩalớpcửasổvàđăngkývớiWindows
+L ớpc ửas ổ(window c l a s s ) : L àm ộtt ậpc áct h u ộct ínhm àH ĐH Windowssửdụnglàmkhuônmẫu(template)khitạolậpcửasổ.Mỗilớpcửas ổđượcđặctrưngbằng1tên(classname)dạngchuỗi
Phânloạiclass:
- Lớpcửasổcủahệthống(Systemclass):Đượcđịnhnghĩ atrướcbởiHĐHWindows.Cácứngdụngkhôngthểhủybỏ
Trang 10- Lớpcửasổdoứngdụngđịnhnghĩa:Đượcđăngkýbởi ứngdụng.Cóthểhủybỏkhikhôngcònsửdụngnữa
- Lớptoàncụccủaứngdụng(Applicationglobalclass)
- Lớpcụcbộcủaứng dụng(Applicationlocalclass)
Mỗicửasổđềuthuộcmộtlớpxácđịnh
Khilầnđầuchạy,ứngdụngphảiđịnhnghĩavàđăngkýlớpvớicửasổ(Wi ndow Class).Đây làcấu trúc dữliệu môtảtính chất của cửa sổ, lầnlượt ta gán các giátrịbanđầu cho các thành phần của cấu trúc lớp cửa sổ,bao gồm: Kích thước, kiểu,địa chỉhàm xửlýthôngđiệp cửa sổ,định nghĩahìnhdạngchocontrỏchuột(cursor)vàbiểutượng(Icon),màunền,tênlớpc ửasổ
struct
WNDCLASSEX{UINT cbSize;
UINTstyle;
WNDPROClpfnWndProc;i
nt cbClsExtra;
int
cbWndExtra;HINSTANC
E
hInstance;HICONhIcon;
HCURSORhCursor;HBR
USHhbrBackground;
LPCTSTRlpszMenuName;
LPCTSTRl p s z C l a s s N a
m e ;
};
+Saukhiđãđịnhnghĩacácthànhphầnlớpcửasổtaphảiđăngkýlớpcửa sổvớihệđiềuhành(RegisterClassEX)
ATOMR e g i s t e r C l a s s E x ( C O N S T W N D C L A S S E X * l
p W C l a s s ) ; với:KiểugiátrịcủaATOMđượcđịnhnghĩatrongwi
ndow.hlàWORD;lpWClasslàcontrỏđếncấutrúclớpcửasổ;hàm nàytrảvềchỉsốcủalớpcửasổ
+Cóhainguyênnhândẫnđếnviệcđăngkýcửasổthấtbại:
- Trùngtêngiữacácứngdụngtronghệđiềuhành
- Khôngđủbộnhớ
+Tạolậpc ửasổlàmviệc(FrameWindow)
- SaukhiđăngkýthànhcôngtacóthểtạolậpcửasổthôngquahàmCre
ateWindow().HWNDCreateWindow(
LPCSTR lpClassName,LPCST
Trang 11RlpWinName,DWOR DdwStyle,
intX,intY,
Trang 12intWidth,intHeight, HWNDhParent,HME NUhMenu,HINSTAN CEhInst,
LPVOIDlpszAdditional);
- Gọi hàm
ShowWindow()đểShowWindow(HWNDhw
nd,intnShow);
hiển thị cửa sổ BOOL
với:hwndchỉsốcửasổcầnhiểnthị
nShow cách thức hiển thịcủa cửa sổ, tham sốnàyđược nhậngiátrịlầnđầutiêncủahàmWinMain()
- Đểthông báo choứng dụng biết làphải vẽlại vùng làm việccủacửasổ,taphảigọihàmUpdateWindow()yêucầuWindowsg ửithôngđiệpđếnhàmxửlýthôngđiệpcửasổ
+Vònglặpthôngđiệp
-K h i n h ấnp h ímh a y c h u ột,W i n d o w s c h u y ểnđ ổis ựki ệnn ày thànhcácthôngđiệpvàđặtvàohàngđợithôngđiệp.Vònglặp
thôngđ iệpc ónhiệmv ụh
àngđợi nhậnv àxử lýcácthôngđiệptrong
- TranslateMessage:Dịchthôngđiệpsangdạngtiêuchuẩn
- DispatchMessage:P h ânp h ốit h ôngđ iệpđ ếnh àmx ửđi
ệptươngứng
b Thủtụcxửlýthôngđiệp
+Nhậnvàxửlýthôngđiệpcủa chương trình
+Mộtchươngtrìnhcóthểcónhiềuthủtụcwindow
+Mộtlớp cửasổsẽkhaibáo1 thủtụcwindow
+Cácthôngđiệpsau khixửlýnêntrảvềgiátrị0
+Dạngtổngquát:
lýthông
LRESULTCALLBACKWndProc(
HWNDhWnd,//
handlecủawindownhậnmessageUINTmessage,//
IDcủathôngđiệp(tênthôngđiệp)
WPARAMwParam,//
thamsốthứnhấtcủamessage(WORD)LPARAMlParam)//
thamsốthứhaicủamessage(LONG)
{
switch(message)
{
Trang 13caseWM_COMMAND: return0;
caseWM_PAINT:re turn0;