版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章簡(jiǎn)單的Windows程序設(shè)計(jì)(1)基本概念2.1VisualC++概述Visualstdio是微軟公司提供的專(zhuān)門(mén)用于開(kāi)發(fā)Windows應(yīng)用程序的集成開(kāi)發(fā)環(huán)境。從VisualStudio2002開(kāi)始,Visualstdio就引入了一種新的計(jì)算平臺(tái)——Microsoft.NET。Visualstdio.NET是一種支持多種語(yǔ)言的應(yīng)用程序開(kāi)發(fā)平臺(tái),在Visualstdio.NET中可以使用VB.NET、C#.NET、VC++.NET等語(yǔ)言開(kāi)發(fā)程序,甚至你可以用其中一種語(yǔ)言開(kāi)發(fā)應(yīng)用程序的一部分,用另外的語(yǔ)言開(kāi)發(fā)程序的其他部分。VisualC++是VisualStudio中的重要一員,通常簡(jiǎn)稱(chēng)為VC。VC盡管是屬于VS中的一個(gè)工具,但實(shí)際上VC的發(fā)布要早于VS。VisualC++最初的幾個(gè)版本發(fā)布時(shí)還沒(méi)有VisualStudio,是與VisualBasic等并列的獨(dú)立開(kāi)發(fā)工具,后來(lái)微軟將它們整合在一起才形成了VisualStudio。從問(wèn)世至今,VS已推出了多個(gè)版本,我們將使用較新的VS2017作為例題開(kāi)發(fā)工具。2.1.1使用VisualC++開(kāi)發(fā)控制臺(tái)應(yīng)用程序VC++2017是不能單獨(dú)編譯一個(gè).CPP或者一個(gè).c文件的,它們必須依存于某一個(gè)“項(xiàng)目”(Project),因此,在編寫(xiě)程序代碼之前必須要先創(chuàng)建一個(gè)項(xiàng)目。創(chuàng)建項(xiàng)目有的方法有多種,可以通過(guò)點(diǎn)擊VS主窗口的菜單命令“文件”→“新建”→“項(xiàng)目”,也可以通過(guò)點(diǎn)擊VS主窗口工具欄的“新建項(xiàng)目”按鈕,還可以直接點(diǎn)擊起始頁(yè)面中“新建項(xiàng)目”一欄的“創(chuàng)建新項(xiàng)目...”?!靶陆?xiàng)目對(duì)話(huà)框”是用戶(hù)進(jìn)行項(xiàng)目類(lèi)型選擇、項(xiàng)目名稱(chēng)輸入和項(xiàng)目存儲(chǔ)位置輸入等的交互界面。在這里我們要?jiǎng)?chuàng)建的是Windows控制臺(tái)應(yīng)用程序,因此要選擇的程序模板是“Windows控制臺(tái)應(yīng)用程序”。代碼編輯器窗口將代碼編輯器中的代碼改寫(xiě)為如下代碼,然后點(diǎn)擊菜單“調(diào)試”→“開(kāi)始執(zhí)行(不調(diào)試)”:#include"pch.h"#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld!\n";}2.1.2創(chuàng)建圖形界面應(yīng)用程序使用MicrosoftVisualstdio中的任何一種語(yǔ)言都既可以開(kāi)發(fā)字符界面的控制臺(tái)應(yīng)用程序,也可以開(kāi)發(fā)具有圖形界面的Windows應(yīng)用程序。在使用VisualC++開(kāi)發(fā)具有圖形用戶(hù)界面的Windows應(yīng)用程序可以采用以下三種方法之一。(1)使用WindowsAPI函數(shù)(2)使用MFC(3)使用VisualC++.NET我們主要學(xué)習(xí)使用VisualC++創(chuàng)建基于MFC的對(duì)話(huà)框應(yīng)用程序相關(guān)的基本概念和基本方法。2.2VisualC++的數(shù)據(jù)類(lèi)型在使用VisualC++編寫(xiě)Windows程序時(shí),除了可以直接使用標(biāo)準(zhǔn)C++中的數(shù)據(jù)類(lèi)型外,為了提高程序的可讀性,VisualC++還定義了一些自己特有的數(shù)據(jù)類(lèi)型,這些數(shù)據(jù)類(lèi)型大都是標(biāo)準(zhǔn)C++中的數(shù)據(jù)類(lèi)型的重新定義。數(shù)據(jù)類(lèi)型對(duì)應(yīng)的基本數(shù)據(jù)類(lèi)型說(shuō)明BOOLbool布爾值BSTRunsignedshort*16位字符指針BYTEunsigned
char8位無(wú)符號(hào)整數(shù)DWORDunsignedlong32位無(wú)符號(hào)整數(shù),段地址和相關(guān)的偏移地址LONGlong32位帶符號(hào)整數(shù)LPARAMlong作為參數(shù)傳遞給窗口過(guò)程或回調(diào)函數(shù)的32位值LPCSTRconstchar*指向字符串常量的32位指針LPSTRchar*指向字符串的32位指針LPVOIDvoid*指向未定義的類(lèi)型的32位指針UNITunsignedint32位無(wú)符號(hào)整數(shù)WORDunsignedshort16位無(wú)符號(hào)整數(shù)WPARAMunsigned
int當(dāng)作參數(shù)傳遞給窗口過(guò)程或回調(diào)函數(shù)的32位值VC++中的數(shù)據(jù)類(lèi)型都是以大寫(xiě)字符出現(xiàn)的,這主要是為了與標(biāo)準(zhǔn)C++的基本數(shù)據(jù)類(lèi)型相區(qū)別。VC++中的數(shù)據(jù)類(lèi)型的命名也是有規(guī)律的,從數(shù)據(jù)類(lèi)型的名字基本可以看出數(shù)據(jù)類(lèi)型的意義。指針類(lèi)型的命令方式一般是在其指向的數(shù)據(jù)類(lèi)型前加“LP”或“P”,比如指向DWORD的指針類(lèi)型為“LPDWORD”和“PDWORD”;無(wú)符號(hào)類(lèi)型一般是以“U”開(kāi)頭,比如“INT”是符號(hào)類(lèi)型,“UINT”是無(wú)符號(hào)類(lèi)型。VC++還提供一些宏來(lái)處理基本數(shù)據(jù)類(lèi)型:LOBYTE和HIBYTE這兩個(gè)宏分別用來(lái)獲取16位數(shù)值中的低位和高位字節(jié);LOWORD和HIWORD分別用來(lái)獲取32位數(shù)值中的低16位和高16位字;MAKEWORD則是將兩個(gè)16位無(wú)符號(hào)數(shù)合成一個(gè)32位無(wú)符號(hào)數(shù),等等。字符串類(lèi)型字符串類(lèi)型CString本質(zhì)上是VC++提供的一個(gè)字符串類(lèi)。它提供了很多非常有用的操作和成員函數(shù),使用CString可以方便地對(duì)字符串進(jìn)行處理。例如,你可以利用如下方法連接字符串:CStringgray("Gray");CStringcat("Cat");CStringgraycat=gray+cat;
//執(zhí)行后graycat的值為"GrayCat"利用格式化可以把其它不是CString類(lèi)型的數(shù)據(jù)轉(zhuǎn)化為CString類(lèi)型例:把一個(gè)整數(shù)轉(zhuǎn)化成CString類(lèi)型
CStrings;
s.Format("%d",total);將char*轉(zhuǎn)化為CString則直接可采用如下方法:char*p="Thisisatest";CStrings=p;CStrings(p);或CStrings="Thisisatest";獲取存儲(chǔ)字符串的存儲(chǔ)區(qū)的指針(char*類(lèi)型),調(diào)用GetBuffer()則可,調(diào)用getlength()則可獲得字符串長(zhǎng)度。常用到的成員函數(shù)還包括:BOOLIsEmpty();//測(cè)試CString類(lèi)對(duì)象包含的字符串是否為空。voidEmpty();//使CString類(lèi)對(duì)象包含的字符串為空字符串。TCHARGetAt(intnIndex);//獲取字符串中指定位置(由nIndex指定)的字符。voidSetAt(intnIndex,TCHARch);//將字符串指定的位置處的字符設(shè)定為ch。CStringLeft(intnCount);//截取字符串左邊nCount長(zhǎng)度的字符串。CStringRight(intnCount);//截取字符串右邊nCount長(zhǎng)度的字符串。CString用于存儲(chǔ)字符串的存儲(chǔ)區(qū)是動(dòng)態(tài)分配的,即它支持動(dòng)態(tài)內(nèi)存分配,因此完全不用擔(dān)心CString的大小。另外,如果項(xiàng)目選擇使用UNICODE字符集,則CString對(duì)象將采用UNICODE字符,否則則使用ANSI字符。CString的聲明位于頭文件"atlstr.h"中,在程序中如果要使用CString,通常需要添加:#include<atlstr.h>。在MFC程序中,由于MFC的頭文件中已包含了該文件,因此一般不再需要在包含此文件。#include<iostream>#include<atlstr.h>usingnamespacestd;intmain(){ CStrings=L"HelloWorld!\n"; charss[30]; strcpy_s(ss,s.GetBuffer()); for(inti=0;ss[i]!=0;i++)cout<<ss[i]; char*p=s.GetBuffer(); cout<<endl; while(*p!=0){ cout<<*p;p++; } return0;}句柄類(lèi)型句柄類(lèi)型是Windows程序設(shè)計(jì)中的一種特殊數(shù)據(jù)類(lèi)型,是Windows用來(lái)唯一標(biāo)識(shí)應(yīng)用程序所建立或使用的對(duì)象的一個(gè)32位的無(wú)符號(hào)整數(shù)值。Windows程序中需要使用句柄標(biāo)識(shí)的對(duì)象包括應(yīng)用程序?qū)嵗?、窗口、位圖、內(nèi)存塊,文件、任務(wù)等。各種句柄類(lèi)型的命名方式一般都是在對(duì)象名前加“H”,比如位圖(BITMAP)對(duì)應(yīng)的句柄類(lèi)型為“HBITMAP”。句柄本質(zhì)上是一種指向指針的指針應(yīng)用程序啟動(dòng)后,該程序的各對(duì)象都是駐留在內(nèi)存的。理論上只要獲知對(duì)象所在的內(nèi)存首地址就能訪(fǎng)問(wèn)該對(duì)象。但為了優(yōu)化內(nèi)存,Windows內(nèi)存管理器會(huì)經(jīng)常移動(dòng)內(nèi)存中的對(duì)象,對(duì)象移動(dòng)就意味著其首地址的變化。為了能找到首地址經(jīng)常變化的對(duì)象,Windows系統(tǒng)為各應(yīng)用程序預(yù)留了一些內(nèi)存空間,專(zhuān)門(mén)用于登記各對(duì)象在內(nèi)存中的地址變化,這些預(yù)留空間的地址是不變的,句柄就是指這些預(yù)留空間的地址。Windows內(nèi)存管理器在移動(dòng)了對(duì)象后,會(huì)把對(duì)象的新地址保存于句柄對(duì)應(yīng)的存儲(chǔ)單元,這樣只需記住句柄地址就可以間接地知道對(duì)象在內(nèi)存中的位置了。句柄是在對(duì)象被裝載(Load)到內(nèi)存中時(shí)由系統(tǒng)分配的,當(dāng)系統(tǒng)卸載(Unload)該對(duì)象時(shí),句柄將被釋放給系統(tǒng)。Windows應(yīng)用程序幾乎總是通過(guò)調(diào)用一個(gè)WINDOWSAPI函數(shù)來(lái)獲得一個(gè)句柄,當(dāng)我們調(diào)用WINDOWSAPI函數(shù)獲取某個(gè)對(duì)象時(shí),API函數(shù)通常會(huì)給該對(duì)象分配一個(gè)確定的句柄,并將該句柄返回給應(yīng)用程序,然后應(yīng)用程可通過(guò)句柄來(lái)對(duì)該對(duì)象進(jìn)行操作。在WINDOWS編程中會(huì)用到大量的句柄,比如:HINSTANCE(實(shí)例句柄),HBITMAP(位圖句柄),HDC(設(shè)備描述表句柄),HICON(圖標(biāo)句柄)等。教材中的表2.3列出了一些常見(jiàn)的句柄類(lèi)型。除此之外,還有一個(gè)經(jīng)常用到的通用的句柄,就是HANDLE。2.3UNICODE字符集計(jì)算機(jī)最早使用的字符集是標(biāo)準(zhǔn)ASCII碼字符,但標(biāo)準(zhǔn)ASCII碼字符不能滿(mǎn)足中國(guó)、日本等亞洲國(guó)家的需求,于是各國(guó)便針對(duì)本國(guó)的語(yǔ)言文字制定了相應(yīng)的字符編碼標(biāo)準(zhǔn),如GB2312、BIG5、JIS等。這些字符編碼標(biāo)準(zhǔn)統(tǒng)稱(chēng)為ANSI編碼標(biāo)準(zhǔn)。通常,ANSI編碼標(biāo)準(zhǔn)都與ASCII碼兼容,并且字符數(shù)目要比ASCII字符多很多,因此必需使用多個(gè)字節(jié)來(lái)表示一個(gè)字符。ANSI字符集只規(guī)定了本國(guó)或地區(qū)所使用的語(yǔ)言的“字符”,并未考慮其他國(guó)家或地區(qū)的ANSI碼,導(dǎo)致各種ANSI編碼空間重疊,使得同一個(gè)二進(jìn)制編碼在使用不同的ANSI字符集的系統(tǒng)中被解釋成不同的符號(hào),這會(huì)導(dǎo)致使用不同ANSI編碼標(biāo)準(zhǔn)的系統(tǒng)交換信息時(shí)出現(xiàn)亂碼。Unicode組織聯(lián)合國(guó)際標(biāo)準(zhǔn)化組織,制定了Unicode字符集,其目的是將世界上絕大多數(shù)國(guó)家的文字符號(hào)都編入其中,并為每種語(yǔ)言的每個(gè)字符設(shè)定唯一的一個(gè)二進(jìn)制編碼,以滿(mǎn)足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本傳輸和處理的要求。Unicode是UniversalMultiple-OctetCodedCharacterSet的縮寫(xiě),中文翻譯為“通用多八位編碼字符集”。從1991年10月的Unicode1.0到2014年6月的Unicode7.0,Unicode總共已發(fā)布了20個(gè)版本。這20個(gè)版本從2.0開(kāi)始,都保是向后兼容的,也就是說(shuō),新版本只是增加字符,對(duì)原有字符不作任何改動(dòng)。Unicode編碼與UTFUnicode是一種多字節(jié)編碼方案,最初的版本采用兩個(gè)字節(jié)來(lái)表示一個(gè)字符,即UCS-2(UniversalCharacterSetcodedin2octets),其取值范圍為U+0000~U+FFFF。這個(gè)范圍中的每個(gè)數(shù)都稱(chēng)為一個(gè)碼位(codepoint),每個(gè)碼位對(duì)應(yīng)一個(gè)字符,UCS-2最多只能表示65536個(gè)字符。為了能表示更多的文字,后來(lái)的Unicode版本采用四個(gè)字節(jié)來(lái)表示代碼點(diǎn),即UCS-4,即它的范圍為U+00000000~U+7FFFFFFF,其中U+00000000~U+0000FFFF同UCS-2完全一樣,書(shū)寫(xiě)時(shí)通常也不寫(xiě)前面全0的兩個(gè)字節(jié),因此,UCS-4可以看成是在UCS-2基礎(chǔ)上又增加了一些4字節(jié)表示的字符。UCS-2和UCS-4只規(guī)定了代碼點(diǎn)和字符的對(duì)應(yīng)關(guān)系,但并沒(méi)有規(guī)定代碼點(diǎn)在計(jì)算機(jī)中如何存儲(chǔ)。比如,“計(jì)算機(jī)”三個(gè)漢字的Unicode代碼分別是U+8BA1、U+7B97和U+673A,那么在計(jì)算機(jī)中存儲(chǔ)這三個(gè)漢字時(shí)是存為“8BA17B97673A”還是“A18B977B3A67”?回答是都有可能,因?yàn)槿藗冊(cè)诎l(fā)明計(jì)算機(jī)之初,對(duì)雙字節(jié)數(shù)據(jù)的存儲(chǔ)就存在有兩種方案,大端順序(BigEndian)和小端順序(LittleEndian),前者,即字節(jié)存儲(chǔ)順序跟書(shū)寫(xiě)順序一致的是大端順序,后者稱(chēng)為小端順序。對(duì)Unicode編碼的字符,在具體現(xiàn)實(shí)時(shí)到底是采用大端順序還是小端順序,必須要給出一個(gè)規(guī)定。規(guī)定代碼點(diǎn)在計(jì)算機(jī)中存儲(chǔ)方式的是Unicode轉(zhuǎn)換格式(UnicodeTransformationFormat,UTF)編碼。事實(shí)上,提出UTF的原因并不只是“大端順序”和“小端順序”,還有一個(gè)原因是為了節(jié)省存儲(chǔ)空間。例如,英文字母字及英文標(biāo)點(diǎn)符號(hào)所對(duì)應(yīng)的Unicode編碼均是2個(gè)字節(jié),而且編碼第一字節(jié)的8位均為0,第二字節(jié)則是相應(yīng)得ASCII編碼,如果要使用原始Unicode編碼存儲(chǔ)一篇只包含純英文字符的文章,顯然就會(huì)造成比較大的浪費(fèi),因?yàn)橐话氲拇鎯?chǔ)空間存儲(chǔ)的都是字節(jié)0。目前常用的UTF編碼包括UTF-8、UTF-16、UTF-16BE(BigEndian)、UTF-16LE(LittleEndian)。VisualC++對(duì)ANSI和Unicode兩種字符集都支持,UTF-16是Windows默認(rèn)的Unicode編碼方式,默認(rèn)采用小端順序存儲(chǔ)。在一個(gè)已打開(kāi)的VC++項(xiàng)目中,可以修改它所使用的字符集。當(dāng)在程序中使用ANSI字符集時(shí),使用單字節(jié)字符(char類(lèi)型)數(shù)組存儲(chǔ)字符或字符串。如果在程序中使用Unicode字符集,則使用雙字節(jié)(16位)字符類(lèi)型,也稱(chēng)為寬字符類(lèi)型,其類(lèi)型符為wchar_t。無(wú)論項(xiàng)目使用的是ANSI字符集還是Unicode字符集,程序中用雙引號(hào)引起來(lái)的字符串常量都是單字節(jié)字符串,如果需要以雙字節(jié)字符存儲(chǔ),則需要在字符串前加上L。例:定義并初始化一個(gè)寬字符數(shù)組wchar_tStr[]=L"HelloWorld!";如果將L丟掉,寫(xiě)成wchar_tStr[]="HelloWorld!";程序編譯就不會(huì)通過(guò),會(huì)出現(xiàn)這樣的錯(cuò)誤提示:errorC2440:“初始化”:無(wú)法從“constchar[13]”轉(zhuǎn)換為“wchar_t[]”。在控制臺(tái)應(yīng)用程中,雙字節(jié)字符串與單字節(jié)字符串所使用的輸入輸出函數(shù)是不同的,輸入、輸出雙字節(jié)字符數(shù)據(jù)的函數(shù)分別是wscanf()和wprintf(),這兩個(gè)函數(shù)使用方法與scanf和printf類(lèi)似,請(qǐng)看下面的例子:wchar_ta[20];wscanf(L"%s",a);wprintf(L"%s\n",a);不僅僅是輸入輸出函數(shù),其它的一些字符串處理函數(shù),對(duì)寬體字符與單字節(jié)字符也是不同的。所有的Unicode字符串函數(shù)均以wcs開(kāi)頭,wcs是寬字符串的英文縮寫(xiě)。若要調(diào)用Unicode函數(shù)只需用前綴wcs來(lái)取代ANSI字符串函數(shù)的前綴str即可。不難看出,使用不同字符集時(shí)程序代碼的差別是比較大的。為了實(shí)現(xiàn)同樣的代碼既適用于寬體字符也適用于窄體字符,微軟將這兩套字符集的操作進(jìn)行了統(tǒng)一,對(duì)兩套字符集所使用的不同的關(guān)鍵字和庫(kù)函數(shù)名,都定義了一致的宏來(lái)替代,并使用條件編譯來(lái)控制。例如,無(wú)論使用那種字符集,字符類(lèi)型的定義符可使用TCHAR,因?yàn)槿绻褂谜w字符,則不定義_UNICODE宏,此時(shí)TCHAR就是char;如果使用寬體字符,則必須定義_UNICODE宏,這時(shí)TCHAR就是wchar_t。雙引號(hào)引起的字符串常量可寫(xiě)為_(kāi)T("HelloWorld!"),當(dāng)定義了_UNICODE宏,就相當(dāng)于L"HelloWorld!",沒(méi)定義則相當(dāng)于"HelloWorld!"。相關(guān)的字符串操作函數(shù)也都有對(duì)應(yīng)的替換函數(shù),比如,tcslen()函數(shù),在定義了_UNICODE宏時(shí)它就相當(dāng)于wcslen(),沒(méi)定義時(shí)則相當(dāng)于strlen()。這些宏的定義都在頭文件tchar.h中,因此,在程序前面需要有編譯預(yù)處理命令#include<tchar.h>。但在VisualC++中,通常是不需要手工添加的。由于大家大都只熟悉在ANSI字符集下的編程,因此本課程中的所有例題,均使用ANSI字符集,如果沒(méi)有特別說(shuō)明,相關(guān)代碼都是ANSI字符集下的寫(xiě)法。2.4MFC對(duì)話(huà)框應(yīng)用程序?qū)υ?huà)框(DialogBox)是一種特殊的窗口,主要功能是顯示輸出信息或者接收用戶(hù)輸入。對(duì)話(huà)框應(yīng)用程序是指主窗口樣式為“對(duì)話(huà)框”的應(yīng)用程序。對(duì)話(huà)框是一種簡(jiǎn)單的框架窗口,只有標(biāo)題欄和邊框,沒(méi)有菜單條、工具條和狀態(tài)條等,通常包含若干控件(Control),通這些控件,它可以接收用戶(hù)的輸入和選擇、向用戶(hù)顯示信息或者響應(yīng)用戶(hù)各種操作??丶侵复翱谏系木庉嬁颍‥ditControl)、命令按鈕(CommandButton)、下拉列表框(ListBox)等具有一定輸入輸出功能的小部件??丶举|(zhì)上也是一種簡(jiǎn)單窗口,只不過(guò)它必須存在于一個(gè)稱(chēng)為其父窗口的窗口內(nèi),在對(duì)話(huà)框中,對(duì)話(huà)框窗口就是其上各種控件的父窗口。使用VisualStdio的應(yīng)用程序向?qū)?,可以?chuàng)建一個(gè)簡(jiǎn)單的對(duì)話(huà)框應(yīng)用程序框架。2.4.1對(duì)話(huà)框應(yīng)用程序的創(chuàng)建2.4.2VisualC++2017開(kāi)發(fā)環(huán)境2.4.3MFC對(duì)話(huà)框應(yīng)用程序結(jié)構(gòu)MFC應(yīng)用程序向?qū)?huì)自動(dòng)生成三個(gè)類(lèi):CaboutDlg,ClxApp,ClxDlgClxApp是最重要的一個(gè)類(lèi),該類(lèi)派生于CWinApp類(lèi)。CWinApp是MFC的主應(yīng)用程序類(lèi),用于控制應(yīng)用程序的初始化、運(yùn)行和終止。MFC應(yīng)用程序向?qū)傻膽?yīng)用程序必須有且僅有一個(gè)從CWinApp派生的類(lèi)的對(duì)象,該對(duì)象在創(chuàng)建窗口之前構(gòu)造。ClxDlg類(lèi)的聲明如下:classClxDlg:publicCDialog它是CDialog類(lèi)的派生類(lèi),而CDialog又是CWnd的派生類(lèi),因此在CLXDlg類(lèi)的實(shí)現(xiàn)中,可以使用CDialog類(lèi)以及CWnd類(lèi)的所有方法。2.4.4設(shè)置對(duì)話(huà)框的屬性對(duì)話(huà)框窗口的外觀和行為特性可通過(guò)修改它的屬性值進(jìn)行改變。對(duì)話(huà)框窗口的屬性可以通過(guò)“屬性窗口”設(shè)置。要設(shè)置對(duì)話(huà)框?qū)傩裕紫却蜷_(kāi)“對(duì)話(huà)框資源編輯器”和“屬性窗口”,在新建項(xiàng)目中,這兩個(gè)窗口默認(rèn)是被打開(kāi)的。常用的對(duì)話(huà)框?qū)傩訧D:ID是應(yīng)用程序用來(lái)唯一標(biāo)識(shí)該對(duì)話(huà)框資源的標(biāo)識(shí)符,通常使用默認(rèn)值,也可以對(duì)它進(jìn)行修改。Caption:對(duì)話(huà)框的標(biāo)題,即對(duì)話(huà)框窗口標(biāo)題欄顯示的文字。默認(rèn)值為項(xiàng)目名稱(chēng),通常需要改為編程者認(rèn)為合適的文字。Font:在“屬性窗口”中該屬性的屬性值編輯框后有一按鈕,單擊此按鈕可彈出字體對(duì)話(huà)框,通過(guò)該對(duì)話(huà)框可選擇對(duì)話(huà)框窗口中控件上顯示的文字的字體、字形和字號(hào)。Border:用于確定窗口的邊框類(lèi)型,有四個(gè)值可選,None無(wú)邊框,不顯示標(biāo)題欄;Thin細(xì)邊框,也不顯示標(biāo)題欄;DialogFram,對(duì)話(huà)框邊框,程序運(yùn)行時(shí)窗口大小不可改變;Resizing,可調(diào)整尺寸,程序運(yùn)行時(shí)對(duì)話(huà)框窗口的大小可用鼠標(biāo)拖曳調(diào)整。Systemmenu:該屬性用于指定是否為對(duì)話(huà)框創(chuàng)建系統(tǒng)菜單。該屬性值為Bool類(lèi)型,缺省值為T(mén)rue。Minimizebox/Maximizebox:指定對(duì)話(huà)框是否有最小化/最大化按鈕,這兩個(gè)屬性值均為Bool類(lèi)型,缺省值為False。當(dāng)對(duì)話(huà)框無(wú)標(biāo)題欄時(shí),即Border屬性值為None或Thin時(shí),這兩個(gè)屬性無(wú)效。2.5Windows控件一個(gè)完整的控件包括兩部分,一是控件資源,即在其父窗口上繪出的控件的圖形,另一部分則是封裝有控件屬性和方法的控件類(lèi)。MFC提供了眾多的控件類(lèi),每一個(gè)類(lèi)都封裝一種控件。在對(duì)話(huà)框中創(chuàng)建控件后,需要為控件定義一個(gè)對(duì)應(yīng)控件類(lèi)的變量(對(duì)象)對(duì)它進(jìn)行控制。2.5.1創(chuàng)建控件控件的創(chuàng)建有靜態(tài)創(chuàng)建和動(dòng)態(tài)創(chuàng)建兩種。靜態(tài)創(chuàng)建是指使用對(duì)話(huà)框模板創(chuàng)建控件,并通過(guò)屬性窗口設(shè)置控件的屬性,當(dāng)打開(kāi)對(duì)話(huà)框時(shí),系統(tǒng)將自動(dòng)按預(yù)設(shè)的屬性創(chuàng)建控件。動(dòng)態(tài)創(chuàng)建則是指在程序的運(yùn)行中根據(jù)需要,通過(guò)預(yù)先定義的控件類(lèi)對(duì)象調(diào)用CreateWindow()函數(shù)創(chuàng)建控件。這里我們只簡(jiǎn)單介紹控件的靜態(tài)創(chuàng)建方法。第一步是打開(kāi)“對(duì)話(huà)框資源編輯器”和“工具箱”。第二步,在“工具箱”中單擊選中要?jiǎng)?chuàng)建的控件,然后將鼠標(biāo)移到“對(duì)話(huà)框資源編輯器”中的對(duì)話(huà)框上,按下鼠標(biāo)左鍵進(jìn)行拖曳,在相應(yīng)位置畫(huà)出控件。第三步,選中畫(huà)好的控件,通過(guò)鼠標(biāo)拖曳調(diào)整控件的大小和位置。第四步,使用“屬性窗口”設(shè)置控件的屬性。設(shè)置控件屬性每個(gè)控件都有一個(gè)屬性集,通過(guò)設(shè)置控件的屬性可以控制控件的外觀和行為等。對(duì)于靜態(tài)創(chuàng)建的控件,可以在對(duì)話(huà)框模板中打開(kāi)控件的屬性對(duì)話(huà)框直接設(shè)置控件的初始屬性值,也可以通過(guò)程序代碼動(dòng)態(tài)設(shè)置控件屬性值。控件的屬性往往有很多,但編程時(shí)并不是每個(gè)屬性的值都需要設(shè)置,多數(shù)情況下使用默認(rèn)值就可以了。不同類(lèi)型的控件有不同的屬性,但是也有一些屬性是共有的。屬性功能ID程序通過(guò)控件ID來(lái)訪(fǎng)問(wèn)一個(gè)控件??丶?chuàng)建后系統(tǒng)會(huì)自動(dòng)生成一個(gè)ID,可修改。除靜態(tài)控件外,同一程序中的控件的ID必須互不相同。Visible該屬性決定程序運(yùn)行時(shí)控件是否可見(jiàn)。屬性值是布爾型,默認(rèn)為T(mén)RUE。Disabled設(shè)置當(dāng)對(duì)話(huà)框在打開(kāi)時(shí)該控件是否不可用,也是布爾類(lèi)型,默認(rèn)為FALSE??丶?個(gè)常用的共有屬性靜態(tài)控件是指一組控件類(lèi)型,包括靜態(tài)文本(StaticText)控件、圖片控件(PictureControl)和組框(GroupBox),這些控件主要用來(lái)顯示文本或圖形信息。同一應(yīng)用程序中的多個(gè)靜態(tài)控件可以使用相同的ID,通常是它們的默認(rèn)ID——IDC_STATIC。如果需要在程序中區(qū)分和操縱各個(gè)不同的靜態(tài)控件,必須重新為它們分別指定一個(gè)唯一的ID。2.5.2常用控件靜態(tài)文本(StaticText)控件:要用來(lái)顯示文字,要顯示的文本串為該控件的屬性Caption的屬性值。該屬性值可以靜態(tài)修改,也可以在程序中用賦值語(yǔ)句動(dòng)態(tài)修改。編輯控件(EditControl):又稱(chēng)編輯框,通常與靜態(tài)文本控件一起使用,用于數(shù)據(jù)的輸入和輸出。通過(guò)設(shè)置不同的屬性值,編輯控件可以表現(xiàn)為多行編輯框、密碼編輯框、只讀編輯框等多種不同類(lèi)型的樣式。命令按鈕(Button):命令按鈕在被按下時(shí)會(huì)立即執(zhí)行某個(gè)命令。該命令所執(zhí)行的操作,是由命令按鈕的消息處理函數(shù)規(guī)定的。命令按鈕上顯示的文字是由Caption屬性指定的,通過(guò)修改Caption屬性的值可改變命令按鈕上顯示的文字。列表框(ListBox):常用來(lái)顯示類(lèi)型相同的一系列清單,如文件、字體和用戶(hù)等,適用于從若干數(shù)據(jù)項(xiàng)中進(jìn)行選擇的場(chǎng)合。列表框是一個(gè)矩形窗口,包含若干列表項(xiàng)(每項(xiàng)為一個(gè)字符串)??丶Q(chēng)MFC類(lèi)功能描述靜態(tài)控件CStatic用來(lái)顯示一些幾乎固定不變的文字或圖形按鈕CButton用來(lái)產(chǎn)生某些命令或改變某些選項(xiàng),包括單選按鈕、復(fù)選框和組框編輯框CEdit用于完成文本和數(shù)字的輸入和編輯列表框CListBox顯示一個(gè)列表,讓用戶(hù)從中選取一個(gè)或多個(gè)項(xiàng)組合框CComboBox是一個(gè)列表框和編輯框組合的控件滾動(dòng)條CScrollBar通過(guò)滾動(dòng)塊在滾動(dòng)條上的移動(dòng)和滾動(dòng)按鈕來(lái)改變某些量進(jìn)展條CProgressCtrl用來(lái)表示一個(gè)操作的進(jìn)度滑動(dòng)條CSliderCtrl通過(guò)滑動(dòng)塊的移動(dòng)來(lái)改變某些量,并帶有刻度指示日期時(shí)間控件CDateTimeCtrl用于選擇指定的日期和時(shí)間圖像列表CImageList一個(gè)具有相同大小的圖標(biāo)或位圖的集合標(biāo)簽控件CTabCtrl類(lèi)似于一個(gè)文件柜上的標(biāo)簽,使用它可以將一個(gè)窗口或?qū)υ?huà)框的相同區(qū)域定義為多個(gè)頁(yè)面2.6消息驅(qū)動(dòng)與消息映射Windows程序是通過(guò)操作系統(tǒng)發(fā)送的消息來(lái)處理用戶(hù)輸入的。所有Windows應(yīng)用程序都是消息驅(qū)動(dòng)的,消息處理是所有Windows應(yīng)用程序的核心部分。無(wú)論是系統(tǒng)產(chǎn)生的動(dòng)作或是應(yīng)用程序產(chǎn)生的動(dòng)作,都稱(chēng)為事件(Events)產(chǎn)生的消息(Message)。在應(yīng)用程序中,通過(guò)接收消息、分發(fā)消息、處理消息來(lái)和用戶(hù)進(jìn)行交互。系統(tǒng)中許多消息都經(jīng)過(guò)了嚴(yán)格的定義,并且適用于所有的應(yīng)用程序。2.6.1Windows的消息驅(qū)動(dòng)機(jī)制當(dāng)用戶(hù)單擊鼠標(biāo)、敲擊鍵盤(pán)或調(diào)整窗口大小時(shí),都將向?qū)?yīng)的窗口發(fā)送消息。每個(gè)消息都對(duì)應(yīng)于某個(gè)特定的事件,比如單擊鼠標(biāo)事件、雙擊鼠標(biāo)事件、鼠標(biāo)移動(dòng)事件等。Windows系統(tǒng)將應(yīng)用程序的輸入事件轉(zhuǎn)換為消息,并將消息發(fā)送給應(yīng)用程序的窗口,這些窗口通過(guò)調(diào)用消息處理函數(shù)來(lái)接收和處理這些消息。消息處理函數(shù)通常是窗口類(lèi)的成員函數(shù),編寫(xiě)消息處理函數(shù)是編寫(xiě)MFC應(yīng)用程序的主要任務(wù)。Windows消息大致可分為標(biāo)準(zhǔn)Windows消息、控件通知和命令消息等類(lèi)型。標(biāo)準(zhǔn)Windows消息通常由窗口類(lèi)處理,也就是說(shuō),這類(lèi)消息的處理函數(shù)通常是MFC窗口類(lèi)的成員函數(shù)。除WM_COMMAND消息外,所有以“WM_”為前綴的消息都是標(biāo)準(zhǔn)Windows消息。標(biāo)準(zhǔn)Windows消息都有默認(rèn)的的處理函數(shù),這些函數(shù)是CWnd類(lèi)的成員函數(shù),函數(shù)的名稱(chēng)都是“On”開(kāi)頭,后跟去掉“WM_”前綴的消息名稱(chēng)。命令消息包括來(lái)自菜單選項(xiàng)、工具欄按鈕、快捷鍵等用戶(hù)接口界面的WM_COMMAND通知消息,屬于用戶(hù)應(yīng)用程序自己定義的消息。通過(guò)消息映射機(jī)制,MFC框架把命令消息按一定的路徑分發(fā)給多種類(lèi)型的的對(duì)象來(lái)處理,這些對(duì)象包括文檔、文檔模板、應(yīng)用程序?qū)ο?、以及窗口和試圖等。能處理消息映射的類(lèi)必定是從MFC的CCmdTarget類(lèi)派生的。控件通知是由控件傳給父窗口的消息,但也有一個(gè)例外,當(dāng)用戶(hù)單擊“命令按鈕”按鈕控件時(shí),發(fā)出的BN_CLICKED消息將作為命令消息來(lái)處理。控件消息通常也是由MFC窗口類(lèi)處理的。2.6.2消息映射應(yīng)用程序運(yùn)行之后,當(dāng)控件的狀態(tài)發(fā)生改變時(shí),控件就會(huì)向其父窗口發(fā)送消息,這個(gè)消息稱(chēng)為“控件通知消息”。Windows是通過(guò)調(diào)用相應(yīng)消息處理函數(shù)來(lái)處理每一條消息的,編程時(shí),如何讓一條消息與其消息處理函數(shù)建立關(guān)聯(lián)關(guān)系呢?答案是通過(guò)消息映射。實(shí)現(xiàn)消息映射MFC是通過(guò)“類(lèi)向?qū)А睅椭鷮?shí)現(xiàn)消息映射的類(lèi)向?qū)?huì)在類(lèi)的定義(頭文件)里增加消息處理函數(shù)聲明,并添加一行聲明消息映射的宏DECLARE_MESSAGE_MAP。還會(huì)自動(dòng)在類(lèi)的實(shí)現(xiàn)文件(CPP文件)中添加消息映射的內(nèi)容,并添加消息處理函數(shù)的實(shí)現(xiàn)框架(具體功能代碼需要由編程者自己編寫(xiě))。一般情況下,消息處理函數(shù)的聲明和實(shí)現(xiàn)框架均是由MFC的類(lèi)向?qū)ё詣?dòng)添加和維護(hù)的。2.7使用控件變量訪(fǎng)問(wèn)控制控件控件的主要功能就是完成輸入輸出,也就是使用戶(hù)可以與程序交流信息;對(duì)話(huà)框中某個(gè)控件上輸入的數(shù)據(jù)可以保存到程序中的某個(gè)變量中,程序中某個(gè)變量的值也可以在對(duì)話(huà)框中的某個(gè)控件上輸出顯示,就是所謂控件與變量的數(shù)據(jù)交換。對(duì)話(huà)框內(nèi)的控件使用基于ID的變量映射來(lái)實(shí)現(xiàn)數(shù)據(jù)交換。通過(guò)類(lèi)向?qū)В覀兛梢詫⒁粋€(gè)變量和一個(gè)控件進(jìn)行關(guān)聯(lián)(映射)來(lái)實(shí)現(xiàn)數(shù)據(jù)交換,并且可設(shè)置其數(shù)據(jù)范圍。與控件關(guān)聯(lián)的變量通常都被稱(chēng)為“控件變量”。變量的類(lèi)別對(duì)命令按鈕來(lái)說(shuō)只有“Control”一種,但對(duì)于文本框則會(huì)有“Control”和“Value”兩種?!癈ontrol”類(lèi)別的控件變量在程序中代表控件本身,通過(guò)該類(lèi)變量可直接引用該控件類(lèi)的各種方法,并可以對(duì)控件的各種屬性直接操作。只有那些用于輸入數(shù)據(jù)和輸出數(shù)據(jù)的控件才能關(guān)聯(lián)“Value”類(lèi)別的控件變量,該類(lèi)控件變量只用于存放控件輸出或輸入的數(shù)據(jù)。對(duì)“Control”類(lèi)別的控件變量,其變量類(lèi)型只有一種,即該控件對(duì)應(yīng)的控件類(lèi)。而“Value”類(lèi)別的變量類(lèi)型則可以是任何該控件所能輸入或輸出的數(shù)據(jù)類(lèi)型,對(duì)文本框而言,數(shù)值類(lèi)型可以是CString、int、UINT、long、DWORD、float、double、BYTE、short、BOOL等。當(dāng)為一個(gè)控件添加了一個(gè)Value類(lèi)別的控件變量后,可以使用CWnd::UpdateData函數(shù)實(shí)現(xiàn)該控件變量與控件的數(shù)據(jù)交換。該函數(shù)是CWnd類(lèi)的成員函數(shù),其原型如下:BOOLUpdateData(BOOLbSaveAndValidate=TRUE);該函數(shù)只有一個(gè)BOOL類(lèi)型的參數(shù),調(diào)用UpdateData(FALSE)時(shí),數(shù)據(jù)由控件變量向控件傳輸,當(dāng)調(diào)用UpdateData(TRUE)或不帶參數(shù)的UpdateData時(shí),數(shù)據(jù)從控件向相關(guān)聯(lián)的成員變量復(fù)制。函數(shù)執(zhí)行成功則返回TRUE,否則返回FALSE。如果為一個(gè)控件添加了一個(gè)“Control”類(lèi)別的控件變量,也可以使用該“Control”類(lèi)型的變量調(diào)用控件類(lèi)從CWnd類(lèi)繼承來(lái)的成員函數(shù)SetWindowText和GetWindowText來(lái)改變或獲取控件顯示的文字。
2.8用戶(hù)自定義消息VisualC++允許用戶(hù)自己定義并發(fā)送消息,對(duì)自定義的消息用戶(hù)也必須為其添加消息處理函數(shù)。第一步,在resource.h或stdax.h或主對(duì)話(huà)框類(lèi)的定義文件中添加如下代碼定義一個(gè)自己的消息:#defineWM_MY_MESSAGE
WM_USER+100其中WM_USER是為了防止用戶(hù)定義的消息ID與系統(tǒng)的消息ID沖突VisualC++提供的一個(gè)宏,小于WM_USER的ID被系統(tǒng)使用,大于WM_USER的ID才可以被用戶(hù)使用。因此自定義消息一般是WM_USER+XXX的形式,XXX表示任意一個(gè)正整數(shù)。然后,打開(kāi)“MFC類(lèi)向?qū)А?,選擇要處理消息的對(duì)話(huà)框類(lèi),選中“消息”選項(xiàng)卡。單擊選項(xiàng)卡下部的“添加自定義消息”按鈕,彈出“添加自定義消息”對(duì)話(huà)框。分別填入自定義消息和消息處理函數(shù)的名稱(chēng),自定義消息一定是第一步中定義的消息,輸入自定義消息后,向?qū)?huì)自動(dòng)生成一個(gè)缺省的消息處理函數(shù)名,一般直接采用這個(gè)缺省的消息處理函數(shù)名則可,當(dāng)然也可以重新命名該函數(shù)。單擊確定返回“MFC類(lèi)向?qū)А?,這時(shí)在現(xiàn)有處理程序一列發(fā)現(xiàn)剛添加的自定義消息及消息處理函數(shù)。除了函數(shù)實(shí)現(xiàn)代碼外,類(lèi)向?qū)н€在消息處理函數(shù)所在的類(lèi)的頭文件中添加了如下的消息處理函數(shù)的聲明代碼:afx_msgLRESULTOnMyMessage(WPARAMwParam,LPARAMlParam);在消息處理函數(shù)所在的類(lèi)的cpp文件中的消息映射添加類(lèi)似下面的消息映射代碼:BEGIN_MESSAGE_MAP(ClxDlg,CDialogEx)…… ON_MESSAGE(WM_MY_MESSAGE,&ClxDlg::OnMyMessage)END_MESSAGE_MAP()發(fā)送自定義消息用戶(hù)可以在需要的地方通過(guò)PostMessage或SendMessage函數(shù)來(lái)發(fā)送自定義消息,例如:PostMessage(WM_MY_MESSAGE);
PostMessage只把消息放入消息隊(duì)列,不管消息處理程序是否處理該函數(shù)都返回,然后繼續(xù)執(zhí)行,也就是說(shuō)該函數(shù)是一個(gè)異步消息發(fā)送函數(shù);SendMessage則必須等待消息處理函數(shù)處理完了消息之后才返回調(diào)用該函數(shù)處繼續(xù)執(zhí)行,這是個(gè)同步消息發(fā)送函數(shù);PostMessage的返回值表示PostMessage函數(shù)是否正確執(zhí)行,而SendMessage的返回值表示消息處理函數(shù)的返回值。
2.9MFC的文件操作在MFC中,與文件處理關(guān)系較為密切的類(lèi)有兩個(gè),一個(gè)是CFile類(lèi),另一個(gè)是CFileDialog類(lèi)。CFile類(lèi)是MFC文件類(lèi)的基類(lèi),它封裝了幾乎所有的用于文件訪(fǎng)問(wèn)的Win32API,提供基本的文件輸入、輸出操作。CFileDialog類(lèi)并不參與文件的處理,它只是封裝了應(yīng)用程序中經(jīng)常會(huì)使用的Windows的文件對(duì)話(huà)框。文件對(duì)話(huà)框提供了一種簡(jiǎn)單的與Windows標(biāo)準(zhǔn)相一致的文件打開(kāi)和文件存盤(pán)的對(duì)話(huà)框功能,它只提供“選擇(或輸入)要打開(kāi)或保存的文件路徑”的功能。2.9.1CFile類(lèi)要使用CFile類(lèi)操作文件,首先要構(gòu)造CFile對(duì)象。使用缺省構(gòu)造函數(shù)構(gòu)造CFile類(lèi)對(duì)象:缺省構(gòu)造函數(shù)僅僅構(gòu)造一個(gè)沒(méi)有關(guān)聯(lián)文件的空CFile對(duì)象,必須使用Open成員函數(shù)來(lái)打開(kāi)文件。BOOLCFile::Open(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);lpszFileName:帶路徑的文件名,指定要打開(kāi)的文件。nOpenFlags:指定的文件打開(kāi)方式,nOpenFlags的取值可以是多個(gè)標(biāo)志的組合,例如:
CFile::modeCreate|CFile::modeWrite。常用的文件打開(kāi)方式標(biāo)志CFile::modeCreate調(diào)用構(gòu)造函數(shù)構(gòu)造一個(gè)新文件,如果文件已存在,則長(zhǎng)度變成0。CFile::modeNoTruncate此值與modeCreate組合使用。如果所創(chuàng)建的文件已存在則其長(zhǎng)度不變?yōu)?;若不存在則由modeCreate標(biāo)志創(chuàng)建一個(gè)新文件。CFile::modeRead以只讀方式打開(kāi)文件。CFile::modeReadWrite以讀、寫(xiě)方式打開(kāi)文件。CFile::modeWrite以只寫(xiě)方式打開(kāi)文件。CFile::modeNoInherit阻止文件被子進(jìn)程繼承。pError:該參數(shù)為一個(gè)指向CFileException對(duì)象的指針,指向的CFileException對(duì)象用于保存打開(kāi)文件出錯(cuò)時(shí)拋出的異常,該參數(shù)常缺省。例:CFilefile;//創(chuàng)建對(duì)象file.Open(“d:\\a.txt”,CFile::modeRead);
//以讀寫(xiě)方式打開(kāi)文件使用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí)直接打開(kāi)文件CFile(LPCTSTRlpszFileName,UINTnOpenFlags)lpszFileName指定的文件名nOpenFlags指定的文件打開(kāi)方式例:CFilefile("d:\\a.txt",CFile::modeRead);
//以只讀方式打開(kāi)D:盤(pán)根目錄上的文件并構(gòu)造CFile對(duì)象file。例:CFilefileOpen; try { fileOpen.Open("d:\\a.txt",CFile::modeRead); inti=fileOpen.GetLength(); fileOpen.Read(s,i); fileOpen.Close(); } catch(CFileException*e) { CStringstr; str.Format("讀取數(shù)據(jù)失敗的原因是:%d",e->m_cause); MessageBox(str); fileOpen.Abort(); e->Delete(); }文件讀取CFile類(lèi)中讀取文件的函數(shù)是Read(),該函數(shù)的格式如下:virtualUINTRead(void*lpBuf,UINTnCount);lpBuf:指向用戶(hù)提供的緩沖區(qū)以接收從文件中讀取的數(shù)據(jù)。nCount:允許從文件中讀出的字節(jié)數(shù)的最大值,對(duì)文本模式的文件,回車(chē)換行作為一個(gè)字符。函數(shù)的返回值是實(shí)際讀取到緩沖區(qū)的字節(jié)數(shù),如果讀到文件尾,則返回值可能比參數(shù)nCount指定的值小。如果函數(shù)出錯(cuò),則會(huì)拋出CFileException異常。文件寫(xiě)入寫(xiě)文件的成員函數(shù)為Write(),該函數(shù)的格式如下:virtualvoidWrite(constvoid*lpBuf,UINTnCount);lpBuf:指向用戶(hù)提供的緩沖區(qū),包含將寫(xiě)入文件中的數(shù)據(jù)。nCount:要寫(xiě)入的字節(jié)數(shù)。對(duì)文本模式的文件,回車(chē)換行作為一個(gè)字符。該函數(shù)將數(shù)據(jù)從緩沖區(qū)寫(xiě)入與CFile對(duì)象相關(guān)聯(lián)的文件。如果函數(shù)出錯(cuò),則會(huì)拋出CFileException異常。Write在幾種情況下均產(chǎn)生異常,包括磁盤(pán)滿(mǎn)的情況。
例:CFilefileSave;CStringm_Edit1(“aaaaaabbb\ncccccddddddd\neeeee”);try { fileSave.Open("d:\\a.txt",CFile::modeCreate|CFile::modeWrite); fileSave.Write(m_Edit1,m_Edit1.GetLength()); fileSave.Close(); } catch(CFileException*e) { CStringstr; str.Format("保存數(shù)據(jù)失敗的原因是:%d",e->m_cause); MessageBox(str); fileSave.Abort(); e->Delete(); }文件的讀寫(xiě)定位virtualLONGSeek(LONGlOff,UINTnFrom);lOff:指定針移動(dòng)的字節(jié)數(shù)。nFrom:指針移動(dòng)的模式,可為以下值之一:CFile::begin從文件開(kāi)始,把指針向后移動(dòng)lOff字節(jié)。CFile::current從當(dāng)前位置開(kāi)始,把指針向后移動(dòng)lOff字節(jié)。CFile::end從文件尾開(kāi)始,把指針向前移動(dòng)lOff字節(jié)。注意,此時(shí)lOff應(yīng)為負(fù)。如果為正值,則超出文件尾。該函數(shù)在一個(gè)已打開(kāi)的文件中重新定位文件位置指針。如果要求移動(dòng)道德的位置合法,則返回位置指針從文件開(kāi)始起的新的偏移量。否則,位置指針將不移動(dòng)并拋出CFileException異常。用于定位文件讀寫(xiě)位置的成員函數(shù)還有:voidSeekToBegin();將文件指針指向文件開(kāi)始處。DWORDSeekToEnd();//返回文件長(zhǎng)度(字節(jié)數(shù))將文件指針指向文件邏輯尾部文件關(guān)閉CFile類(lèi)用于關(guān)閉文件的成員函數(shù)有兩個(gè),一個(gè)是Close(),一個(gè)是Abort()。voidClose();voidAbort();Abort()與Close()區(qū)別在于Abort()忽略失敗,不會(huì)因失敗而拋出異常而Close()遇到錯(cuò)誤則會(huì)拋出CFileException異常;2.9.2
CFileDialog類(lèi)CFileDialog類(lèi)并不參與文件的處理,它只是封裝了應(yīng)用程序中經(jīng)常會(huì)使用的Windows的文件對(duì)話(huà)框。文件對(duì)話(huà)框提供了一種簡(jiǎn)單的與Windows標(biāo)準(zhǔn)相一致的文件打開(kāi)和文件存盤(pán)的對(duì)話(huà)框功能只提供“選擇或輸入要打開(kāi)或保存的文件路徑”的功能,真正的實(shí)現(xiàn)文件打開(kāi)或保存還需要編寫(xiě)另外的代碼。要使用CFileDialog提供的文件對(duì)話(huà)框,首先要定義一個(gè)CFileDialog類(lèi)的對(duì)象。CFileDialog類(lèi)的構(gòu)造函數(shù)CFileDialog(BOOLbOpenFileDialog,LPCTSTRlpszDefExt=NULL,LPCTSTRlpszFileName=NULL,DWORDdwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,LPCTSTRlpszFilter=NULL,CWnd*pParentWnd=NULL);參數(shù)說(shuō)明:bOpenFileDialg:如果為T(mén)RUE,則創(chuàng)建一個(gè)文件打開(kāi)對(duì)話(huà)框;如果為FALSE,則構(gòu)造一個(gè)FileSaveAs(另存為)對(duì)話(huà)框。lpszDefExt:缺省文件擴(kuò)展名,如果用戶(hù)在文件名編輯框中不包含擴(kuò)展名,則lpszDefExt定義的擴(kuò)展名自動(dòng)加到文件名后。如果為NULL,則不添加擴(kuò)展名。lpszFileName:初始顯示于文件名編輯框中的文件名,如果為NULL,則不顯示初始文件名。dwFlags:一個(gè)或多個(gè)標(biāo)志的組合,使你可定制對(duì)話(huà)框。相關(guān)標(biāo)志的使用請(qǐng)讀者自己查閱相關(guān)資料。lpszFilter:一列字符串對(duì),指定可以應(yīng)用到文件的過(guò)濾器。如果指定過(guò)濾器,僅被過(guò)濾器允許的文件顯示于文件列表框中。pParentWnd:指向文件對(duì)話(huà)框?qū)ο蟮母复翱诨驌碛姓叽翱?。?duì)LpszFilter參數(shù)的進(jìn)一步說(shuō)明:該參數(shù)用于指定哪些類(lèi)型的文件可在文件列表框中顯示。文件的類(lèi)型決定于擴(kuò)展名。該參數(shù)為一字符串,可同時(shí)指定多個(gè)要顯示的文件類(lèi)型,每個(gè)類(lèi)型由“文件類(lèi)型描述”和“文件擴(kuò)展名”兩部分組成,“文件類(lèi)型描述”和“擴(kuò)展名”間用“|”分隔,同種類(lèi)型文件的多個(gè)擴(kuò)展名間可以用“;”分割,每種文件類(lèi)型間也是用“|”分隔,字符串的末尾用“||”指明。例如,MirosoftExcel允許用戶(hù)用.XLC擴(kuò)展名(表)或.XLS(工作表)打開(kāi)文件,Excel過(guò)濾器應(yīng)如下:charszFilter[]=″ChartFiles(*.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省建筑工地施工合同效力證明
- 建材行業(yè)庫(kù)存優(yōu)化策略
- 恒大養(yǎng)老產(chǎn)業(yè)招投標(biāo)流程
- 職務(wù)變動(dòng)團(tuán)隊(duì)適應(yīng)指南
- 鄉(xiāng)鎮(zhèn)環(huán)境美化工作指南
- 合作伙伴合同簽訂指南
- 環(huán)保項(xiàng)目招投標(biāo)申請(qǐng)表
- 環(huán)保設(shè)施承包合同
- 辦公大樓車(chē)輛出入管理準(zhǔn)則
- 市政道路標(biāo)線(xiàn)施工合同
- 第六章 回歸分析課件
- 期中階段性練習(xí)(一~四單元)(試題)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)蘇教版
- 《病人安全護(hù)理學(xué)》-教學(xué)大綱
- 項(xiàng)目分成比例合同模板
- GB 27887-2024機(jī)動(dòng)車(chē)兒童乘員用約束系統(tǒng)
- 朝鮮半島局勢(shì)演變
- 自然科學(xué)基金項(xiàng)目申請(qǐng)書(shū)
- 2024年云南德宏州州級(jí)事業(yè)單位選調(diào)工作人員歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 第四屆全國(guó)新能源汽車(chē)關(guān)鍵技術(shù)技能大賽(新能源汽車(chē)輕量化技術(shù)方向)決賽參考試題庫(kù)(含答案)
- 2024年秋新魯科版三年級(jí)上冊(cè)英語(yǔ)課件 Unit 6 lesson 1
- 教師資格考試小學(xué)數(shù)學(xué)面試試題與參考答案
評(píng)論
0/150
提交評(píng)論