版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Windows編程基礎(chǔ)基于 Windows的編程方式有兩種。一種是使用 Windows的AP( Application Programming In terface,應(yīng)用程序編程接口)函數(shù),通常用 C/C+語(yǔ)言按相應(yīng)的程序框架進(jìn)行編程。這 些程序框架往往就程序應(yīng)用提供相應(yīng)的文檔、范例和軟件開(kāi)發(fā)工具包(Software Developme ntKit,SDK),所以這種編程方式有時(shí)又稱為SDK方式。另一種是使用“封裝”方式,例如Visual C+的MFC方式,它是將 SDK中的絕大多數(shù)函數(shù)、數(shù)據(jù)等按C+ “類”的形式進(jìn)行封裝,并提供相應(yīng)的應(yīng)用程序框架和編程操作。事實(shí)上,無(wú)論是哪種編程方式, 人們
2、最關(guān)心的內(nèi)容有三個(gè): 一是程序入口,二是窗口、 資源等的創(chuàng)建和使用,三是鍵盤(pán)、鼠標(biāo)等所產(chǎn)生的事件或消息的接收和處理。本章就來(lái)討論這些內(nèi)容。1.1 從 main 至U WinMain學(xué)習(xí)編程往往從簡(jiǎn)單的例子入手,例如一個(gè)c程序常有下列簡(jiǎn)單的框架代碼:#include int main() printf(Hello World!n);/* 輸出 */return 0;/ *指定返回值*/事實(shí)上,該程序已包括C程序中最常用的#include指令、必須的程序入口main函數(shù)、庫(kù)函數(shù)printf調(diào)用和return語(yǔ)句。由于此程序是在早期的DOS ( Disk Operating System,磁盤(pán)操作系
3、統(tǒng))環(huán)境的字符模型下運(yùn)行的,因而printf函數(shù)所輸出的都是字符流,也就是說(shuō),它在屏幕上輸出一行文本“Hello World!”。在 Windows環(huán)境下,這里的屏幕就由控制臺(tái)窗口來(lái)兼作,而基于 Windows的上述C程序代碼框架肯定是有所不同的。特別地,由于目前 所在的 Windows環(huán)境基本上都是 32位,所以這里的 Windows程序平臺(tái)就是 Win32 ,Windows 編程可直接理解為是Win32編程。1.1.1 Windows等價(jià)程序等價(jià)的Windows程序可以寫(xiě)成:HelloMsg.c#include int WINAPI WinMain (HINSTANCE hInstance
4、, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)MessageBox (NULL, TEXT(Hello, World!), TEXT(Hello), 0); return 0 ;在深入剖析上述程序之前,先來(lái)看一看在Visual C+ 6.0中的編輯、連接和運(yùn)行的過(guò)程: 選擇開(kāi)始”t程序”t Microsoft Visual Studio 6.0 Microsoft Visual C+ 6.0,運(yùn)圖1.1 “每日提示”對(duì)話框行Visual C+ 6.0。第一次運(yùn)行時(shí),將顯示如圖1.1所示的每日提示”對(duì)話框。單擊下一條”按鈕, 可看
5、到有關(guān)各種操作的提示。如果在啟動(dòng)時(shí)顯示 提示”復(fù)選框中單擊鼠標(biāo),去除復(fù)選框的選中標(biāo)記 “ ”,那么下一次運(yùn)行 Visual C+ 6.0 ,將不再出現(xiàn) 此對(duì)話框。單擊“關(guān)閉”按鈕關(guān)閉此對(duì)話框,進(jìn)入Visual C+ 6.0 開(kāi)發(fā)環(huán)境。 選擇“文件”7“新建”菜單命令,打開(kāi)應(yīng)用程序向?qū)?,顯示出“新建”對(duì)話框,如圖1.2所示。選擇“工程”選項(xiàng)卡,從列表框中選中Win32 Application (Win32應(yīng)用程序)項(xiàng)(圖1.2中的標(biāo)記1)。 單擊“位置”編輯框右側(cè)的“瀏覽”按鈕工(圖1.2中的標(biāo)記 2),從彈出的“選擇目錄”對(duì)話框指定項(xiàng)目所在的文件夾,如圖1.3所示(圖中的數(shù)字標(biāo)記表示最經(jīng)常的操
6、作次序,下同)。單擊“確定”按鈕,退出“選擇目錄”對(duì)話框,回到“新建”對(duì)話框中。需要說(shuō)明的是,為了便于程序的管理和查找, 本書(shū)所涉及的程序均放入 Visual C+ 6.0 的工作文件夾“ Visual C+程序”中,第1章程序放入子文件夾“第 1章”中,第2章程 序放入子文件夾“第 2章”,依此類推。 在“新建”對(duì)話框的“工程名稱”編輯框(圖 1.2中的標(biāo)記3)中,輸入項(xiàng)目名稱 Ex_HelloMsg,保留“平臺(tái)”下 Win32復(fù)選框的默認(rèn)“選中 切”狀態(tài),單擊“確定”按鈕進(jìn) 入下一步。 出現(xiàn)Win32 Application向?qū)У摹安襟E1共1步”對(duì)話框,從中可選擇要?jiǎng)?chuàng)建的應(yīng)用 程序類型:“
7、一個(gè)空工程”、“一個(gè)簡(jiǎn)單的 Win32程序”和“一個(gè)典型的Hello World!程序”,如圖1.4所示。它們的區(qū)別在于:“一個(gè)空工程”僅創(chuàng)建 Win32應(yīng)用程序文件框架, 不含任何代碼;“一個(gè)簡(jiǎn)單的 Win32程序”是在“一個(gè)空工程”基礎(chǔ)上添加了程序框架(有入口函數(shù)、#inelude指令等);“一個(gè)典型的Hello World!程序”在“一個(gè)簡(jiǎn)單的 Win32 程序”基礎(chǔ)上增加了 MessageBox函數(shù)調(diào)用,用來(lái)輸出“ Hello World!”。圖1.2 “新建”對(duì)話框“工程”選項(xiàng)卡圖1.3 “選擇目錄”對(duì)話框精品 選中“一個(gè)空工程”,單擊“完成”按鈕,彈出“新建工程信息”對(duì)話框,如圖
8、1.5 所示。單擊“確定”按鈕,系統(tǒng)將按前面的選擇自動(dòng)創(chuàng)建此應(yīng)用程序。圖1.4應(yīng)用程序的向?qū)?duì)話框圖1.5 “新建工程信息”對(duì)話框Visual C+將打開(kāi)“新建”對(duì)話框并自動(dòng)C+ Source File (C+ 再次選擇“文件”7“新建”菜單命令,切換到“文件”選項(xiàng)卡,如圖1.6所示。在左側(cè)的文件類型列表中選中源文件),在右側(cè)的“文件名”編輯框中輸入“ HelloMsg.c”或輸入“ HelloMsg.cpp”(文件 擴(kuò)展名也可不輸入,系統(tǒng)會(huì)自動(dòng)添加 cpp擴(kuò)展名,cpp是C Plus Plus的縮寫(xiě),是 C+的 意思)。 單擊“確定”按鈕,系統(tǒng)將在創(chuàng)建的 Win32項(xiàng)目工程Ex_HelloM
9、sg中創(chuàng)建并添加一HelloMsg.c 中輸入前面例個(gè)新的文件HelloMsg.c,同時(shí)打開(kāi)該文件窗口。現(xiàn)在可以在HelloMsg.c中的代碼了。輸完后,單擊編譯工具條上的“生成工具”按鈕圃或直接按F7鍵,系統(tǒng)開(kāi)始對(duì)Ex_HelloMsg項(xiàng)目工程中的文件進(jìn)行 編譯、連接,同時(shí)在輸出窗口中觀察出現(xiàn)的內(nèi)容,當(dāng)出現(xiàn)Ex_HelloMsg.exe-。error(s), 0 warning(s)表示Ex_HelloMsg.exe可執(zhí)行文件已經(jīng)正確無(wú)誤地生成了。同時(shí)也可看到在文檔窗口中所有代碼的顏色都發(fā)生改變,這是Visual C+ 6.0的文本編輯器所具有的語(yǔ)法顏色功能(綠色表示注釋,藍(lán)色表示關(guān)鍵字等)
10、。 單擊編譯工具條上的“運(yùn)行工具”按鈕 或直接按Ctrl+F5鍵,就可以運(yùn)行剛剛生*成的Ex_HelloMsg.exe,結(jié)果如圖1.7所示。單擊“確定”按鈕,Hello對(duì)話框退出。圖1.6創(chuàng)建并添加程序文件圖1.7開(kāi)發(fā)環(huán)境和運(yùn)行結(jié)果1.1.2頭文件C/C+編寫(xiě)的 Windows應(yīng)用HelloMsg.c是一個(gè)#include預(yù)處理指令開(kāi)始,實(shí)際上在用程序的頭部都可以看到這樣的指令:#include 頭文件 Windows.h是最主要的包含頭文件,它還包含了其他一些Windows頭文件。例如:windef.h:基本類型定義winbase.h:wingdi.h:內(nèi)核函數(shù) 用戶接口函數(shù)winuser.
11、h:圖形設(shè)備接口函數(shù)這些頭文件定義了 Windows的所有數(shù)據(jù)類型、函數(shù)調(diào)用、數(shù)據(jù)結(jié)構(gòu)和符號(hào)常量,它們 是Windows應(yīng)用程序文檔中的一個(gè)重要部分。1.1.3 程序入口函數(shù)在 C/C+ 程序中,其入口函數(shù)都是main 。但在 Windows 程序中,這個(gè)入口函數(shù)由WinMain 來(lái)代替。該函數(shù)是在 winbase.h 中聲明的,其原型如下:intWINAPIWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstanc,eLPSTR lpCmdLine,int nShowCmd);可以看出,這個(gè) WinMain 函數(shù)除了形參名、個(gè)數(shù)與 main 函數(shù)不同
12、外,類型名也有了 新的變化。下面就來(lái)分析: WinMain 函數(shù)被聲明成為返回一個(gè)int 值, 同時(shí) WinMain 函數(shù)名前還有 WINAPI 標(biāo)識(shí)符的修飾。 WINAPI 是一種“調(diào)用約定”宏,它在 windef.h 中有如下定義:#define WINAPI_stdcall所謂“調(diào)用約定” ,就是指程序生成機(jī)器碼后,函數(shù)調(diào)用的多個(gè)參數(shù)是按怎樣的次 序來(lái)傳遞,同時(shí)函數(shù)調(diào)用結(jié)束后堆棧由誰(shuí)來(lái)恢復(fù),以及編譯器對(duì)函數(shù)名的修飾約定等的 協(xié)議。函數(shù)調(diào)用約定“協(xié)議”有許多,其中由WINAPI宏指定的_stdcall是一個(gè)常見(jiàn)的協(xié)議, 內(nèi)容包括:參數(shù)從右向左壓入堆棧;函數(shù)自身修改堆棧;機(jī)器碼中的函數(shù)名前面
13、自動(dòng)加下 劃線,而函數(shù)后面接 符號(hào)和參數(shù)的字節(jié)數(shù)。特別地,Visual C+的MFC方式卻采用了 _cdecI調(diào)用約定:參數(shù)從右向左壓入堆棧; 傳遞參數(shù)的內(nèi)存棧由調(diào)用者來(lái)維護(hù) (正因?yàn)槿绱丝蓪?shí)現(xiàn)變參函數(shù)) ;機(jī)器碼中的函數(shù)名只在 前面自動(dòng)加下劃線。 WinMain 函數(shù)的第一個(gè)和第二個(gè)參數(shù)都是HINSTANCE (實(shí)例句柄)類型。HINSTANCE中,H表示Handle,是“句柄”的意思。在 Windows編程中,句柄是一個(gè)應(yīng) 用程序用來(lái)識(shí)別某些資源、 狀態(tài)、 模塊等的數(shù)字。 由于句柄唯一標(biāo)識(shí)著對(duì)應(yīng)的資源、 狀態(tài)、 模塊等,因而使用句柄就是使(調(diào))用相應(yīng)的資源、狀態(tài)、模塊。當(dāng)應(yīng)用程序運(yùn)行多次時(shí)
14、,每一次都是應(yīng)用程序的“實(shí)例”。由于同一個(gè)應(yīng)用程序的所有實(shí)例都共享著應(yīng)用程序的資源,因而程序通過(guò)檢查hPrevI nsta nee參數(shù)就可確定自身的其他實(shí)例是否正在運(yùn)行。 WinMain 函數(shù)的第三個(gè)參數(shù) lpCmdLine 用來(lái)指定程序的命令行,其參數(shù)類型為 LPSTR。但在HelloMsg.c中,卻將其改為PSTR。這兩種數(shù)據(jù)類型都是合法的,也都是指向 字符串的指針類型。其中的 STR是“STRING,字符串”的含義,是指以0結(jié)尾的字符串, LP前綴表示“長(zhǎng)指針”,在Win32中它與“ P”前綴表示的“指針”含義相同。 WinMain 函數(shù)的第四個(gè)參數(shù) nShowCmd 用來(lái)指定程序最初顯
15、示的方式, 它可以是正 常、最大化或最小化來(lái)顯示程序窗口??v觀上述參數(shù)和類型名可以發(fā)現(xiàn)它們的命名規(guī)則:C/C+的類型名仍保留其小寫(xiě),但新的類型都是用大寫(xiě)字母來(lái)命名。參數(shù)名(變量名)都是采用“匈牙利表示法”的命名規(guī)則來(lái)定義的。它的主要方法是將變量名前后加上表示“類型”和“作用”的“前綴(小寫(xiě))”,而變量名本身由“狀態(tài)”、“屬性”和“含義”等幾個(gè)部分組成,每一個(gè)部分的名稱可以是全 稱,也可以是縮寫(xiě),但通常只有第一個(gè)字母是大寫(xiě)。例如,hPrevInstanee則是由前綴h (表示“句柄”類型)+狀態(tài)Prev (表示“以前的” )+屬性Instanee (表示 “實(shí)例”)組成的。1.1.4 Messa
16、geBox函數(shù)MessageBox是一個(gè) Win32 API函數(shù),用來(lái)彈出一個(gè)對(duì)話框窗口,顯示短信息。該函數(shù) 具有下列原型:int MessageBox( HWND hWnd LPCTSTR IpText LPCTSTR IpCaptior, UINT uType;其中,第一個(gè)參數(shù) hWnd用來(lái)指定父窗口句柄,即對(duì)話框所在的窗口句柄。第二、三個(gè)參 數(shù)分別用來(lái)指定顯示的消息內(nèi)容(IpText)和對(duì)話框窗口的標(biāo)題(IpCaption),最后一個(gè)參 數(shù)用來(lái)指定在對(duì)話框中顯示的預(yù)定義的按鈕和圖標(biāo)標(biāo)識(shí),它們是在winuser.h定義的一組以MB_開(kāi)始的常數(shù)組合。例如,下面是在HelloMsg.c中改變M
17、essageBox的第四個(gè)參數(shù)。#include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int nCmdShow)MessageBox (NULL, TEXT(Hello, World!), TEXT(Hello),MBCONQUESTION | MB_ABORTRETRYIGNORE); return 0 ;程序運(yùn)行后,結(jié)果如圖1.8所示??梢?jiàn),MB_ICONQUESTION 用來(lái)指定在對(duì)話框中顯示圖標(biāo),而 MB_ABORTRETRYIGNORE 用來(lái)指定“終止”、“重
18、試”和“忽略”按鈕, 類似這樣的預(yù)定義標(biāo)識(shí)還有很多,在以后討論到MFC中的CWnd:MessageBox函數(shù)時(shí)還要討論,故這里不再贅述。堿耳Hl味簟1CSW F在程序 HelloMsg.c中,調(diào)用 MessageBox的實(shí)參中還涉及 TEXT宏。在Windows編程中,TEXT宏是用來(lái)對(duì)UNICODE編 碼的字符串的支持。UNICODE是使用兩個(gè)字節(jié)表示一個(gè)字符,圖1.8第四個(gè)參數(shù)的作用宏等,在Visual C+中,這樣單字節(jié)的 ANSI字符和雙字節(jié)的“漢字”的表示就統(tǒng)一起來(lái) 了。在程序中使用 TEXT文本,無(wú)論在何 Windows環(huán)境下均可顯 示正確的內(nèi)容,而不會(huì)出現(xiàn)亂碼的情形。另外,還有_
19、TEXT和_T它們的作用是等同的。1.2窗口和消息MessageBox是通過(guò)創(chuàng)建的默認(rèn)窗口”來(lái)顯示簡(jiǎn)單的信息:窗口標(biāo)題、一行或多行文 本、圖標(biāo)和按鈕等。在 Windows環(huán)境中,一個(gè)“窗口”就是屏幕上的一個(gè)矩形區(qū)域,它接 收用戶的輸入,并以文本或圖形方式來(lái)顯示內(nèi)容。事實(shí)上,“窗口”就是用戶操作的區(qū)域界面,在編程中除創(chuàng)建等操作外,還要處理用戶輸入、窗口本身事件所產(chǎn)生的“消息”。1.2.1程序框架代碼為了能處理上述兩個(gè)部分的內(nèi)容:窗口創(chuàng)建和消息處理,Windows提供了相應(yīng)的程序框架,如下面的例子。HelloWi n.c#include LRESULT CALLBACK WndProc (HWND
20、, UINT, WPARAM, LPARAM); / 窗口過(guò)程int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)HWNDhwnd ;/窗口句柄MSGmsg ;/消息WNDCLASSwndclass ;/窗口類wndclass.style= CS_HREDRAW | CS_VREDRAW ;wndclass .l pfnWndProc=WndProc ;wndclass.cbClsExtra=0 ;wndclass.cbWndExtra=0 ;wndclas
21、s.hInstance=hInstance ;wndclass.hIcon=LoadIcon (NULL, IDI_APPLICATION);wndclass.hCursor=LoadCursor (NULL, IDC_ARROW);wndclass.hbrBackground=GetStockObject (WHITE_BRUSH);wndclass .l pszMenuName=NULL;wndclass .l pszClassName=HelloWin;/窗口類名if (!RegisterClass (&wndclass)/注冊(cè)窗口MessageBox (NULL,窗口注冊(cè)失??!, He
22、lloWin, 0);return 0 ;/創(chuàng)建窗口hwnd = CreateWindow (HelloWin,/ 窗口類名我的窗口 ,/窗口標(biāo)題WS_OVERLAPPEDWINDOW,/窗口樣式CW USEDEFAULT,/窗口最初的x位置CWJJSEDEFAULT,480,320,NULL,NULL, hlnstance, NULL);ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd);/窗口最初的y位置/窗口最初的x大小/窗口最初的y大小/父窗口句柄/窗口菜單句柄/應(yīng)用程序?qū)嵗浔?創(chuàng)建窗口的參數(shù)/ 顯示窗口/更新窗口,包括窗口的客戶區(qū)/進(jìn)入
23、消息循環(huán):當(dāng)從應(yīng)用程序消息隊(duì)列中檢取的消息是WM_QUIT時(shí),則退出循環(huán) while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ;/ 轉(zhuǎn)換某些鍵盤(pán)消息DispatchMessage (&msg) ;/ 將消息發(fā)送給窗口過(guò)程,這里是 WndProcreturn msg.wParam ;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)HDChdc;PAINTSTRUCTps;RECTrc;switch (message)
24、 case WM_CREATE:/窗口創(chuàng)建產(chǎn)生的消息return 0 ;case WM_PAINT:hdc= BeginPaint( hwnd, &ps );GetClientRect( hwnd, &rc );/ 獲取窗口客戶區(qū)大小DrawText( hdc, TEXT(Hello Windows!), -1, &rc,DT_SINGLELINE | DT_CENTER |DT_VCENTER );EndPaint( hwnd, &ps );return 0 ;case WM_DESTROY:/當(dāng)窗口關(guān)閉時(shí)產(chǎn)生的消息PostQuitMessage (0);return 0 ;return D
25、efWindowProc (hwnd, message, wParam, lParam);/執(zhí)行默認(rèn)的消息處理創(chuàng)建并運(yùn)行上述程序時(shí),先創(chuàng)建一個(gè)Ex_HelloWin “空工程”,然后再創(chuàng)建并添加新的源文件hellowin.c,輸入上述代碼,然后編連和運(yùn)行,結(jié)果如圖1.9所示(里面的框是加上去的,它的區(qū)域叫“客戶區(qū)”)。雖然與Ex_HelloMsg示例相比,Ex_HelloWin要復(fù)雜得多,但總可以將其分解成是兩 個(gè)基本函數(shù)的程序結(jié)構(gòu)。一個(gè)就是前面所討論的WinMain函數(shù),另一個(gè)是用戶定義的窗口過(guò)程函數(shù) WndProc 。窗口過(guò)程函數(shù) WndProc 用來(lái)接收和處理各種不同的消息。標(biāo)題欄客戶區(qū)
26、窗口邊框圖1.9 hellowin.c運(yùn)行結(jié)果1.2.2注冊(cè)窗口類在為程序創(chuàng)建窗口之前,必須首先調(diào)用創(chuàng)建RegisterClass注冊(cè)應(yīng)用程序的窗口類。該函數(shù)只要一個(gè)參數(shù),即一個(gè)指向類型為WNDCLASS的結(jié)構(gòu)指針。它包含了一個(gè)窗口的基本屬性,如窗口邊框、窗口標(biāo)題欄文字、窗口大小和位置、鼠標(biāo)、背景色、處理窗口消息 函數(shù)的名稱等。事實(shí)上,注冊(cè)的過(guò)程也就是將這些屬性告訴系統(tǒng),然后再調(diào)用CreateWindow函數(shù)創(chuàng)建出窗口。WNDCLASS結(jié)構(gòu)具有下列原型:typedef struct UINTStyle/窗口的風(fēng)格WNDPROClpfnWndProc/指定窗口的消息處理函數(shù)的窗口過(guò)程函數(shù)intc
27、bClsExtra/指定分配給窗口類結(jié)構(gòu)之后的額外字節(jié)數(shù)intcbWndExtra/指定分配給窗口實(shí)例之后的額外字節(jié)數(shù)HINSTANCEhln sta nee/指定窗口過(guò)程所對(duì)應(yīng)的實(shí)例句柄HICONhlc on;/指定窗口的圖標(biāo)HCURSORhCursorJ/指定窗口的鼠標(biāo)指針HBRUSHhbrBackgrou nd/指定窗口的背景畫(huà)刷LPCTSTRlpszMe nuNam;e/窗口的菜單資源名稱LPCTSTRlpszClassName/該窗口類的名稱 WNDCLASS, *PWNDCLASS;從中可以看出:該結(jié)構(gòu)有 10個(gè)域(成員),其中第一個(gè)域style表示窗口類的風(fēng)格,它 往往是由一些基
28、本的預(yù)定義風(fēng)格通過(guò)位的“或”操作(操作符位“| ”)組合而成的。例如,在 HelloWin.c 中,有:WNDCLASS wndclass ; wndclass.style wndclass .l pfnWndProc wndclass.cbCIsExtra wndclass.cbWndExtra/窗口類=CS_HREDRAW | CS_VREDRAW =WndProc ;=0 ;=0 ;wndclass.hInstance wndclass.hIcon wndclass.hCursor wndclass.hbrBackground wndclass.lpszMenuName wndclass
29、.lpszClassName= hInstance ;= LoadIcon (NULL, IDI_APPLICATION) ;= LoadCursor (NULL, IDC_ARROW) ;= GetStockObject (WHITE_BRUSH) ;= NULL;= HelloWin;/ 窗口類名可以看到,wndclass.style被設(shè)為CS_VREDRAW | CS_HREDRAW,表示只要窗口的高 度或?qū)挾劝l(fā)生變化,都會(huì)重畫(huà)整個(gè)窗口。第二個(gè)域IpfnWndProc的值為WndProc。表明該窗口類的消息處理函數(shù)是WndProc函數(shù)。這里,可簡(jiǎn)單直接地輸入消息處理(窗口過(guò)程)函數(shù)的函數(shù)
30、名即可。接下來(lái)的cbCIsExtra和cbWndExtra在大多數(shù)情況下都會(huì)設(shè)為 0。然后的hlnstanee成員, 給它的值是由 WinMain 傳來(lái)的應(yīng)用程序的實(shí)例句柄,表明該窗口與該實(shí)例是相關(guān)聯(lián)的。事 實(shí)上,只要是注冊(cè)窗口類,該成員的值始終是該程序的實(shí)例句柄。下面的hlcon,是要給這個(gè)窗口指定一個(gè)圖標(biāo),Loadlcon (NULL, IDI_APPLICATION)就是調(diào)用系統(tǒng)內(nèi)部預(yù)先定義好的標(biāo)識(shí)符為 lDC_APPLlCATlON 的圖標(biāo)作為該窗口的圖標(biāo)。 同樣, LoadCursor (NULL, IDC_ARROW) 就是調(diào)用預(yù)定義的箭型鼠標(biāo)指針。 hbrBackground 域
31、 用來(lái) 定義窗 口 的 背景 畫(huà)刷顏 色, 也 就是 該 窗 口 的 背景色 。 調(diào)用 GetStockObject (WHITE_BRUSH) 可以獲得系統(tǒng)內(nèi)部預(yù)先定義好的白色畫(huà)刷作為窗口的背景色。這里 LoadIcon、LoadCursor、GetStockObject 等都是 Windows 的 API 函數(shù),在程序中可直接 調(diào)用。lpszMenuName 域的值若為 NULL ,則表示該窗口將沒(méi)有菜單。否則,需要指定表示菜 單資源的字符串。WNDCLASS結(jié)構(gòu)的最后一個(gè)域IpszCIassName是要給這個(gè)窗口類起一個(gè)唯一的名稱, 因?yàn)?Windows 操作系統(tǒng)中有許許多多的窗口類,必
32、須用一個(gè)獨(dú)一無(wú)二的名稱來(lái)代表它們。 通常,可以用程序名來(lái)直接作為這個(gè)窗口類的名稱,它在創(chuàng)建窗口的CreateWindow函數(shù)中用到。1.2.3 創(chuàng)建和顯示窗口當(dāng)窗口類注冊(cè)完畢之后,并不會(huì)有窗口顯示出來(lái),因?yàn)樽?cè)的過(guò)程僅僅是為創(chuàng)建窗口 所做的準(zhǔn)備工作。 實(shí)際創(chuàng)建一個(gè)窗口是通過(guò)調(diào)用 CreateWindow函數(shù)完成的。窗口類中已經(jīng) 預(yù)先定義了窗口的一般屬性,而CreateWindow中的參數(shù)可以進(jìn)一步指定一個(gè)窗口的更具體的屬性,在HelloWin.c程序中,是用下列調(diào)用 CreateWindow函數(shù)的代碼來(lái)創(chuàng)建窗口的:hwnd = CreateWindow (HelloWin,/ 窗口類名,要與注
33、冊(cè)時(shí)指定的相同我的窗口 ,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,/ 窗口標(biāo)題/ 窗口樣式/ 窗口最初的 x 位置/ 窗口最初的 y 位置480,320,NULL,NULL, hInstance, NULL) ;/ 窗口最初的 x 大小 / 窗口最初的 y 大小/ 父窗口句柄/ 窗口菜單句柄/ 應(yīng)用程序?qū)嵗浔? 創(chuàng)建窗口的參數(shù)CreateWindow 函數(shù)的第一個(gè)參數(shù)是創(chuàng)建該窗口所使用的窗口類的名稱,注意這個(gè)名稱 應(yīng)與前面所注冊(cè)的窗口類的名稱一致。第三個(gè)參數(shù)為創(chuàng)建的窗口的風(fēng)格,它們通常是一些 預(yù)定義風(fēng)格的“ | ”組合。其中, WS_O
34、VERLAPPEDWINDOW 表示創(chuàng)建一個(gè)層疊式窗口, 有邊框、標(biāo)題欄、系統(tǒng)菜單、最大化和最小化按鈕等。CreateWindow函數(shù)后面的參數(shù)中,仍用到了該應(yīng)用程序的實(shí)例句柄hlnstanee。如果窗口創(chuàng)建成功,返回值是新窗口的句柄,否則返回 NULL 。窗口創(chuàng)建后,并不會(huì)在屏幕上顯 示出來(lái)。要能真正把窗口顯示在屏幕上,還得使用 ShowWindow 函數(shù),其原型如下:BOOL ShowWindow( HWND hWnd, int nCmdShow);其中,參數(shù) hWnd 指定要顯示得窗口的句柄, nCmdShow 表示窗口的顯示方式,這里指定 為從 WinMain 函數(shù)的 nCmdShow
35、 所傳遞而來(lái)的值。由于 ShowWindow 函數(shù)的執(zhí)行優(yōu)先級(jí)不高,所以當(dāng)系統(tǒng)正忙著執(zhí)行其他的任務(wù)時(shí),窗 口不會(huì)立即顯示出來(lái),此時(shí),調(diào)用 UpdateWindow 函數(shù)以可以立即顯示窗口。同時(shí),它將 會(huì)給窗口過(guò)程發(fā)出 WM_PAlNT 消息。1.2.4 消息和消息處理1消息循環(huán)在 Win32 編程中,消息循環(huán)是相當(dāng)重要的一個(gè)概念,看似很難,但使用起來(lái)卻是非常簡(jiǎn)單。在 WinMain 函數(shù)的最后,有下列代碼:while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ;/ 轉(zhuǎn)換某些鍵盤(pán)消息DispatehMessage (&msg)
36、;/ 將消息發(fā)送給窗口過(guò)程,這里是 WndProeWindows 應(yīng)用程序可以接收以各種形式輸入的信息,這包括鍵盤(pán)、鼠標(biāo)動(dòng)作、計(jì)時(shí)器 產(chǎn)生的消息,也可以是其他應(yīng)用程序發(fā)來(lái)的消息等。Windows 系統(tǒng)自動(dòng)監(jiān)控所有的輸入設(shè)備,并將其消息放入該應(yīng)用程序的消息隊(duì)列中。BOOL GetMessage( LPMSG HWND UlNTlpMsg,hWnd, wMsgFilterMin,GetMessage函數(shù)就是用來(lái)從應(yīng)用程序的消息隊(duì)列中按照先進(jìn)先出的原則將這些消息一 個(gè)個(gè)地取出來(lái),放進(jìn)一個(gè) MSG 結(jié)構(gòu)中去。它的原型如下:/指向一個(gè)MSG結(jié)構(gòu)的指針,用來(lái)保存消息/ 指定哪個(gè)窗口的消息將被獲取/ 指定獲
37、取的主消息值的最小值 精品UINTwMsgFilterMax/ 指定獲取的主消息值的最大值);GetMessage 函數(shù)用來(lái)將獲取的消息復(fù)制到一個(gè)MSG 結(jié)構(gòu)中。如果隊(duì)列中沒(méi)有任何消息,該函數(shù)將一直空閑直到隊(duì)列中又有消息時(shí)再返回。如果隊(duì)列中已有消息,它將取出一 個(gè)后返回。 MSG 結(jié)構(gòu)包含 Windows 消息的完整信息,其定義如下:HWNDhwnd;UINTmessag;e/WPARAMwParam;LPARAMlParam;DWORDtime;/POINTpt; MSG, *PMSG;typedef struct / 消息發(fā)向的窗口的句柄主消息的標(biāo)識(shí)值/ 附消息值,其具體含義依賴于主消息值
38、/ 附消息值,其具體含義依賴于主消息值 消息放入消息隊(duì)列中的時(shí)間/ 消息放入消息隊(duì)列時(shí)的鼠標(biāo)坐標(biāo)上述結(jié)構(gòu)中的主消息表明了消息的類型,例如,是鍵盤(pán)消息還是鼠標(biāo)消息等,附消息 的含義則依賴于主消息值,例如,如果主消息是鍵盤(pán)消息,那么附消息中則存儲(chǔ)了是鍵盤(pán) 的哪個(gè)具體鍵的信息。事實(shí)上,GetMessage函數(shù)還可以過(guò)濾消息,它的第二個(gè)參數(shù)是用來(lái)指定從哪個(gè)窗口的 消息隊(duì)列中獲取消息,其他窗口的消息將被過(guò)濾掉。如果該參數(shù)為 NULL ,則 GetMessage 從該應(yīng)用程序線程的所有窗口的消息隊(duì)列中獲取消息。第三個(gè)和第四個(gè)參數(shù)是用來(lái)過(guò)濾 MSG 結(jié)構(gòu)中主消息值的, 主消息值在 wMsgFilterMin
39、 和 wMsgFilterMax 之外的消息將被過(guò)濾 掉。如果這兩個(gè)參數(shù)為 0,則表示接收所有消息。特別地,當(dāng)且僅當(dāng)GetMessage函數(shù)在獲取到 WM_QUIT消息后,將返回0值,于是程 序退出消息循環(huán)。Tran slateMessage函數(shù)的作用是把虛擬鍵消息轉(zhuǎn)換到字符消息,以滿足鍵盤(pán)輸入的需要。DispatchMessage函數(shù)所完成的工作是把當(dāng)前的消息發(fā)送到對(duì)應(yīng)的窗口過(guò)程中去。2消息處理用于消息處理的函數(shù)又叫窗口過(guò)程,在這個(gè)函數(shù)中,不同的消息將用switch語(yǔ)句分配到不同的處理程序中去。 Windows 的消息處理函數(shù)都有一個(gè)確定的統(tǒng)一方式,即這種函數(shù) 的參數(shù)個(gè)數(shù)和類型以及其返回值的
40、類型都有明確的規(guī)定。在HelloWi n.c中,Win Proc函數(shù)明確處理了 3個(gè)消息,分別是 WM_CREATE (創(chuàng)建窗口消息)、WM_PAINT (窗口重畫(huà)消息)、WM_DESTROY (銷毀窗口消息)。事實(shí)上, 應(yīng)用程序發(fā)送到窗口的消息遠(yuǎn)遠(yuǎn)不止以上這幾條, 像 WM_SIZE 、 WM_MINIMIZE 、WM_MOVE 等這樣經(jīng)常使用的消息就有好幾十條。 為了減輕編程的負(fù)擔(dān), Windows 的 API 提供了 DefWindowProc 函數(shù)來(lái)處理這些最常用的消息,調(diào)用這個(gè)函數(shù)后, 這些消息將按照系統(tǒng)默認(rèn)的方式得到處理。因此,在 switch 語(yǔ)句中,只需明確處理那些有必要進(jìn)行特
41、別響應(yīng)的消息,把其余的消 息交給 DefWindowProc 函數(shù)來(lái)處理, 即將消息的控制交由 Windows 進(jìn)行默認(rèn)處理, 這是一 種明智的選擇。3結(jié)束消息循環(huán)當(dāng)用戶按 Alt+F4 鍵或單擊窗口右上角的“退出”按鈕,系統(tǒng)就向應(yīng)用程序發(fā)送一條 WM_DESTROY的消息。在處理此消息時(shí),調(diào)用了PostQuitMessage函數(shù),該函數(shù)會(huì)向窗口的消息隊(duì)列中發(fā)送一條 WM_QUIT消息。在消息循環(huán)中,GetMessage函數(shù)一旦檢索到這條 消息,就會(huì)返回FALSE,從而結(jié)束消息循環(huán),隨后程序也結(jié)束。1.2.5 WM_PAINT 消息WM_PAINT 是 Win32 的圖形和文本編程中經(jīng)常使用到
42、的消息。當(dāng)窗口客戶區(qū)的一部 分或全部變成“無(wú)效”時(shí),則必須 “刷新”重繪,此時(shí)將向程序發(fā)出此消息。那么客戶區(qū)怎么會(huì)“無(wú)效”呢?在最初窗口創(chuàng)建時(shí),整個(gè)客戶區(qū)都是“無(wú)效”的,因 為窗口上還沒(méi)有繪制任何東西。所以,在創(chuàng)建窗口時(shí),會(huì)發(fā)出第一個(gè)WM_PAINT 消息。在HelloWin.c程序中,由于在注冊(cè)窗口時(shí),指定了 wndclass.stylel的風(fēng)格為CS_VREDRAW 和CS_HREDRAW,這表明只要窗口的高度或?qū)挾劝l(fā)生變化,就將使整個(gè)窗口“無(wú)效”,從而發(fā)出 WM_PAINT 消息,使得系統(tǒng)重畫(huà)整個(gè)窗口。當(dāng)窗口最小化再恢復(fù)為以前的大小時(shí), Windows 將令窗口 “無(wú)效”,并發(fā)出 WM_
43、PAINT 消息使系統(tǒng)重畫(huà)整個(gè)窗口。當(dāng)窗口移至與另一窗口有重疊被遮擋時(shí),Windows 也將窗口視為“無(wú)效”,發(fā)出 WM_PAINT 消息以便刷新窗口。在窗口過(guò)程函數(shù) WndProc中,WM_PAINT消息處理通??偸菑?Beg in Pai nt函數(shù)開(kāi)始, 而從En dPai nt函數(shù)結(jié)束。Beg in Pai nt函數(shù)用來(lái)返回指定窗口句柄的設(shè)備描述表句柄,設(shè)備 描述表用來(lái)將程序與計(jì)算機(jī)外部輸出設(shè)備連接起來(lái)。hdc 定義的是句柄 HDC 變量, DrawText 等 GDI 函數(shù)都需要通過(guò)這樣的 HDC 句柄來(lái) 繪制圖形和文本。 EndPaint 用來(lái)釋放設(shè)備描述表句柄,并使先前無(wú)效區(qū)域變?yōu)?/p>
44、有效,從而 使 Windows 不再發(fā)送 WM_PAINT 消息。 PAINTSTRUCT 是“繪圖信息結(jié)構(gòu)” , BeginPaint 和 EndPaint 函數(shù)都需要 PAINTSTRUCT 結(jié)構(gòu)變量作為自己的參數(shù)。需要說(shuō)明的是, BeginPaint 和 EndPaint 函數(shù)必須成對(duì)出現(xiàn),所有 GDI 函數(shù)的調(diào)用也應(yīng)在這兩個(gè)函數(shù)之間進(jìn) 行。DrawText 函數(shù)用來(lái)在參考矩形內(nèi)使用指定的格式來(lái)繪制文本,它的函數(shù)原型如下:int DrawText(HDChDC,/ 繪制設(shè)備的句柄LPCTSTRlpString,/要繪制的文本intnCount,/文本的字符個(gè)數(shù)LPRECTlpRec,t/
45、參考矩形UINT );uFormat/文本繪制格式其中,當(dāng) nCount為-1時(shí),表示 lpString 指定的是以“ 0 ”為結(jié)尾的字符串,并自動(dòng)計(jì)算該字符串的字符個(gè)數(shù)。lpRect是一個(gè)指向RECT類型的“矩形”結(jié)構(gòu)指針,該“矩形”結(jié) 構(gòu)含有 left、top、right 和 bottom 4 個(gè) LONG 域。為了能在窗口客戶區(qū)中間繪制文本,該函 數(shù)的lpRect被填為RECT變量rc的指針,它通過(guò)調(diào)用 GetClientRect函數(shù),獲取hwnd窗口 精品的客戶區(qū)大小。同時(shí),指定 uFormat 格式為 DT_SINGLELINE (單行輸出) 、DT_CENTER 水平居中)和 DT
46、_VCENTER (垂直居中) 。精品1.2.6 Windows基本數(shù)據(jù)類型在前面示例和函數(shù)原型中,有一些奇怪”的數(shù)據(jù)類型,如前面的HINSTANCE 和LPSTR等,事實(shí)上,很多這樣的數(shù)據(jù)類型只是一些基本數(shù)據(jù)類型的別名,以方便不同風(fēng)格 的程序員使用。表1.1列出了一些在 Windows編程中常用的基本數(shù)據(jù)類型;表1.2列出了常用的預(yù)定義句柄,它們的類型均為void *,即一個(gè)32位指針。表1.1 Windows編程中常用的基本數(shù)據(jù)類型Windows所用的數(shù)據(jù)類型對(duì)應(yīng)的基本數(shù)據(jù)類型說(shuō)明BOOLbool布爾值BSTRunsigned short*32位字符指針BYTEunsigned char8
47、位無(wú)符號(hào)整數(shù)COLORREFunsigned long用作顏色值的32位值DWORDunsigned long32位無(wú)符號(hào)整數(shù),段地址和相關(guān)的偏移地址LONGlong32位帶符號(hào)整數(shù)LPARAMlong作為參數(shù)傳遞給窗口過(guò)程或回調(diào)函數(shù)的32位值LPCSTRconst char*指向字符串常量的32位指針LPSTRchar *指向字符串的32位指針LPVOIDvoid *指向未定義類型的32位指針LRESULTlong來(lái)自窗口過(guò)程或回調(diào)函數(shù)的32位返回值UINTunsigned int32位無(wú)符號(hào)整數(shù)WORDunsigned short16位無(wú)符號(hào)整數(shù)WPARAMunsigned int當(dāng)做參數(shù)
48、傳遞給窗口過(guò)程或回調(diào)函數(shù)的32位值說(shuō)明:這些基本數(shù)據(jù)類型都是用大寫(xiě)字符來(lái)表示的,以與一般C/C+基本數(shù)據(jù)類型相區(qū)別。若數(shù)據(jù)類型的前綴是 P或LP,則表示該類型是一個(gè)指針或長(zhǎng)指針數(shù)據(jù)類型;若數(shù)據(jù)類型的前綴是U,則表示是無(wú)符號(hào)數(shù)據(jù)類型。Windows還提供一些宏來(lái)處理上述基本數(shù)據(jù)類型。例如,LOBYTE和HIBYTE分別用來(lái)獲取16位數(shù)值中的低位和高位字節(jié),LOWORD和HIWORD分別用來(lái)獲取32位數(shù)值中的低位字和高位字,MAKEWORD是將兩個(gè)16位無(wú)符號(hào)值結(jié)合成一個(gè)32位無(wú)符號(hào)值。表1.2 Windows編程中常用的句柄類型句柄類型說(shuō)明HBITMAP保存位圖信息的內(nèi)存域的句柄HBRUSH畫(huà)刷
49、句柄續(xù)表句柄類型說(shuō)明HCURSOR鼠標(biāo)光標(biāo)句柄HDC設(shè)備描述表句柄HFONT字體句柄HICON圖標(biāo)句柄HINSTANCE應(yīng)用程序的實(shí)例句柄HMENU菜單句柄HPALETTE顏色調(diào)色板句柄HPEN在設(shè)備上畫(huà)圖時(shí)用于指明線型的筆的句柄HWND窗口句柄1.3 C+ 的“類”事實(shí)上,前面的Ex_HelloMsg和Ex_HelloWin都是基于 Win32 API的C/C+應(yīng)用程序。 顯然,隨著應(yīng)用程序的復(fù)雜性增加,C/C+應(yīng)用程序代碼也必然變得復(fù)雜。為了簡(jiǎn)化上述編程,Visual C+ 設(shè)計(jì)了一套基礎(chǔ)類庫(kù)( Microsoft Foundation Class Library,MFC)。MFC 把 W
50、indows編程規(guī)范中的大多數(shù)內(nèi)容封裝成為各種類,使程序員從繁雜的編程中解脫出來(lái), 提高了編程和代碼效率。那么,什么是“類”呢?這里就先來(lái)討論它。1.3.1類和對(duì)象1 類的定義如同C語(yǔ)言的“結(jié)構(gòu)”類型,“類”也是一種復(fù)合的數(shù)據(jù)類型,只不過(guò)要更為復(fù)雜一 些。在C+中,一個(gè)獨(dú)立“類”的聲明格式一般如下:class 類名/聲明部分private:私有型數(shù)據(jù)和函數(shù)public:公有型數(shù)據(jù)和函數(shù)protected:保護(hù)型數(shù)據(jù)和函數(shù);各個(gè)成員函數(shù)的實(shí)現(xiàn)/實(shí)現(xiàn)部分其中,class是類聲明的關(guān)鍵字,class的后面是要聲明的類名。類中的數(shù)據(jù)和函數(shù)都是類的 成員,分別稱為數(shù)據(jù)成員和成員函數(shù)。數(shù)據(jù)成員用來(lái)描述類狀
51、態(tài)等的屬性,由于數(shù)據(jù)成員 常用變量來(lái)定義,所以有時(shí)又將這樣的數(shù)據(jù)成員稱為成員變量。成員函數(shù)是用來(lái)對(duì)數(shù)據(jù)成 員進(jìn)行操作的,又稱為方法。注意:類體中最后一個(gè)花括號(hào)后面的分號(hào)“;”不能省略。類中關(guān)鍵字public、private和protected聲明了類中的成員與類外之間的關(guān)系,稱為訪 問(wèn)權(quán)限。對(duì)于public成員來(lái)說(shuō),它們是公有的,可以在類外訪問(wèn)。對(duì)于private成員來(lái)說(shuō),它們是私有的,不能在類外訪問(wèn),數(shù)據(jù)成員只能由類中的函數(shù)所使用,成員函數(shù)只允許在 類中調(diào)用。而對(duì)于 protected成員來(lái)說(shuō),它們是受保護(hù)的,具有半公開(kāi)性質(zhì),可在類中或其 子類中訪問(wèn)(后面還會(huì)討論)。成員函數(shù)既可以在類中進(jìn)行
52、定義,也可先在類中聲明函數(shù)原型,然后在類外定義,這 種定義又稱為成員函數(shù)的實(shí)現(xiàn)。需要說(shuō)明的是,成員函數(shù)在類外實(shí)現(xiàn)時(shí),必須用作用域運(yùn) 算符“::”來(lái)告知編譯系統(tǒng)該函數(shù)所屬的類。即::( )函一 數(shù)體例如,下面的類的定義示例代碼:class CStuscorepublic:float Average(void); char * getName() return strName;char * getNo()return strStuNO;private:char strName12;char strStuNO9; private:float fScore3;float CStuscoreAverag
53、e(void)/求平均成績(jī):在類中聲明/獲取姓名:直接在類中完成/獲取學(xué)號(hào):直接在類中完成/姓名/學(xué)號(hào)/三門(mén)課程成績(jī)/在類體外部定義return (float)(fScore0 + fScore1 + fScore2)/3.0);本例中用關(guān)鍵詞 class聲明了名為 CStuscore的類。在類的聲明中,描述學(xué)生的姓名、 學(xué)號(hào)與三門(mén)課程成績(jī)的數(shù)據(jù)strName、strStuNo、fScore用private定義為私有數(shù)據(jù)成員。這表明數(shù)據(jù)成員strName、strStuNo、fScore只能在類中使用,而不能在類外使用。對(duì)學(xué)生成績(jī)信息進(jìn)行處理的函數(shù)Average、getName和getNo用關(guān)鍵
54、詞public聲明成公有成員函數(shù),這樣就可在外部程序中通過(guò)getName和getNo函數(shù)分別來(lái)獲取學(xué)生姓名和學(xué)號(hào)數(shù)據(jù),通過(guò) Average 函數(shù)獲取學(xué)生的平均成績(jī)??梢?jiàn),類中的私有數(shù)據(jù)成員只能通過(guò)公 有接口函數(shù)(像getName和getNo函數(shù))來(lái)訪問(wèn),從而保證數(shù)據(jù)的安全性。類CStuscore中,成員函數(shù)getName和getNo的聲明和定義是在類體中同時(shí)進(jìn)行的,而函數(shù)Average是在類體中聲明,在類體外實(shí)現(xiàn)的,注意函數(shù)Average實(shí)現(xiàn)中函數(shù)名前面一定 要用域作用符“ :”指明該函數(shù)所屬的類。習(xí)慣上,往往將類的聲明和實(shí)現(xiàn)分開(kāi)來(lái)編寫(xiě)代碼,并將類的聲明保存在.h文件中,而將類的實(shí)現(xiàn)保存在同名的.cpp文件中,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《夏洛的網(wǎng)》講義
- 新視野大學(xué)英語(yǔ)某中學(xué)譯英答案
- 河北省保定市清苑區(qū)2023-2024學(xué)年八年級(jí)上冊(cè)1月期末物理模擬試題(附答案)
- 農(nóng)貿(mào)市場(chǎng)塑料垃圾袋配送方案
- 培訓(xùn)心得體會(huì)課件
- 城市排水系統(tǒng)防滲管道施工方案
- 遠(yuǎn)程教學(xué)技術(shù)支持方案
- 身邊的安全人
- 零售業(yè)疫情防控方案及應(yīng)急預(yù)案
- 保險(xiǎn)培訓(xùn)講師個(gè)人介紹
- 急救小常識(shí)醫(yī)療PPT模板
- 工程項(xiàng)目管理-英文課件-ProjectProcurement.ppt
- 鋼管束組合結(jié)構(gòu)體系簡(jiǎn)介ppt課件
- 土壓平衡頂管施工工藝工法(給排水管道施工,附施工圖)
- 鹽堿地改良項(xiàng)目建議書(shū)范文
- 現(xiàn)代密碼學(xué)清華大學(xué)楊波著部分習(xí)題答案
- 房地產(chǎn)組織架構(gòu)圖
- 停線管理規(guī)定
- 《我和小姐姐克拉拉》閱讀題及答案(一)
- 大型展會(huì)對(duì)城市會(huì)展業(yè)發(fā)展影響文獻(xiàn)綜述會(huì)展專業(yè)
- 鄉(xiāng)鎮(zhèn)結(jié)核病防治工作職責(zé)
評(píng)論
0/150
提交評(píng)論