第1講Windows程序設(shè)計基礎(chǔ)_第1頁
第1講Windows程序設(shè)計基礎(chǔ)_第2頁
第1講Windows程序設(shè)計基礎(chǔ)_第3頁
第1講Windows程序設(shè)計基礎(chǔ)_第4頁
第1講Windows程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

計算機窗口技術(shù)基礎(chǔ)第一講Windows程序設(shè)計基礎(chǔ)12Windows程序設(shè)計基礎(chǔ)

Windows系統(tǒng)是一個基于視窗的消息驅(qū)動系統(tǒng),即使功能大異的Windows程序都有比較規(guī)范統(tǒng)一的程序界面,如窗口、菜單、工具條、對話框等。Windows程序的設(shè)計其實比較規(guī)范,但若不了解Windows程序的基本結(jié)構(gòu),程序調(diào)度的基本方法(即消息驅(qū)動的基本原理),以及每個程序都會用到的基本數(shù)據(jù)結(jié)構(gòu),也很難編寫出有用的Windows程序來。之所以在本章介紹API程序,就是基于上述考慮而設(shè)計的,盡管API程序設(shè)計在實際編程過程中已越來越少用了,但它卻是理解Windows程序設(shè)計基本原理的最佳捷徑,因為所有Windows程序的結(jié)構(gòu)和執(zhí)行過程最終大同于API程序。在此基礎(chǔ)上學(xué)習(xí)MFC及其它在Windows程序設(shè)計語言如JAVA,都是大有幫助的!31.Windows程序設(shè)計基礎(chǔ)Windows系統(tǒng)的特點標(biāo)準(zhǔn)的用戶界面多任務(wù)設(shè)備獨立性動態(tài)鏈接強大的內(nèi)存管理41Windows程序設(shè)計基礎(chǔ)2.基本術(shù)語窗口(Window)由句柄唯一標(biāo)識對話框(Dialog)人機交互圖標(biāo)(Icon)代表某一項操作或程序的圖符位圖(Bitmap)用位模式形成的圖像菜單(Menu)命令工具欄(ToolBar)常用的菜單項狀態(tài)欄(StateBar)操作狀態(tài)或操作提示51.1窗口窗口是Windows程序的基本單元,Windows程序的運行過程就是窗口內(nèi)部、窗口之間及窗口與用戶之間的信息交換過程。窗口通常包括菜單、工具條、滾動條、狀態(tài)欄、命令按鈕、對話框等元素。61.2事件驅(qū)動和消息響應(yīng)1.事件事件是指人們應(yīng)用計算機的過程中發(fā)生的操作,如按下鍵盤上的某個按鍵、移動鼠標(biāo)、單擊鼠標(biāo)左鍵、移動窗口及選擇程序菜單等操作都是事件。2、事件驅(qū)動每發(fā)生一個事件,就會產(chǎn)生一個與之對應(yīng)的特定消息,該消息會被Windows系統(tǒng)捕獲,然后將通過此消息調(diào)用執(zhí)行與之對應(yīng)的程序代碼,實現(xiàn)相應(yīng)的程序功能。因為從事件發(fā)生到相應(yīng)程序代碼被調(diào)用執(zhí)行都是通過消息來實現(xiàn)的,因此事件驅(qū)動也常被稱為消息驅(qū)動71.2事件驅(qū)動和消息響應(yīng)3、消息隊列用于存放消息的隊列,消息系統(tǒng)由Windows系統(tǒng)自動建立和維護。Windows消息隊列的類型系統(tǒng)消息隊列:由Windows系統(tǒng)維護管理的消息隊列,每當(dāng)有消息發(fā)生時,該消息將首先被存入系統(tǒng)消息隊列。應(yīng)用程序消息隊列:Windows系統(tǒng)會為每個應(yīng)用程序建立一個獨立的消息隊列,用于存放該應(yīng)用程序的消息。81.2事件驅(qū)動和消息響應(yīng)4、消息循環(huán)每個應(yīng)用程序都有一個循環(huán)機構(gòu),該循環(huán)機構(gòu)則不斷地重復(fù)查看程序自身的消息隊列,如果隊列中有消息,就將其取出并執(zhí)行相應(yīng)的消息處理代碼,這個處理消息的循環(huán)機構(gòu)稱為消息循環(huán)。

91.2事件驅(qū)動和消息響應(yīng)5、Windows程序調(diào)度的基本原理每個Windows程序啟動后,就等待用戶在其窗口中進行操作。每個操作會引發(fā)一個事件,就會產(chǎn)生一個與之對應(yīng)的特定消息。該消息會被Windows系統(tǒng)捕獲。Windows系統(tǒng)對捕獲的消息進行分析后,會將消息傳遞給產(chǎn)生它的應(yīng)用程序的消息隊列,每個應(yīng)用程序的消息循環(huán)機構(gòu)不斷地重復(fù)查看它自已的消息隊列,如果隊列中有消息,就將其取出并執(zhí)行相應(yīng)的消息處理代碼,如果隊列中沒有消息就等待,當(dāng)隊列中有消息時就又處理它,如此循環(huán)往復(fù),直至程序結(jié)束。101.2事件驅(qū)動和消息響應(yīng)6、事件驅(qū)動及消息循環(huán)的基本原理111.2事件驅(qū)動和消息響應(yīng)7、DOS和Windows程序執(zhí)行方式對比121.3Windows程序的構(gòu)成1、Windows程序的組成程序代碼程序代碼是程序的主體,用于實現(xiàn)程序的功能資源Windows程序具有標(biāo)準(zhǔn)規(guī)范的應(yīng)用程序界面,每個Windows程序常常包含了許多相同的組成元素,如菜單、對話框、工具欄、應(yīng)用程序圖標(biāo)、鼠標(biāo)光標(biāo)、程序版本信息等,這些組成元素被Windows從程序代碼中獨立出來,并以各種不同擴展名的文件形式存在,如.ico(圖標(biāo))、.bmp(位圖)、.cur(光標(biāo))等,Windows系統(tǒng)稱之為資源資源則可以在需要時才通過相關(guān)命令加載到程序中。13.libCruntimeDllimport.RC資源編譯器.DLGDialogEditor*.obj*.exe.res.DEF資源連接器ImageEditorFontEditor.BMP.ICO.CUR.FON.h.c/cppc編譯器2、Window程序的編譯鏈接過程141.4VC++的Windows程序設(shè)計方法1.API程序設(shè)計API即ApplicationProgrammingInterface(應(yīng)用程序編程接口),它是Windows操作系統(tǒng)和Windows應(yīng)用程序之間的標(biāo)準(zhǔn)接口,在應(yīng)用程序中可以通過API訪問Windows提供的各種函數(shù)、宏及數(shù)據(jù)結(jié)構(gòu)。API函數(shù)保存在一些動態(tài)鏈接庫中,每個Windows程序都要用到的動態(tài)鏈接庫有USER32.Dll、GDI32.Dll、KERNEL32.Dll。API程序設(shè)計就是直接利用Windows系統(tǒng)提供的API函數(shù),編寫能夠在Windows系統(tǒng)中運行的程序。151.4VC++的Windows程序設(shè)計方法2.MFC程序設(shè)計MFC是MicrosoftFoundationClasses的縮寫,即微軟基礎(chǔ)類庫。MFC是建立在API基礎(chǔ)上的C++類庫,它對Windows提供的API函數(shù)、數(shù)據(jù)結(jié)構(gòu)、各種控件按功能進行了分類,利用面向?qū)ο蠹夹g(shù)將它們封裝在不同的類中,并通過繼承將這些類組織在一起。MFC不僅把API函數(shù)封裝成了易于使用的類,而且還提供了建立Windows應(yīng)用程序的框架結(jié)構(gòu),以及建立應(yīng)用程序的各種組件,簡化了Windows程序設(shè)計的難度。

1.4VC++的Windows程序設(shè)計方法3.其他桌面編程方法及語言簡要介紹DELPHI:是Windows平臺下著名的快速應(yīng)用程序開發(fā)工具(RapidApplicationDevelopment,簡稱RAD)。它的前身,即是DOS時代盛行一時的“BorlandTurboPascal”,最早的版本由美國Borland(寶蘭)公司于1995年開發(fā)。主創(chuàng)者為AndersHejlsberg。經(jīng)過數(shù)年的發(fā)展,此產(chǎn)品也轉(zhuǎn)移至Embarcadero公司旗下。Delphi是一個集成開發(fā)環(huán)境(IDE),使用的核心是由傳統(tǒng)Pascal語言發(fā)展而來的ObjectPascal,以圖形用戶界面為開發(fā)環(huán)境,透過IDE、VCL工具與編譯器,配合連結(jié)數(shù)據(jù)庫的功能,構(gòu)成一個以面向?qū)ο蟪绦蛟O(shè)計為中心的應(yīng)用程序開發(fā)工具1.4VC++的Windows程序設(shè)計方法“真正的程序員用VC,聰明的程序員用Delphi”。和VC相比,Delphi更簡單、更易于掌握,而在功能上卻絲毫不遜色;和VB相比,Delphi則功能更強大、更實用??梢哉fDelphi同時兼?zhèn)淞薞C功能強大和VB簡單易學(xué)的特點。Delphi具有以下特性:基于窗體和面向?qū)ο蟮姆椒ǎ咚俚木幾g器,強大的數(shù)據(jù)庫支持,與Windows編程緊密結(jié)合,強大而成熟的組件技術(shù)。但最重要的還是ObjectPascal語言,它才是一切的根本。ObjectPascal語言是在Pascal語言的基礎(chǔ)上發(fā)展起來的,簡單易學(xué)。1.4VC++的Windows程序設(shè)計方法(1)直接編譯生成可執(zhí)行代碼,編譯速度快。由于Delphi編譯器采用了條件編譯和選擇鏈接技術(shù),使用它生成的可執(zhí)行程序更加精煉,運行速度更快。(2)提供了許多快速方便的開發(fā)方法,使開發(fā)人員能用盡可能少的重復(fù)性工作完成各種不同的應(yīng)用。利用項目模板和專家生成器可以很快建立項目的構(gòu)架,然后根據(jù)用戶的實際需要逐步完善。(3)具有可重用性和可擴展性。開發(fā)人員不必再對諸如標(biāo)簽、按鈕及對話框等Windows的常見部件進行編程。Delphi包含許多可以重復(fù)使用的部件,允許用戶控制Windows的開發(fā)效果。(4)具有強大的數(shù)據(jù)存取功能。(5)擁有強大的網(wǎng)絡(luò)開發(fā)能力,能夠快速的開發(fā)B/S應(yīng)用,它內(nèi)置的IntraWeb和ExpressWeb使得對于網(wǎng)絡(luò)的開發(fā)效率超過了其他任何的開發(fā)工具。1.4VC++的Windows程序設(shè)計方法(7)Delphi使用獨特的VCL類庫,使得編寫出的程序顯得條理清晰,VCL是現(xiàn)在最優(yōu)秀的類庫,它使得Delphi在軟件開發(fā)行業(yè)處于一個絕對領(lǐng)先的地位。(8)從Delphi8開始Delphi也支持.Net框架下程序開發(fā)1.4VC++的Windows程序設(shè)計方法3.其他桌面編程方法及語言簡要介紹C++Builder:C++Builder是由Borland公司推出的一款可視化集成開發(fā)工具。C++Builder具有快速的可視化開發(fā)環(huán)境:只要簡單地把控件(Component)拖到窗體(Form)上,定義一下它的屬性,設(shè)置一下它的外觀,就可以快速地建立應(yīng)用程序界面;C++Builder內(nèi)置了100多個完全封裝了Windows公用特性且具有完全可擴展性(包括全面支持ActiveX控件)的可重用控件;C++Builder具有一個專業(yè)C++開發(fā)環(huán)境所能提供的全部功能:快速、高效、靈活的編譯器優(yōu)化,逐步連接,CPU透視,命令行工具等。它實現(xiàn)了可視化的編程環(huán)境和功能強大的編程語言(C++)的完美結(jié)合。1.4VC++的Windows程序設(shè)計方法C++Builder優(yōu)化的32位原碼(NativeCode)編譯器建立在Borland公司久經(jīng)考驗的編譯技術(shù)基礎(chǔ)之上,提供了高度安全性、可靠性、快速性的編譯優(yōu)化方法,完全編譯出原始機器碼而非中間碼,軟件執(zhí)行速度大大提高。在編譯和連接過程中,C++Builder自動忽略未被修改的原代碼和沒有使用的函數(shù),從而大大提高了編譯和連接速度。C++Builder的CPU透視工具包括五個獨立的小面板,可以對正在運行程序從內(nèi)部進行深層次的了解。另外C++Builder還提供了一個專業(yè)開發(fā)環(huán)境所必需的命令行工具,以幫助建立C++程序或者準(zhǔn)備編譯和連接的程序進行更精細(xì)的控制。1.4VC++的Windows程序設(shè)計方法3.其他桌面編程方法及語言簡要介紹VisualBasic:VisualBasic是一種由微軟公司開發(fā)的包含協(xié)助開發(fā)環(huán)境的事件驅(qū)動編程語言。從任何標(biāo)準(zhǔn)來說,VB都是世界上使用人數(shù)最多的語言——不僅是盛贊VB的開發(fā)者還是抱怨VB的開發(fā)者的數(shù)量。它源自于BASIC編程語言。VB擁有圖形用戶界面(GUI)和快速應(yīng)用程序開發(fā)(RAD)系統(tǒng),可以輕易的使用DAO、RDO、ADO連接數(shù)據(jù)庫,或者輕松的創(chuàng)建ActiveX控件。程序員可以輕松的使用VB提供的組件快速建立一個應(yīng)用程序。

1.4VC++的Windows程序設(shè)計方法缺點:1.屬于解釋型語言,可執(zhí)行程序中包含的并非是機器碼,因此需要VB運行庫的解釋執(zhí)行,邊解釋邊執(zhí)行,因此執(zhí)行效率較慢,不適宜快速反應(yīng)的硬件底層控制軟件設(shè)計。2.

VisualBasic語言具有不支持繼承、無原生支持多線程、異常處理不完善等三項明顯缺點。3.無法學(xué)到良好的編程習(xí)慣,不利于培養(yǎng)良好的編程習(xí)慣,無視程序設(shè)計技術(shù)和結(jié)構(gòu)。優(yōu)點:1.開發(fā)快速簡便,上手快。2.界面編程極為迅速。1.4VC++的Windows程序設(shè)計方法3.其他桌面編程方法及語言簡要介紹QT:Qt是1991年奇趣科技開發(fā)的一個跨平臺的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所用功能。Qt很容易擴展,并且允許真正地組件編程。基本上,Qt同XWindow上的Motif,Openwin,GTK等圖形界面庫和Windows平臺上的MFC,OWL,VCL,ATL是同類型的東西。

1.4VC++的Windows程序設(shè)計方法Qt支持下述平臺:MS/Windows-95、98、NT

4.0、ME、2000、XP、Vista和Win7Unix/X11-Linux、Sun

Solaris、HP-UX、CompaqTru64UNIX、IBM

AIX、SGIIRIX、FreeBSD、BSD/OS和其它很多X11平臺Macintosh-

MacOSXEmbedded-有幀緩沖(framebuffer)支持的嵌入式Linux平臺,WindowsCEAndroid1.4VC++的Windows程序設(shè)計方法3.其他桌面編程方法及語言簡要介紹VisualC#:是微軟開發(fā)的一種面向?qū)ο蟮木幊陶Z言,是微軟.NET開發(fā)環(huán)境的重要組成部分。而MicrosoftVisualC#2005是微軟開發(fā)的C#編程集成開發(fā)環(huán)境(同種產(chǎn)品還有Borland公司的C#Builder),它是為生成在.NETFramework上運行的多種應(yīng)用程序而設(shè)計的。C#簡單、功能強大、類型安全,而且是面向?qū)ο蟮?。C#憑借它的許多創(chuàng)新,在保持C樣式語言的表示形式和優(yōu)美的同時,實現(xiàn)了應(yīng)用程序的快速開發(fā)。VisualStudio包含VisualC#,這是通過功能齊全的代碼編輯器、項目模板、設(shè)計器、代碼向?qū)А⒐δ軓姶笄乙子谑褂玫恼{(diào)試器以及其他工具實現(xiàn)的。通過.NETFramework類庫,可以訪問多種操作系統(tǒng)服務(wù)和其他有用的精心設(shè)計的類,這些類可顯著加快開發(fā)周期。1.4VC++的Windows程序設(shè)計方法C#看起來與Java有著驚人的相似;它包括了諸如單一繼承、接口、與Java幾乎同樣的語法和編譯成中間代碼再運行的過程。但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NETwindows網(wǎng)絡(luò)框架的主角。C#是一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的,由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言。它在繼承C和C++強大功能的同時去掉了一些它們的復(fù)雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程的支持成為.NET開發(fā)的首選語言1.4VC++的Windows程序設(shè)計方法3.其他桌面編程方法及語言簡要介紹JAVA:Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計語言,是由SunMicrosystems公司于1995年5月推出的Java程序設(shè)計語言和Java平臺(即JavaSE,JavaEE,JavaME)的總稱。Java技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于個人PC、數(shù)據(jù)中心、游戲控制臺、科學(xué)超級計算機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。Java由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Java應(yīng)用程序接口(JavaAPI)。1.4VC++的Windows程序設(shè)計方法Java平臺由Java虛擬機(JavaVirtualMachine,簡稱JVM)和Java應(yīng)用編程接口(ApplicationProgrammingInterface,簡稱API)構(gòu)成。Java應(yīng)用編程接口為Java應(yīng)用提供了一個獨立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴展部分。在硬件或操作系統(tǒng)平臺上安裝一個Java平臺之后,Java應(yīng)用程序就可運行。現(xiàn)在Java平臺已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運行。Java應(yīng)用編程接口已經(jīng)從1.1x版發(fā)展到1.2版。目前常用的Java平臺基于Java1.4,最近版本為Java1.7。1.4VC++的Windows程序設(shè)計方法Java分為三個體系J2SE(Java2PlatformStandardEdition,java平臺標(biāo)準(zhǔn)版),J2EE(Java2Platform,EnterpriseEdition,java平臺企業(yè)版),J2ME(Java2PlatformMicroEdition,java平臺微型版)。un公司對Java編程語言的解釋是:Java編程語言是個簡單、面向?qū)ο?、分布式、解釋性、健壯、安全與系統(tǒng)無關(guān)、可移植、高性能、多線程和動態(tài)的語言。1.4VC++的Windows程序設(shè)計方法3.其他桌面編程方法及語言簡要介紹WPF:WPF(WindowsPresentationFoundation)是微軟推出的基于WindowsVista的用戶界面框架,屬于。NETFramework3.0的一部分。它提供了統(tǒng)一的編程模型、語言和框架,真正做到了分離界面設(shè)計人員與開發(fā)人員的工作;同時它提供了全新的多媒體交互用戶圖形界面。由.NETFramework3.0開始引入,與WindowsCommunicationFoundation及WindowsWorkflowFoundation并行為新一代Windows

操作系統(tǒng)以及WinFX的三個重大應(yīng)用程序開發(fā)類庫?;贒irectX9/10技術(shù)的WPF不僅帶來了前所未有的3D界面,而且其圖形向量渲染引擎也大大改進了傳統(tǒng)的2D界面,比如Vista中的半透明效果的窗體等都得益于WPF。WindowsXP、WindowsServer2003和以后所有的Windows

操作系統(tǒng)版本都可以使用它。1.4VC++的Windows程序設(shè)計方法WPF其實不僅僅是圖形引擎而已,它將給Windows應(yīng)用程序的開發(fā)帶來一次革命,因為新的架構(gòu)提供了一種全新的開發(fā)模式。當(dāng)然對于普通用戶而言,最直觀的就是界面越來越漂亮,看起來越來越舒服了;但對于開發(fā)人員而言,界面顯示和代碼將更好的得到分離,這與從前的桌面應(yīng)用程序開發(fā)有很多不同(界面設(shè)置和代碼是融合在一起的),這是比較具有革命性的改變之一。還有就是桌面應(yīng)用程序和瀏覽器應(yīng)用程序的融合,根據(jù)ms的承諾,正在開發(fā)中的WPF/E,即WPFEverywhere版本,將為基于WPF的應(yīng)用程序提供全面的瀏覽器支持,這意味著未來開發(fā)出的應(yīng)用程序?qū)⒖梢曰跒g覽器在不同的操作系統(tǒng)上運行,當(dāng)然由于目前還在開發(fā)中,并不確定會不會有一定的限制,根據(jù)WPF/E開發(fā)組的定義,WPF/E仍然是WPF的子集,而不是后繼版本??傮w而言,WPF的前景應(yīng)該是一片光明。331.句柄句柄是整個Windows編程的基礎(chǔ)。一個句柄是指Windows使用的一個唯一的整數(shù)值,是一個4字長(32位無符號整數(shù))的數(shù)值,用于標(biāo)識應(yīng)用程序中不同的對象和同類對象中不同的實例。如標(biāo)識一個窗口、按鈕、圖標(biāo)、滾動條、輸入/輸出設(shè)備、控件或文件等。應(yīng)用程序通過句柄能夠訪問相應(yīng)的對象信息。2Windows程序設(shè)計的常用數(shù)據(jù)結(jié)構(gòu)34常用的句柄類型HWND 標(biāo)識窗口句柄HINSTANCE 標(biāo)識當(dāng)前實例句柄HCURSOR 標(biāo)識光標(biāo)句柄HFONT 標(biāo)識字體句柄HPEN 標(biāo)識畫筆句柄HBRUSH 標(biāo)識畫刷句柄HDC 標(biāo)識設(shè)備環(huán)境句柄HBITMAP 標(biāo)識位圖句柄HICON 標(biāo)識圖標(biāo)句柄HMENU 標(biāo)識菜單句柄HFILE 標(biāo)識文件句柄2Windows程序設(shè)計的常用數(shù)據(jù)結(jié)構(gòu)35關(guān)鍵字 類型 等價于BOOL 邏輯類型 intBOOLEAN 邏輯 BYTEBYTE 字節(jié) unsingedcharCHAR 字符 charDOUBLE 雙精度 doubleDWORD 雙字 unsignedlongFLOAT 浮點數(shù) floatHANDLE 句柄 2.2常用數(shù)據(jù)類型36INT 整數(shù) intLONG 長整數(shù) longSHORT 短整數(shù) short UCHAR 無符號字符 unsingedcharUINT 無符號整數(shù) unsingedintULONG 無符號長整數(shù) unsignedlongUSHORT 無符號短整數(shù) unsigendshortVOID voidWCHAR 雙字節(jié)碼 unsignedshortWCHAR_T 雙字節(jié)碼 unsignedshortWORD 字 unsignedshort37WPARAM 消息參數(shù) UINTLPARAM 消息參數(shù) LONGLRESULT 消息返回值 LONG HINSTANCE 實例句柄 unsignedlongHWAND 窗口句柄 unsignedlongHDC 設(shè)備環(huán)境句柄 unsignedlongTCHAR 字符 charLPSTR 字符指針 char*LPCSTR 常量字符指針 constchar*LPTSTR 字符指針 TCHAR*LPVOID 無類型指針 void*LPCVOID 無類型長指針 constvoid*38(1)坐標(biāo)結(jié)構(gòu)typedefstructtagPOINT{

LONGx;

LONGy;}POINT;注:在MFC中還有一個類CPoint,與POINT結(jié)構(gòu)近似,但它有許多成員函數(shù)。(2)長、寬尺寸結(jié)構(gòu):CSIZE,Csize;typedefstructtagSIZE{

intcx;

intcy;}SIZE;2.3點和矩形區(qū)域39(3)記錄矩形區(qū)域結(jié)構(gòu)RECT和CrecttypedefstructtagRECT{

LONGleft;

LONGtop;

LONGright;

LONGbottom;}RECT;

在MFC中Crect與此類似,但有成員函數(shù)。

LPRECT為指針RECT類型的常數(shù)指針。(4)顏色COLORREF32-bitvalueusedtospecifyanRGBcolor.

例:COLORREFRGB(BYTEbRed,BYTEbGreen,BYTEBblue);

402.4窗口結(jié)構(gòu)typedefstruct{

UINTstyle;

//窗口類型

WNDPROClpfnWndProc;

//窗口函數(shù)指針

intcbClsExtra;//為類結(jié)構(gòu)的預(yù)留額外空間

intcbWndExtra;

//為窗口結(jié)構(gòu)預(yù)留額外空間

HANDLEhInstance;

//窗口類的應(yīng)用實例句柄

HICONhIcon;

//圖標(biāo)句柄

HCURSORhCursor;

//窗口類的光標(biāo)

HBRUSHhbrBackground;//窗口類的背景刷

LPCTSTRlpszMenuName;

//菜單資源名

LPCTSTRlpszClassName;

//窗口類名}WNDCLASS;

412.4窗口結(jié)構(gòu)WNDCLASS中的style代表窗口類型,可取下面的值:WS_CHILD 子窗口(不能與WS_POPUP同時使用)WS_BORDER 帶邊框的窗口WS_CAPTION 帶標(biāo)題欄的窗口WS_HSCROLL 帶有水平滾動條的窗口WS_MAXIMIZE 最大尺寸的窗口WS_MAXIMIZEBOX 帶最大化框的窗口WS_MINIMIZE 最小尺寸的窗口WS_MINIMIZEBOX 帶最小化框的窗口WS_OVERLAPPED 帶邊框和標(biāo)題欄的窗口WS_OVERLAPPEDWINDOW 帶邊框、標(biāo)題欄、系統(tǒng)菜單及最大、最小化框的窗口WS_POPUP 彈出式窗口WS_POPUPWINDOW 帶邊框和系統(tǒng)菜單的彈出式窗口WS_SYSMENU 帶系統(tǒng)菜單的窗口WS_VSCROLL 帶垂直滾動條的窗口421、消息結(jié)構(gòu):MSGtypedefstructtagMSG{

HWND

hwnd;//消息發(fā)向的窗口句柄

UINT

message;//消息標(biāo)識符

WPARAMwParam;//16位的消息參數(shù),值因消息異

LPARAMlParam;//32位的消息參數(shù),值因消息異

DWORD

time;

//消息放入消息隊列的時間

POINT

pt;//消息放入消息隊列的鼠標(biāo)位置}MSG;

說明:WPARAM含義和數(shù)值因消息不同而不同比如:鍵盤消息和鼠標(biāo)消息所對應(yīng)的WPARAM消息所代表的消息是不同的。2.5消息432.5消息2、MSG中的域說明hwnd是一個窗口句柄,用于標(biāo)識消息發(fā)向的窗口。time用于保存消息放進消息隊列的時間。pt用于保存將消息放入消息隊列時的鼠標(biāo)位置。message是消息標(biāo)識符,它是一個32位的無符號整數(shù)。Windows中的每條消息都有一個對應(yīng)的消息標(biāo)識符,這些標(biāo)識符是在windows.h中定義的。443、消息的種類

標(biāo)準(zhǔn)Windows消息除WM_COMMAND外,所有以WM_為前綴的消息,由窗口和視圖處理。控制消息由控件和子窗口發(fā)給父窗口的消息。命令消息來自用戶接口對象。如:菜單、工具條和加速鍵等。2.5消息452.5消息4、常見消息前綴的含義BM表示按鈕控制消息CB組合框控制消息EM編輯框控制消息LB列表控制消息SBM滾動條控制消息WM窗口消息462.5消息5、Windows常用鼠標(biāo)消息WM_LBUTTONDBLCLKWM_LBUTTONDOWNWM_LBUTTONUPWM_MBUTTONDBLCLKWM_MBUTTONDOWNWM_MBUTTONUP

WM_RBUTTONDBLCLKWM_RBUTTONDOWNWM_RBUTTONUP472.5消息6、Windows常用鍵盤消息WM_KEYUPWM_KEYDOWN

按下非系統(tǒng)鍵時產(chǎn)生此消息,系統(tǒng)鍵是指實現(xiàn)系統(tǒng)操作的組合鍵,如Alt和F1相結(jié)合的按鈕鍵。附加參數(shù)wParam為按下鍵的虛擬鍵碼,lParam記錄按鈕的重復(fù)次數(shù)、先前狀態(tài)等。WM_KEYUP是釋放按鍵時的鍵盤消息,其含義同WM_KEYDOWN。

WM_CHAR按下非系統(tǒng)鍵時產(chǎn)生的消息,附加參數(shù)wParam為按鍵的ASCII碼,lparam同前。487、其它常用Windows常用消息WM_CREATECreateWindow函數(shù)發(fā)生的消息。WM_CLOSE關(guān)閉窗口時產(chǎn)生的消息,如有子窗口,也一起刪除。WM_DESTROY關(guān)閉窗口時產(chǎn)生的消息WM_PAINThdc=(HDC)wParam;//發(fā)生用戶區(qū)域移動或顯示事件、用戶窗口改變大小的事件、程序通過流動條滾動窗口,覆蓋在窗口上面的其它對象(如菜單)移開時,都會產(chǎn)生此消息!.2.5消息498、消息的產(chǎn)生用戶產(chǎn)生消息

Windows本身產(chǎn)生消息應(yīng)用程序本身產(chǎn)生消息其他應(yīng)用程序產(chǎn)生消息9、消息的傳遞Windows系統(tǒng)有一個存放消息的隊列,每個應(yīng)用程序也有一個消息隊列。Windows系統(tǒng)先將收到的消息存放在系統(tǒng)隊列中;然后再分發(fā)到相應(yīng)的應(yīng)用程序隊列中。應(yīng)用程序則從自身的隊列中獲取消息并進行處理。10.2.5消息5010、消息的處理通常每個Windows應(yīng)用程序至少對應(yīng)一個窗口,每個窗口都要有一個窗口函數(shù)負(fù)責(zé)處理該窗口內(nèi)所發(fā)生的事件。每個窗口至少有一個窗口函數(shù),負(fù)責(zé)處理該窗口的所有消息。2.5消息511、Windows標(biāo)識符常用命名規(guī)則函數(shù)命名規(guī)則函數(shù)名=動詞+名詞動詞和名詞的第一個字母必須大寫例GetMessage變量命名規(guī)則小寫字母前綴表示變量的類型,其余的部分描述變量的功能例nCount匈牙利命名法變量名以小寫字母或代表數(shù)據(jù)類型的小寫字母開頭.Eg:szCmdLine補充:Windows程序的名字52前綴代表的數(shù)據(jù)類型ccharorWCHARorTCHARbyBYTE(unsignedchar)nshortiintx,yintusedasx-coordinateory-coordinatecx,cyintusedasxorylength;cstandsfor"count"borfBOOL(int);fstandsfor"flag"wWORD(unsignedshort)lLONG(long)dwDWORD(unsignedlong)fnfunctionsstringszstringterminatedby0characterhhandleppointer2、Windows程序常見名字前綴的含義533Windows程序的基本結(jié)構(gòu)1、簡單的Windows程序至少包含兩個函數(shù):WinMain():必有且僅有一個。是程序執(zhí)行的入口點,類似于C程序中的main函數(shù)窗口函數(shù)

:每個窗口對應(yīng)一個窗口函數(shù),以響應(yīng)該程序窗口中發(fā)生的事件消息。2、WinMain()函數(shù)需完成的功能定義窗口類注冊窗口類建立窗口類的窗口顯示窗口運行消息循環(huán)543Windows程序的基本結(jié)構(gòu)3、Windows程序的執(zhí)行邏輯Windows系統(tǒng)首先為該程序建立必備的程序環(huán)境,如定義并初始化一些全局變量,接下來就尋找并進入WinMain函數(shù)。WinMain是Window程序的入口點,由它控制程序的執(zhí)行流程。WinMain函數(shù)依次完成以下工作:調(diào)用API函數(shù)定義并注冊窗口類,創(chuàng)建程序窗口,顯示窗口,建立消息循環(huán),等待用戶操作程序窗口。用戶在程序窗口中所作的每件事情都會產(chǎn)生一個消息,該消息會被Windows傳遞到該程序的消息隊列中。WinMain中的消息循環(huán)會不斷地從本程序的消息隊列中獲取消息,并將其傳遞給該窗口的窗口處理函數(shù),由窗口處理函數(shù)對消息進行處理,實現(xiàn)相應(yīng)的程序功能。553.2Win32Application程序設(shè)計在MiscrosoftVisualC++中的API程序設(shè)計方法一般的編程方法是先用VC++的Win32Application向?qū)Ы⒁粋€Windows應(yīng)用程序的框架,然后將它修改成自己的程序,并根據(jù)需要添加一些頭文件、源程序文件及資源文件。【例10-1】在VC++6.0環(huán)境下設(shè)計一個簡單的WindowsAPI程序,該程序在窗口中顯示字符串"Hellow,APIProgramming!"。563.2Win32Application程序設(shè)計編程過程如下:(1)啟動VC++6.0,選擇菜單“文件|新建”,在彈出的“新建”對話框中選擇“工程”標(biāo)簽頁,如圖所示。573.2Win32Application程序設(shè)計(2)選中“工程”對話框中的“Win32Application”列表項,并在“位置”編輯框中指定本項目建立的磁盤目錄,然后在“工程”編輯框中輸入項目文件的名字。(3)單擊“確定”按鈕,并在彈出的對話框中選中“Anemptyproject.”單選項,然后單擊“完成”按鈕。最后將得到如圖10-7(a)所示的空項目文件窗口。(4)選擇菜單“文件|新建”,然后在彈出的對話框中選擇“文件”標(biāo)簽,并選擇列表中的“C++SourceFile”項目,然后在“文件”編輯框中輸入源程序文件名“HellApi”,如圖10-7(b)所示。輸入完成后,單擊“結(jié)束”按鈕。58.3.2Win32Application程序設(shè)計59.3.2Win32Application程序設(shè)計(5)打開目錄C:\dk\HellApi,在該目錄中可以看到以下文件名:HellApi.cpp、HellApi.dsp、HellApi.dsw、HellApi.ncb、HellApi.opt,這些文件就是在前面的操作過程產(chǎn)生的。(6)在HellApi.cpp中輸入下面的程序代碼。60HellApi.cpp#include<windows.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){staticTCHARszAppName[]=TEXT("HelloWin");HWNDhwnd;MSGmsg;61

WNDCLASSwndclass;

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("ThisprogramrequiresWindowsNT!"),szAppName,MB_ICONERROR);return0;}注冊窗口類定義窗口的屬性,如大小、寬度,前景色等62hwnd=CreateWindow(szAppName, //用于建立窗口的類名

TEXT("TheHelloProgram"), //窗口標(biāo)題

WS_OVERLAPPEDWINDOW,//窗口類型

CW_USEDEFAULT, //窗口左上角X坐標(biāo)為默認(rèn)值

CW_USEDEFAULT, //窗口左上角Y坐標(biāo)為默認(rèn)值

CW_USEDEFAULT, //窗口寬度為默認(rèn)值

CW_USEDEFAULT, //窗口高度為默認(rèn)值

NULL, //該窗口沒有父窗口

NULL, //該窗口沒有菜單

hInstance, //創(chuàng)建本窗口的程序句柄

NULL); //系統(tǒng)保留參數(shù)

ShowWindow(hwnd,iCmdShow); //顯示窗口,hwnd代表上面建立的窗口

UpdateWindow(hwnd); //更新窗口,繪制窗口客戶區(qū)本段程序建立并顯示一個窗口63while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}returnmsg.wParam;}Windows程序的消息循環(huán)64LRESULTCALLBACKWndProc( HWNDhwnd, UINTmessage, WPARAMwParam, LPARAMlParam){HDChdc;PAINTSTRUCT ps;RECTrect;窗口處理函數(shù),是一個回調(diào)函數(shù),每個應(yīng)用程序至少有一個窗口處理函數(shù),窗口函數(shù)的參數(shù)由Windows傳遞,這些參數(shù)是由事件消息產(chǎn)生的。65switch(message){ //消息處理

caseWM_CREATE:return0;

caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,"Hello,WindowsAPI",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);

EndPaint(hwnd,&ps);return0;caseWM_DESTROY:PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,message,wParam,lParam);}663.3Windows程序的控制流程所有Windows應(yīng)用程序具有相同的程序結(jié)構(gòu)和執(zhí)行控制流程,步驟如下:(1)創(chuàng)建全局變量(2)程序入口函數(shù)WinMain()函數(shù)接收控制(3)WinMain()登記窗口(4)WinMain()建立窗口(5)WinMain()進入消息循環(huán)(6)當(dāng)窗口中有事件發(fā)生時,事件消息進入消息循環(huán)隊列(7)windows操作系統(tǒng)分析消息,調(diào)用該窗口的窗口函數(shù)進行處理。(8)WinMain函數(shù)退出,程序終止。67初始化所有全局對象WinMain()登記窗口建立窗口消息循環(huán)Hello,WindowsAPI顯示窗口程序出口:WM_QUITWindows程序的控制流程683.3Windows程序的控制流程接下來將對API程序的建立、執(zhí)行流程進行進一步的剖析。借此理解Windows程序的結(jié)構(gòu),事件驅(qū)動和消息循環(huán)的本質(zhì)。69DOS平臺的C程序的入口點是main()函數(shù),在WINDOW的C++程序的入口點是WinMain()函數(shù)。其定義形式為:intAPIENTRYWinMain(

HINSTANCEhInstance,//

HINSTANCEhPrevInstance,

LPSTRlpCmdLine,

intnCmdShow)實例句柄,當(dāng)程序在WINDOWS下運行時,它唯一地標(biāo)識該程序當(dāng)程序在WINDOWS下有多個副本運行時,它標(biāo)識該程序的前一個副本標(biāo)識傳給該程序的命令行參數(shù),近似于main()函數(shù)的char*argv[]指示窗口在Window中的顯示方式,其值為1-7,如:值1表示SW_SHOWNORMAL//窗口以常規(guī)顯示見第321頁表10-41、程序入口點70窗口總是在窗口類的基礎(chǔ)上創(chuàng)建的,窗口類標(biāo)識了處理窗口消息的窗口過程,這是非常重要的。在創(chuàng)建窗口之前,必須先調(diào)用RegisterClass函數(shù)注冊一個窗口類,以后可以基于這個已登錄的窗口創(chuàng)建多個窗口。

只有程序的第一個實例需要注冊窗口類!

例10-1的注冊窗口如下:2、注冊窗口類71

WNDCLASSwndclass; 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,“Thisprogram……!",szAppName,MB_ICONERROR);return0;}發(fā)生在本窗口中的事件由WndProc處理,這是WinMain與窗口函數(shù)的關(guān)聯(lián)!723、創(chuàng)建窗口hwnd=CreateWindow( szAppName,//windowclassnameTEXT("TheHelloProgram"),//windowcaptionWS_OVERLAPPEDWINDOW,//windowstyleCW_USEDEFAULT,//initialxpositionCW_USEDEFAULT,//initialypositionCW_USEDEFAULT,//initialxsizeCW_USEDEFAULT,//initialysizeNULL,//parentwindowhandleNULL,//windowmenuhandlehInstance,//programinstancehandleNULL );//creationparameters

if(!hWnd){returnFALSE;}//建立窗口失敗

734、顯示窗口

ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);hWnd是前面創(chuàng)建的窗口的句柄nCmdShow是窗口顯示的方式,缺省值為1即:SW_SHOWNORMALhWnd是前面創(chuàng)建的窗口的句柄,該函數(shù)產(chǎn)生WM_PAINT消息,導(dǎo)致窗口被重繪745、消息循環(huán)調(diào)用UpdateWindow(hWnd);函數(shù)之后,窗口就顯示在顯示屏幕上,這時程序就進入了消息循環(huán),等待用戶用鍵盤或鼠標(biāo)操作窗口,產(chǎn)生消息。產(chǎn)生的消息將被放入消息隊列:

755、

Windwos消息循環(huán)系統(tǒng)消息隊列應(yīng)用程序隊列1應(yīng)用程序隊列2應(yīng)用程序隊列3應(yīng)用程序隊列n應(yīng)用程序1WinMain()函數(shù)消息循環(huán)窗口函數(shù)1窗口函數(shù)m應(yīng)用程序1WinMain()函數(shù)消息循環(huán)窗口函數(shù)1窗口函數(shù)m硬件輸入MSG本隊列由Windows系統(tǒng)建立和維護MSGMSGMSGMSGMSGMSGMSGMSG76while(GetMessage(&msg,NULL,0,0)){ {TranslateMessage(&msg); DispatchMessage(&msg); } }消息循環(huán)從此開始,它從消息隊列中取出一條消息,WM_QUIT則退出將MSG消息進行傳給WINDOWS系統(tǒng),并進行一些鍵盤轉(zhuǎn)換再將MSG消息傳給WINDOWS系統(tǒng),然后WINDOWS系統(tǒng)將該消息傳給正確的窗口過程,讓它進行處理。本程序是由WndProc函數(shù)處理,處理完畢后,WndProc返windows,因為此時Windows調(diào)用還處于DispatchMessage函數(shù),在該函數(shù)執(zhí)行后,再次返回到下一個GetMessage函數(shù)77Windows應(yīng)用程序的消息處理流程WM_KEYDOWNWM_KEYUPWM_MOUSEMOVEWM_LBUTTONUPWM_QUIT…應(yīng)用程序消息隊列WinMain()消息循環(huán)WndProc()caseWM_KEYDOWNcaseWM_KEYUPcaseWM_LBUTTUP…defaultWM_CREATEWM_DESTROYWM_SIZEWM_PAINT…①④②GetMessage()③檢索到的消息DispatchMessage()⑤DefWindowProc⑥Windows系統(tǒng)應(yīng)用程序回調(diào)786、窗口函數(shù)實際的動作發(fā)生在窗口函數(shù)中,窗口函數(shù)確定了在窗口的客戶區(qū)域中顯示些什么以及窗口函數(shù)怎樣響應(yīng)用戶的輸入。LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)說明:1、WndProc是一個回調(diào)函數(shù)

CALLBACK指定窗口函數(shù)是一個回調(diào)函數(shù)。回調(diào)就是由Windows系統(tǒng)調(diào)用的意思,即窗口函數(shù)是由Windows系統(tǒng)調(diào)用的,應(yīng)用程序不必調(diào)用它。

792、窗口函數(shù)的參數(shù)每個Windows應(yīng)用程序的窗口函數(shù)都有著相同的參數(shù)表:第1個參數(shù)hWnd用于標(biāo)識接收消息的窗口句柄;第2個參數(shù)message用于標(biāo)識消息,該消息將被用于處理消息的switch結(jié)構(gòu)中;第3、4個參數(shù)wParam和lParam是message的附加信息,它們的內(nèi)容隨message消息而異,如鼠標(biāo)消息與鍵盤消息的wParam和lParam參數(shù)就不一樣。窗口函數(shù)主要利用這些參數(shù)響應(yīng)窗口事件,實現(xiàn)程序功能。6、窗口函數(shù)807、消息處理

窗口函數(shù)所接收的消息都是用一個數(shù)值來標(biāo)識的,它就是傳遞給窗口過程的message參數(shù),消息在WINDOWS.H頭文件中定義,它們是以“WM_”的標(biāo)識符。 一般地,在WINDOWS程序中使用switch和case結(jié)構(gòu)來確定窗口函數(shù)接收的是什么消息以及如何處理它。 窗口窗口函數(shù)不處理的消息被傳給DefWindowProc函數(shù)進行缺省處理。81switch(message){caseWM_CREATE:……break;caseWM_PAINT:……break;caseWM_DESTROY:……default:returnDefWindowProc(……);}消息處理過程828、數(shù)據(jù)輸出與WM_PAINT消息

WM_PAINT消息對于windows程序設(shè)計是極其重要的,當(dāng)窗口客戶區(qū)的一部分或全部變?yōu)椤盁o效”時,將產(chǎn)生該消息,它導(dǎo)致窗口重繪。Hellowwindow中窗口的類型為:CS_HREDRAW|CS_VREDRAW;該類型指示當(dāng)窗口水平或垂直方向發(fā)生變化時,窗口將產(chǎn)生WM_PAINT消息致使窗口重繪。83WM_PAINT消息的處理模式:

hdc=BeginPaint(hwnd,&ps)…………進行窗口繪制的程序代碼

……EndPaint(hwnd,&ps);8、數(shù)據(jù)輸出與WM_PAINT消息

849、WM_DESTROY消息與程序結(jié)束

這是一條重要的消息,它指示windows系統(tǒng)關(guān)閉該應(yīng)用程序。系統(tǒng)菜單上的close或ALT+F4都會產(chǎn)生該消息。Hellowwindow程序通過

PostQuitMessage(0);函數(shù)產(chǎn)生該消息。導(dǎo)致應(yīng)用程序的關(guān)閉。85WM_DESTROY與WinMain結(jié)束應(yīng)用程序消息隊列WinMain()消息循環(huán)WndProc()caseWM_KEYDOWNcaseWM_KEYUPcaseWM_DESTROY…defaultWM_DESTROY消息①④②GetMessage()③WM_QUIT退出消息循環(huán)結(jié)束應(yīng)用程序⑤PostQuitMessage(0)⑥Windows系統(tǒng)應(yīng)用程序864WindowsAPI程序設(shè)計的方法Windows程序由主函數(shù)WinMain和窗口處理函數(shù)構(gòu)成。WinMain是程序執(zhí)行的入口點,每個WinMain的主要功能是創(chuàng)建程序窗口、建立消息循環(huán),其程序結(jié)構(gòu)和代碼幾乎完全相同。窗口函數(shù)主要處理發(fā)生在程序窗口中的各種用戶事件(如選擇菜單、單擊鼠標(biāo)等),是Windows程序設(shè)計的主體和重點,程序的不同功能都是在窗口函數(shù)的消息處理中實現(xiàn)的。因此編程工作主要在窗口函數(shù)中。在VC++環(huán)境中設(shè)計API程序時,可以先利用VC++向?qū)梢粋€簡單的應(yīng)用程序框架,然后對框架程序中的窗口函數(shù)進行修改,添加響應(yīng)窗口事件的消息處理代碼段,增加程序的數(shù)據(jù)輸出和消息處理功能,就能夠?qū)崿F(xiàn)需要的程序功能。874.1Windows程序的數(shù)據(jù)輸出1、GDI(GraphicsDeviceInterface)

GDI是Windows為應(yīng)用程序提供的圖形設(shè)備接口,其中提供了豐富的圖形API函數(shù)。GDIAPI函數(shù)大致可以分為3種類型①字符輸出類函數(shù),以圖形方式輸出字符、文本;②矢量圖形函數(shù),用于繪制點、線、橢圓、三角形等幾何圖形;③光柵圖形函數(shù),用于繪制位圖。884.1Windows程序的數(shù)據(jù)輸出2、設(shè)備無關(guān)性是指在用GDI函數(shù)設(shè)計針對不同硬件設(shè)備的輸出程序時,不必考慮具體的硬件特性,只需用統(tǒng)一的方式編寫程序,Windows系統(tǒng)會自動調(diào)用具體設(shè)備的硬件驅(qū)動程序?qū)DI圖形輸出程序轉(zhuǎn)換成特定硬件設(shè)備的輸出程序。894.1Windows程序的數(shù)據(jù)輸出3、設(shè)備環(huán)境(DeviceContext,DC)也稱為設(shè)備描述表或設(shè)備上下文。是Windows為了實現(xiàn)設(shè)備無關(guān)性而向應(yīng)用程序提供了一個虛擬邏輯設(shè)備,它其實是一種數(shù)據(jù)結(jié)構(gòu),其中存了繪圖操作需要的所有信息,如繪畫筆、字體、圖畫顏色、繪制的圖形背景及繪圖的模式。設(shè)備環(huán)境由Windows系統(tǒng)統(tǒng)一管理,當(dāng)應(yīng)用程序需要輸出圖形(包括字符)時,必須向Windows系統(tǒng)提出申請,用完后必須釋放,以便其他程序申請使用。DC相當(dāng)畫家手中的繪圖工具,包括畫紙、畫筆、顏料……。程序只需要用DC中的畫筆在DC中作畫,Windows就會直接將之轉(zhuǎn)換輸出到顯示器、打印機之類的輸出設(shè)備上。904.1Windows程序的數(shù)據(jù)輸出4、Windows程序的輸出過程(1)程序首先獲取設(shè)備環(huán)境句柄(2)通過該句柄調(diào)用圖形設(shè)備接口的繪圖函數(shù)繪圖。(3)繪圖函數(shù)所繪制的圖形被Windows系統(tǒng)提供的設(shè)備驅(qū)動程序轉(zhuǎn)換成具體物理設(shè)備的繪圖函數(shù),從而在具體硬件設(shè)備上繪制出圖形。915.獲取設(shè)備環(huán)境(1)用API函數(shù)BeginPaint獲取設(shè)備環(huán)境句柄如果在WM_PAINT消息處理中輸出圖形,就應(yīng)該使用函數(shù)BeginPaint獲取設(shè)備環(huán)境句柄,用法如下:……PAINTSTRUCTps;//此數(shù)據(jù)結(jié)構(gòu)的說明見下頁…… caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);//獲取設(shè)備環(huán)境句柄

…… //繪制圖形或輸出文本的程序代碼

EndPaint(hwnd,&ps);

925.獲取設(shè)備環(huán)境說明:(1)PAINTSTRUCT結(jié)構(gòu)的定義如下:typedefstructtagPAINTSTRUCT{HDChdc; //設(shè)備環(huán)境句柄

BOOLfErase; //指示是否擦除無效區(qū)域背景

RECTrcPaint; //用于標(biāo)識無效的矩形區(qū)域

BOOLfRestore;//系統(tǒng)保留

BOOLfIncUpdate; //系統(tǒng)保留

BYTErgbReserved[16];//系統(tǒng)保留}PAINTSTRUCT;(2)BeginPaint用于獲取設(shè)置環(huán)境句柄,EndPaint用于釋放設(shè)備環(huán)境句柄。BeginPaint和EndPaint必須配對使用。935.獲取設(shè)備環(huán)境(2)用GetDC獲取設(shè)備環(huán)境句柄如果在是在除WM_PAINT之外的其他消息處理中輸出圖形,就應(yīng)該用GetDC獲取設(shè)備環(huán)境句柄,用完后必須使用ReleaseDC將其釋放。其形式如下:caseWM_XX: //WM_XX非WM_PAINThdc=GetDC(hWnd); //hWnd是窗口句柄………… //繪制圖形或輸出文本的程序代碼ReleaseDC(hWnd,hdc); //釋放設(shè)備環(huán)境句柄break;其中:GetDC和ReleaseDC須配對使用946.輸出圖形設(shè)備環(huán)境(即設(shè)備描述表)定義了繪圖的圖形對象和圖形模式,應(yīng)用程序獲取到了設(shè)備環(huán)境后,就能夠通過設(shè)備環(huán)境句柄使用GDIAPI函數(shù)來繪制圖形。在用設(shè)備環(huán)境輸出圖形之前,應(yīng)用程序可以事先把一些繪圖對象選入設(shè)備環(huán)境中,然后就可以用這些對象來繪制圖形。表5-1是常用的繪圖對象對象定義對象句柄的結(jié)構(gòu)Windows定義的備用對象說明BitmapHBITMAP

用于處理位圖BrushHBRUSHXX_BRUSH用于填充圖形的內(nèi)部PaletteHPALETTE用于管理顏色FontHFONTXX_FONT用于設(shè)置文本的字體PenHPENXX_PEN用于繪制圖形956.輸出圖形GDI中常用的函數(shù)MoveTo(hDC,x,y); //將畫筆從當(dāng)前位置移到(x,y)坐標(biāo)BOOLLineToEx(HDChdc,intx,inty); //從當(dāng)前點畫直線到(x,y)坐標(biāo)處BOOLRectangle(HDChdc,intx1,inty1,intx2,inty2);//以(x1,y1)為左上角坐標(biāo),(x2,y2)為右下角坐標(biāo)畫矩形BOOLRoundRect(HDChdc,intx1,inty1,intx2,inty2,inth,intw);//以(x1,y1)為左上角坐標(biāo),(x2,y2)為右下角坐標(biāo)畫圓角矩形BOOLEllipse(HDChdc,intx1,inty1,intx2,inty2);//以(x1,y1)為左上角坐標(biāo),(x2,y2)為右下角坐標(biāo)畫橢圓967.輸出文本W(wǎng)indows程序的文本按圖形方式輸出。輸出文本時必須以像素為單位精確定位每一行的輸出位置。常用文本輸出函數(shù)有TextOut和DrawTexBOOLTextOut(HDChdc,intx,inty,LPCTSTRlpString,intn);intDrawText(HDChdc,LPCTSTRlpString,intn,LPRECTlpRect,UINTuFormat);977.輸出文本輸出文本的字體設(shè)置問題Windows提供了豐富的字體,不同字體的高度和寬度也不盡相同,函數(shù)GetTextMetrics能夠獲取當(dāng)前字體的詳細(xì)信息,如字符的完度、高度、字間距、行間距等信息。其原型如下:BOOLGetTextMetrics(HDChdc,TEXTMETRICS&tm);TEXTMETRICS是保存字體信息的數(shù)據(jù)結(jié)構(gòu),主要域如下:typedefstructtagTEXTMETRIC{LONGtmHeight; //字符高度

LONGtmExternalLeading; //行間距

LONGtmAveCharWidth; //字符的平均寬度

LONGtmMaxCharWidth; //最大字符寬度

LONGtmWeight; //字符的粗細(xì)度

BYTEtmCharSet; //字符集……}TEXTMETRIC;9810.4.1Windows程序的數(shù)據(jù)輸出【例10-2】在例10-1的基礎(chǔ)上,修改窗口函數(shù)中的WM_PAINT消息,讓程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論