




免費(fèi)預(yù)覽已結(jié)束,剩余70頁(yè)可下載查看
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
* /htm/produ/special/vc/list1.asp第一章 VC入門(mén)1.1 如何學(xué)好VC1.2 理解Windows消息機(jī)制1.3 利用Visual C+/MFC開(kāi)發(fā)Windows程序的優(yōu)勢(shì)1.4 利用MFC進(jìn)行開(kāi)發(fā)的通用方法介紹1.5 MFC中常用類(lèi)、宏、函數(shù)介紹第二章 圖形輸出2.1 和GUI有關(guān)的各種對(duì)象2.2 在窗口中輸出文字2.3 使用點(diǎn)、刷子、筆進(jìn)行繪圖2.4 在窗口中繪制設(shè)備相關(guān)位圖、圖標(biāo)、設(shè)備無(wú)關(guān)位圖2.5 使用各種映射方式2.6 多邊形和剪貼區(qū)域第三章 文檔視結(jié)構(gòu)3.1 文檔 視圖 框架窗口間的關(guān)系和消息傳送規(guī)律3.2 接收用戶(hù)輸入3.3 使用菜單3.4 文檔、視、框架之間相互作用3.5 利用序列化進(jìn)行文件讀寫(xiě)3.6 MFC中所提供的各種視類(lèi)介紹第四章 窗口控件4.1 Button4.2 Static Box4.3 Edit Box4.4 Scroll Bar4.5 List Box/Check List Box4.6 Combo Box/Combo Box Ex4.7 Tree Ctrl4.8 List Ctrl4.9 Tab Ctrl4.A Tool Bar4.B Status Bar4.C Dialog Bar4.D 利用AppWizard創(chuàng)建并使用ToolBar StatusBar Dialog Bar4.E General Window4.F 關(guān)于WM_NOTIFY的使用方法第五章 對(duì)話框5.1 使用資源編輯器編輯對(duì)話框5.2 創(chuàng)建有模式對(duì)話框5.3 創(chuàng)建無(wú)模式對(duì)話框5.4 在對(duì)話框中進(jìn)行消息映射5.5 在對(duì)話框中進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)檢查5.6 使用屬性對(duì)話框5.7 使用通用對(duì)話框5.8 建立以對(duì)話框?yàn)榛A(chǔ)的應(yīng)用5.9 使用對(duì)話框作為子窗口第六章 網(wǎng)絡(luò)通信開(kāi)發(fā)6.1 WinSock介紹6.2 利用WinSock進(jìn)行無(wú)連接的通信6.3 利用WinSock建立有連接的通信第一章 VC入門(mén)1.1 如何學(xué)好VC這個(gè)問(wèn)題很多朋友都問(wèn)過(guò)我,當(dāng)然流汗是必須的,但同時(shí)如果按照某種思路進(jìn)行有計(jì)劃的學(xué)習(xí)就會(huì)起到更好的效果。萬(wàn)事開(kāi)頭難,為了幫助朋友們更快的掌握VC開(kāi)發(fā),下面我將自己的一點(diǎn)體會(huì)講一下:1、需要有好的C/C+基礎(chǔ)。正所謂“磨刀不誤砍柴工”,最開(kāi)始接觸VC時(shí)不要急于開(kāi)始Windows程序開(kāi)發(fā),而是應(yīng)該進(jìn)行一些字符界面程序的編寫(xiě)。這樣做的目的主要是增加對(duì)語(yǔ)言的熟悉程度,同時(shí)也訓(xùn)練自己的思維和熟悉一些在編程中常犯的錯(cuò)誤。更重要的是理解并能運(yùn)用C+的各種特性,這些在以后的開(kāi)發(fā)中都會(huì)有很大的幫助,特別是利用MFC進(jìn)行開(kāi)發(fā)的朋友對(duì)C+一定要能熟練運(yùn)用。 2、理解Windows的消息機(jī)制,窗口句柄和其他GUI句柄的含義和用途。了解和MFC各個(gè)類(lèi)功能相近的API函數(shù)。3、一定要理解MFC中消息映射的作用。4、訓(xùn)練自己在編寫(xiě)代碼時(shí)不使用參考書(shū)而是使用Help Online。5、記住一些常用的消息名稱(chēng)和參數(shù)的意義。6、學(xué)會(huì)看別人的代碼。7、多看書(shū),少買(mǎi)書(shū),買(mǎi)書(shū)前一定要慎重。8、閑下來(lái)的時(shí)候就看參考書(shū)。9、多來(lái)我的主頁(yè)。O后面幾條是我個(gè)人的一點(diǎn)意見(jiàn),你可以根據(jù)需要和自身的情況選用適用于自己的方法。此外我將一些我在選擇參考書(shū)時(shí)的原則:對(duì)于初學(xué)者:應(yīng)該選擇一些內(nèi)容比較全面的書(shū)籍,并且書(shū)籍中的內(nèi)容應(yīng)該以合理的方式安排,在使用該書(shū)時(shí)可以達(dá)到循序漸進(jìn)的效果,書(shū)中的代碼要有詳細(xì)的講解。盡量買(mǎi)翻譯的書(shū),因?yàn)檫@些書(shū)一般都比較易懂,而且語(yǔ)言比較輕松。買(mǎi)書(shū)前一定要慎重如果買(mǎi)到不好用的書(shū)可能會(huì)對(duì)自己的學(xué)習(xí)積極性產(chǎn)生打擊。對(duì)于已經(jīng)掌握了VC的朋友:這種程度的開(kāi)發(fā)者應(yīng)該加深自己對(duì)系統(tǒng)原理,技術(shù)要點(diǎn)的認(rèn)識(shí)。需要選擇一些對(duì)原理講解的比較透徹的書(shū)籍,這樣一來(lái)才會(huì)對(duì)新技術(shù)有更多的了解,最好書(shū)中對(duì)技術(shù)的應(yīng)用有一定的闡述。盡量選擇示范代碼必較精簡(jiǎn)的書(shū),可以節(jié)約銀子。此外最好涉獵一些輔助性的書(shū)籍1.2 理解Windows消息機(jī)制Windows系統(tǒng)是一個(gè)消息驅(qū)動(dòng)的OS,什么是消息呢?我很難說(shuō)得清楚,也很難下一個(gè)定義(誰(shuí)在噓我),我下面從不同的幾個(gè)方面講解一下,希望大家看了后有一點(diǎn)了解。 1、消息的組成:一個(gè)消息由一個(gè)消息名稱(chēng)(UINT),和兩個(gè)參數(shù)(WPARAM,LPARAM)。當(dāng)用戶(hù)進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時(shí)系統(tǒng)都會(huì)發(fā)送消息到某一個(gè)窗口。例如當(dāng)菜單轉(zhuǎn)中之后會(huì)有WM_COMMAND消息發(fā)送,WPARAM的高字中(HIWORD(wParam))是命令的ID號(hào),對(duì)菜單來(lái)講就是菜單ID。當(dāng)然用戶(hù)也可以定義自己的消息名稱(chēng),也可以利用自定義消息來(lái)發(fā)送通知和傳送數(shù)據(jù)。 2、誰(shuí)將收到消息:一個(gè)消息必須由一個(gè)窗口接收。在窗口的過(guò)程(WNDPROC)中可以對(duì)消息進(jìn)行分析,對(duì)自己感興趣的消息進(jìn)行處理。例如你希望對(duì)菜單選擇進(jìn)行處理那么你可以定義對(duì)WM_COMMAND進(jìn)行處理的代碼,如果希望在窗口中進(jìn)行圖形輸出就必須對(duì)WM_PAINT進(jìn)行處理。 3、未處理的消息到那里去了:M$為窗口編寫(xiě)了默認(rèn)的窗口過(guò)程,這個(gè)窗口過(guò)程將負(fù)責(zé)處理那些你不處理消息。正因?yàn)橛辛诉@個(gè)默認(rèn)窗口過(guò)程我們才可以利用Windows的窗口進(jìn)行開(kāi)發(fā)而不必過(guò)多關(guān)注窗口各種消息的處理。例如窗口在被拖動(dòng)時(shí)會(huì)有很多消息發(fā)送,而我們都可以不予理睬讓系統(tǒng)自己去處理。 4、窗口句柄:說(shuō)到消息就不能不說(shuō)窗口句柄,系統(tǒng)通過(guò)窗口句柄來(lái)在整個(gè)系統(tǒng)中唯一標(biāo)識(shí)一個(gè)窗口,發(fā)送一個(gè)消息時(shí)必須指定一個(gè)窗口句柄表明該消息由那個(gè)窗口接收。而每個(gè)窗口都會(huì)有自己的窗口過(guò)程,所以用戶(hù)的輸入就會(huì)被正確的處理。例如有兩個(gè)窗口共用一個(gè)窗口過(guò)程代碼,你在窗口一上按下鼠標(biāo)時(shí)消息就會(huì)通過(guò)窗口一的句柄被發(fā)送到窗口一而不是窗口二。5、示例:下面有一段偽代碼演示如何在窗口過(guò)程中處理消息 LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)switch(uMessageType)/使用SWITCH語(yǔ)句將各種消息分開(kāi)case(WM_PAINT):doYourWindow(.);/在窗口需要重新繪制時(shí)進(jìn)行輸出break;case(WM_LBUTTONDOWN):doYourWork(.);/在鼠標(biāo)左鍵被按下時(shí)進(jìn)行處理break;default:callDefaultWndProc(.);/對(duì)于其它情況就讓系統(tǒng)自己處理break;接下來(lái)談?wù)勈裁词窍C(jī)制:系統(tǒng)將會(huì)維護(hù)一個(gè)或多個(gè)消息隊(duì)列,所有產(chǎn)生的消息都回被放入或是插入隊(duì)列中。系統(tǒng)會(huì)在隊(duì)列中取出每一條消息,根據(jù)消息的接收句柄而將該消息發(fā)送給擁有該窗口的程序的消息循環(huán)。每一個(gè)運(yùn)行的程序都有自己的消息循環(huán),在循環(huán)中得到屬于自己的消息并根據(jù)接收窗口的句柄調(diào)用相應(yīng)的窗口過(guò)程。而在沒(méi)有消息時(shí)消息循環(huán)就將控制權(quán)交給系統(tǒng)所以Windows可以同時(shí)進(jìn)行多個(gè)任務(wù)。下面的偽代碼演示了消息循環(huán)的用法: while(1)id=getMessage(.);if(id = quit)break;translateMessage(.);當(dāng)該程序沒(méi)有消息通知時(shí)getMessage就不會(huì)返回,也就不會(huì)占用系統(tǒng)的CPU時(shí)間。 圖示消息投遞模式在16位的系統(tǒng)中系統(tǒng)中只有一個(gè)消息隊(duì)列,所以系統(tǒng)必須等待當(dāng)前任務(wù)處理消息后才可以發(fā)送下一消息到相應(yīng)程序,如果一個(gè)程序陷如死循環(huán)或是耗時(shí)操作時(shí)系統(tǒng)就會(huì)得不到控制權(quán)。這種多任務(wù)系統(tǒng)也就稱(chēng)為協(xié)同式的多任務(wù)系統(tǒng)。Windows3.X就是這種系統(tǒng)。而32位的系統(tǒng)中每一運(yùn)行的程序都會(huì)有一個(gè)消息隊(duì)列,所以系統(tǒng)可以在多個(gè)消息隊(duì)列中轉(zhuǎn)換而不必等待當(dāng)前程序完成消息處理就可以得到控制權(quán)。這種多任務(wù)系統(tǒng)就稱(chēng)為搶先式的多任務(wù)系統(tǒng)。Windows95/NT就是這種系統(tǒng)1.3 利用Visual C+/MFC開(kāi)發(fā)Windows程序的優(yōu)勢(shì)MFC借助C+的優(yōu)勢(shì)為Windows開(kāi)發(fā)開(kāi)辟了一片新天地,同時(shí)也借助ApplicationWizzard使開(kāi)發(fā)者擺脫離了那些每次都必寫(xiě)基本代碼,借助ClassWizard和消息映射使開(kāi)發(fā)者擺脫了定義消息處理時(shí)那種混亂和冗長(zhǎng)的代碼段。更令人興奮的是利用C+的封裝功能使開(kāi)發(fā)者擺脫Windows中各種句柄的困擾,只需要面對(duì)C+中的對(duì)象,這樣一來(lái)使開(kāi)發(fā)更接近開(kāi)發(fā)語(yǔ)言而遠(yuǎn)離系統(tǒng)。(但我個(gè)人認(rèn)為了解系統(tǒng)原理對(duì)開(kāi)發(fā)很有幫助) 正因?yàn)镸FC是建立在C+的基礎(chǔ)上,所以我強(qiáng)調(diào)C/C+語(yǔ)言基礎(chǔ)對(duì)開(kāi)發(fā)的重要性。利用C+的封裝性開(kāi)發(fā)者可以更容易理解和操作各種窗口對(duì)象;利用C+的派生性開(kāi)發(fā)者可以減少開(kāi)發(fā)自定義窗口的時(shí)間和創(chuàng)造出可重用的代碼;利用虛擬性可以在必要時(shí)更好的控制窗口的活動(dòng)。而且C+本身所具備的超越C語(yǔ)言的特性都可以使開(kāi)發(fā)者編寫(xiě)出更易用,更靈活的代碼。在MFC中對(duì)消息的處理利用了消息映射的方法,該方法的基礎(chǔ)是宏定義實(shí)現(xiàn),通過(guò)宏定義將消息分派到不同的成員函數(shù)進(jìn)行處理。下面簡(jiǎn)單講述一下這種方法的實(shí)現(xiàn)方法。 代碼如下BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) /AFX_MSG_MAP(CMainFrame)ON_WM_CREATE() /AFX_MSG_MAPON_COMMAND(ID_FONT_DROPDOWN, DoNothing)END_MESSAGE_MAP()經(jīng)過(guò)編譯后,代碼被替換為如下形式(這只是作講解,實(shí)際情況比這復(fù)雜得多):/BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) CMainFrame:newWndProc(.)switch(.)/AFX_MSG_MAP(CMainFrame)/ ON_WM_CREATE() case(WM_CREATE):OnCreate(.);break;/AFX_MSG_MAP/ ON_COMMAND(ID_FONT_DROPDOWN, DoNothing)case(WM_COMMAND):if(HIWORD(wP)=ID_FONT_DROPDOWN)DoNothing(.);break;/END_MESSAGE_MAP()newWndProc就是窗口過(guò)程只要是該類(lèi)的實(shí)例生成的窗口都使用該窗口過(guò)程。 所以了解了Windows的消息機(jī)制在加上對(duì)消息映射的理解就很容易了解MFC開(kāi)發(fā)的基本思路了1.4 利用MFC進(jìn)行開(kāi)發(fā)的通用方法介紹以下是我在最初學(xué)習(xí)VC時(shí)所常用的開(kāi)發(fā)思路和方法,希望能對(duì)初學(xué)VC的朋友有所幫助和啟發(fā)。開(kāi)發(fā)需要讀寫(xiě)文件的應(yīng)用程序并且有簡(jiǎn)單的輸入和輸出可以利用單文檔視結(jié)構(gòu)開(kāi)發(fā)注重交互的簡(jiǎn)單應(yīng)用程序可以使用對(duì)話框?yàn)榛A(chǔ)的窗口,如果文件讀寫(xiě)簡(jiǎn)單這可利用CFile進(jìn)行開(kāi)發(fā)注重交互并且文件讀寫(xiě)復(fù)雜的的簡(jiǎn)單應(yīng)用程序可以利用以CFormView為基礎(chǔ)視的單文檔視結(jié)構(gòu)利用對(duì)話框得到用戶(hù)輸入的數(shù)據(jù),在等級(jí)提高后可使用就地輸入在對(duì)多文檔要求不強(qiáng)烈時(shí)盡量避免多文檔視結(jié)構(gòu),可以利用分隔條產(chǎn)生單文檔多視結(jié)構(gòu)在要求在多個(gè)文檔間傳遞數(shù)據(jù)時(shí)使用多文檔視結(jié)構(gòu)學(xué)會(huì)利用子窗口,并在自定義的子窗口包含多個(gè)控件達(dá)到封裝功能的目的盡量避免使用多文檔多視結(jié)構(gòu)不要使用多重繼承并盡量減少一個(gè)類(lèi)中封裝過(guò)多的功能 1.5 MFC中常用類(lèi)、宏、函數(shù)介紹 常用類(lèi)CRect:用來(lái)表示矩形的類(lèi),擁有四個(gè)成員變量:top left bottom right。分別表是左上角和右下角的坐標(biāo)??梢酝ㄟ^(guò)以下的方法構(gòu)造。 CRect( int l, int t, int r, int b ); 指明四個(gè)坐標(biāo) CRect( const RECT& srcRect ); 由RECT結(jié)構(gòu)構(gòu)造 CRect( LPCRECT lpSrcRect ); 由RECT結(jié)構(gòu)構(gòu)造 CRect( POINT point, SIZE size ); 有左上角坐標(biāo)和尺寸構(gòu)造 CRect( POINT topLeft, POINT bottomRight ); 有兩點(diǎn)坐標(biāo)構(gòu)造 下面介紹幾個(gè)成員函數(shù): int Width( ) const; 得到寬度 int Height( ) const; 得到高度 CSize Size( ) const; 得到尺寸 CPoint& TopLeft( ); 得到左上角坐標(biāo) CPoint& BottomRight( ); 得到右下角坐標(biāo) CPoint CenterPoint( ) const; 得當(dāng)中心坐標(biāo) 此外矩形可以和點(diǎn)(CPoint)相加進(jìn)行位移,和另一個(gè)矩形相加得到“并”操作后的矩形。 CPoint:用來(lái)表示一個(gè)點(diǎn)的坐標(biāo),有兩個(gè)成員變量:x y。 可以和另一個(gè)點(diǎn)相加。 CString:用來(lái)表示可變長(zhǎng)度的字符串。使用CString可不指明內(nèi)存大小,CString會(huì)根據(jù)需要自行分配。下面介紹幾個(gè)成員函數(shù): GetLength 得到字符串長(zhǎng)度 GetAt 得到指定位置處的字符 operator + 相當(dāng)于strcat void Format( LPCTSTR lpszFormat, . ); 相當(dāng)于sprintf Find 查找指定字符,字符串 Compare 比較 CompareNoCase 不區(qū)分大小寫(xiě)比較 MakeUpper 改為小寫(xiě) MakeLower 改為大寫(xiě) CStringArray:用來(lái)表示可變長(zhǎng)度的字符串?dāng)?shù)組。數(shù)組中每一個(gè)元素為CString對(duì)象的實(shí)例。下面介紹幾個(gè)成員函數(shù): Add 增加CString RemoveAt 刪除指定位置CString對(duì)象 RemoveAll 刪除數(shù)組中所有CString對(duì)象 GetAt 得到指定位置的CString對(duì)象 SetAt 修改指定位置的CString對(duì)象 InsertAt 在某一位置插入CString對(duì)象常用宏:RGB、 TRACE、ASSERT、VERIFY常用函數(shù) CWindApp* AfxGetApp(); HINSTANCE AfxGetInstanceHandle( ) HINSTANCE AfxGetResourceHandle( ) int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );用于彈出一個(gè)消息框第二章 圖形輸出2.1 和GUI有關(guān)的各種對(duì)象2.2 在窗口中輸出文字2.3 使用點(diǎn)、刷子、筆進(jìn)行繪圖2.4 在窗口中繪制設(shè)備相關(guān)位圖、圖標(biāo)、設(shè)備無(wú)關(guān)位圖2.5 使用各種映射方式2.6 多邊形和剪貼區(qū)域21 和GUI有關(guān)的各種對(duì)象在Windows中有各種GUI對(duì)象(不要和C+對(duì)象混淆),當(dāng)你在進(jìn)行繪圖就需要利用這些對(duì)象。而各種對(duì)象都擁有各種屬性,下面分別講述各種GUI對(duì)象和擁有的屬性字體對(duì)象CFont用于輸出文字時(shí)選用不同風(fēng)格和大小的字體??蛇x擇的風(fēng)格包括:是否為斜體,是否為粗體,字體名稱(chēng),是否有下劃線等。顏色和背景色不屬于字體的屬性。關(guān)于如何創(chuàng)建和使用字體在2.2 在窗口中輸出文字中會(huì)詳細(xì)講解刷子CBrush對(duì)象決定填充區(qū)域時(shí)所采用的顏色或模板。對(duì)于一個(gè)固定色的刷子來(lái)講它的屬性為顏色,是否采用網(wǎng)格和網(wǎng)格的類(lèi)型如水平的,垂直的,交叉的等。你也可以利用8*8的位圖來(lái)創(chuàng)建一個(gè)自定義模板的刷子,在使用這種刷子填充時(shí)系統(tǒng)會(huì)利用位圖逐步填充區(qū)域。關(guān)于如何創(chuàng)建和使用刷子在2.3 使用刷子、筆進(jìn)行繪圖中會(huì)詳細(xì)講解畫(huà)筆CPen對(duì)象在畫(huà)點(diǎn)和畫(huà)線時(shí)有用。它的屬性包括顏色,寬度,線的風(fēng)格,如虛線,實(shí)線,點(diǎn)劃線等。關(guān)于如何創(chuàng)建和使用畫(huà)筆在2.3 使用刷子、筆進(jìn)行繪圖中會(huì)詳細(xì)講解位圖CBitmap對(duì)象可以包含一幅圖像,可以保存在資源中。關(guān)于如何使用位圖在2.4 在窗口中繪制設(shè)備相關(guān)位圖、圖標(biāo)、設(shè)備無(wú)關(guān)位圖中會(huì)詳細(xì)講解還有一種特殊的GUI對(duì)象是多邊形,利用多邊形可以很好的限制作圖區(qū)域或是改變窗口外型。關(guān)于如何創(chuàng)建和使用多邊形在2.6 多邊形和剪貼區(qū)域中會(huì)詳細(xì)講解。在Windows中使用GUI對(duì)象必須遵守一定的規(guī)則。首先需要?jiǎng)?chuàng)建一個(gè)合法的對(duì)象,不同的對(duì)象創(chuàng)建方法不同。然后需要將該GUI對(duì)象選入DC中,同時(shí)保存DC中原來(lái)的GUI對(duì)象。如果選入一個(gè)非法的對(duì)象將會(huì)引起異常。在使用完后應(yīng)該恢復(fù)原來(lái)的對(duì)象,這一點(diǎn)特別重要,如果保存一個(gè)臨時(shí)對(duì)象在DC中,而在臨時(shí)對(duì)象被銷(xiāo)毀后可能引起異常。有一點(diǎn)必須注意,每一個(gè)對(duì)象在重新創(chuàng)建前必須銷(xiāo)毀,下面的代碼演示了這一種安全的使用方法。OnDraw(CDC* pDC)CPen pen1,pen2;pen1.CreatePen(PS_SOLID,2,RGB(128,128,128);/創(chuàng)建對(duì)象pen2.CreatePen(PS_SOLID,2,RGB(128,128,0);/創(chuàng)建對(duì)象CPen* pPenOld=(CPen*)pDC-SelectObject(&pen1);/選擇對(duì)象進(jìn)DCdrawWithPen1.(CPen*)pDC-SelectObject(&pen2);/選擇對(duì)象進(jìn)DCdrawWithPen2.pen1.DeleteObject();/再次創(chuàng)建前先銷(xiāo)毀pen1.CreatePen(PS_SOLID,2,RGB(0,0,0);/再次創(chuàng)建對(duì)象(CPen*)pDC-SelectObject(&pen1);/選擇對(duì)象進(jìn)DCdrawWithPen1.pDC-SelectObject(pOldPen);/恢復(fù)此外系統(tǒng)中還擁有一些庫(kù)存GUI對(duì)象,你可以利用CDC:SelectStockObject(SelectStockObject( int nIndex )選入這些對(duì)象,它們包括一些固定顏色的刷子,畫(huà)筆和一些基本字體. BLACK_BRUSH Black brush. DKGRAY_BRUSH Dark gray brush. GRAY_BRUSH Gray brush. HOLLOW_BRUSH Hollow brush. LTGRAY_BRUSH Light gray brush. NULL_BRUSH Null brush. WHITE_BRUSH White brush. BLACK_PEN Black pen. NULL_PEN Null pen. WHITE_PEN White pen. ANSI_FIXED_FONT ANSI fixed system font. ANSI_VAR_FONT ANSI variable system font. DEVICE_DEFAULT_FONT Device-dependent font. OEM_FIXED_FONT OEM-dependent fixed font. SYSTEM_FONT The system font. By default, Windows uses the system font to draw menus, dialog-box controls, and other text. In Windows versions 3.0 and later, the system font is proportional width; earlier versions of Windows use a fixed-width system font. SYSTEM_FIXED_FONT The fixed-width system font used in Windows prior to version 3.0. This object is available for compatibility with earlier versions of Windows. DEFAULT_PALETTE Default color palette. This palette consists of the 20 static colors in the system palette.這些對(duì)象留在DC中是安全的,所以你可以利用選入庫(kù)存對(duì)象來(lái)作為恢復(fù)DC中GUI對(duì)象。大家可能都注意到了繪圖時(shí)都需要一個(gè)DC對(duì)象,DC(Device Context設(shè)備環(huán)境)對(duì)象是一個(gè)抽象的作圖環(huán)境,可能是對(duì)應(yīng)屏幕,也可能是對(duì)應(yīng)打印機(jī)或其它。這個(gè)環(huán)境是設(shè)備無(wú)關(guān)的,所以你在對(duì)不同的設(shè)備輸出時(shí)只需要使用不同的設(shè)備環(huán)境就行了,而作圖方式可以完全不變。這也就是Windows耀眼的一點(diǎn)設(shè)備無(wú)關(guān)性。如同你將對(duì)一幅畫(huà)使用照相機(jī)或復(fù)印機(jī)將會(huì)產(chǎn)生不同的輸出,而不需要對(duì)畫(huà)進(jìn)行任何調(diào)整。DC的使用會(huì)穿插在本章中進(jìn)行介紹2.2 在窗口中輸出文字 在這里我假定讀者已經(jīng)利用ApplicationWizard生成了一個(gè)SDI界面的程序代碼。接下來(lái)的你只需要在CView派生類(lèi)的OnDraw成員函數(shù)中加入繪圖代碼就可以了。在這里我需要解釋一下OnDraw函數(shù)的作用,OnDraw函數(shù)會(huì)在窗口需要重繪時(shí)自動(dòng)被調(diào)用,傳入的參數(shù)CDC* pDC對(duì)應(yīng)的就是DC環(huán)境。使用OnDraw的優(yōu)點(diǎn)就在于在你使用打印功能的時(shí)候傳入OnDraw的DC環(huán)境將會(huì)是打印機(jī)繪圖環(huán)境,使用打印預(yù)覽時(shí)傳入的是一個(gè)稱(chēng)為CPreviewDC的繪圖環(huán)境,所以你只需要一份代碼就可以完成窗口/打印預(yù)覽/打印機(jī)繪圖三重功能。利用Windows的設(shè)備無(wú)關(guān)性和M$為打印預(yù)覽所編寫(xiě)的上千行代碼你可以很容易的完成一個(gè)具有所見(jiàn)即所得的軟件。輸出文字一般使用CDC:BOOL TextOut( int x, int y, const CString& str )和CDC:int DrawText( const CString& str, LPRECT lpRect, UINT nFormat )兩個(gè)函數(shù),對(duì)TextOut來(lái)講只能輸出單行的文字,而DrawText可以指定在一個(gè)矩形中輸出單行或多行文字,并且可以規(guī)定對(duì)齊方式和使用何種風(fēng)格。nFormat可以是多種以下標(biāo)記的組合(利用位或操作)以達(dá)到選擇輸出風(fēng)格的目的。 pDC- TextOut(100,100,”wqewr”); DT_BOTTOM底部對(duì)齊 Specifies bottom-justified text. This value must be combined with DT_SINGLELINE. DT_CALCRECT計(jì)算指定文字時(shí)所需要矩形尺寸 Determines the width and height of the rectangle. If there are multiple lines of text, DrawText will use the width of the rectangle pointed to by lpRect and extend the base of the rectangle to bound the last line of text. If there is only one line of text, DrawText will modify the right side of the rectangle so that it bounds the last character in the line. In either case, DrawText returns the height of the formatted text, but does not draw the text. DT_CENTER中部對(duì)齊 Centers text horizontally. DT_END_ELLIPSIS or DT_PATH_ELLIPSIS Replaces part of the given string with ellipses, if necessary, so that the result fits in the specified rectangle. The given string is not modified unless the DT_MODIFYSTRING flag is specified.You can specify DT_END_ELLIPSIS to replace characters at the end of the string, or DT_PATH_ELLIPSIS to replace characters in the middle of the string. If the string contains backslash () characters, DT_PATH_ELLIPSIS preserves as much as possible of the text after the last backslash. DT_EXPANDTABS Expands tab characters. The default number of characters per tab is eight. DT_EXTERNALLEADING Includes the font抯 external leading in the line height. Normally, external leading is not included in the height of a line of text. DT_LEFT左對(duì)齊 Aligns text flush-left. DT_MODIFYSTRING Modifies the given string to match the displayed text. This flag has no effect unless the DT_END_ELLIPSIS or DT_PATH_ELLIPSIS flag is specified.Note Some uFormat flag combinations can cause the passed string to be modified. Using DT_MODIFYSTRING with either DT_END_ELLIPSIS or DT_PATH_ELLIPSIS may cause the string to be modified, causing an assertion in the CString override. DT_NOCLIP Draws without clipping. DrawText is somewhat faster when DT_NOCLIP is used. DT_NOPREFIX禁止使用&前綴 Turns off processing of prefix characters. Normally, DrawText interprets the ampersand (&) mnemonic-prefix character as a directive to underscore the character that follows, and the two-ampersand (&) mnemonic-prefix characters as a directive to print a single ampersand. By specifying DT_NOPREFIX, this processing is turned off. DT_PATH_ELLIPSIS DT_RIGHT右對(duì)齊 Aligns text flush-right. DT_SINGLELINE單行輸出 Specifies single line only. Carriage returns and linefeeds do not break the line. DT_TABSTOP設(shè)置TAB字符所占寬度 Sets tab stops. The high-order byte of nFormat is the number of characters for each tab. The default number of characters per tab is eight. DT_TOP定部對(duì)齊 Specifies top-justified text (single line only). DT_VCENTER中部對(duì)齊 Specifies vertically centered text (single line only). DT_WORDBREAK每行只在單詞間被折行 Specifies word-breaking. Lines are automatically broken between words if a word would extend past the edge of the rectangle specified by lpRect. A carriage return杔inefeed sequence will also break the line. 在輸出文字時(shí)如果希望改變文字的顏色,你可以利用CDC:SetTextColor( COLORREF crColor )進(jìn)行設(shè)置,如果你希望改變背景色就利用CDC:SetBkColor( COLORREF crColor ),很多時(shí)候你可能需要透明的背景色你可以利用CDC:SetBkMode( int nBkMode )設(shè)置,可接受的參數(shù)有 OPAQUE Background is filled with the current background color before the text, hatched brush, or pen is drawn. This is the default background mode. TRANSPARENT Background is not changed before drawing. 接下來(lái)講講如何創(chuàng)建字體,你可以創(chuàng)建的字體有兩種:庫(kù)存字體CDC:CreateStockObject( int nIndex )和自定義字體。在創(chuàng)建非庫(kù)存字體時(shí)需要填充一個(gè)LOGFONT結(jié)構(gòu)并使用CFont:CreateFontIndirect(const LOGFONT* lpLogFont )(可以參考文章在同一系統(tǒng)中顯示GB字符和BIG5字符),或使用CFont:CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename )其中的參數(shù)和LOGFONT中的分量有一定的對(duì)應(yīng)關(guān)系。下面分別講解參數(shù)的意義:nHeight 字體高度(邏輯單位)等于零為缺省高度,否則取絕對(duì)值并和可用的字體高度進(jìn)行匹配。nWidth 寬度(邏輯單位)如果為零則使用可用的橫縱比進(jìn)行匹配。nEscapement 出口矢量與X軸間的角度nOrientation 字體基線與X軸間的角度nWeight 字體粗細(xì),可取以下值ConstantValueFW_DONTCARE0FW_THIN100FW_EXTRALIGHT200FW_ULTRALIGHT200FW_LIGHT300FW_NORMAL400FW_REGULAR400FW_MEDIUM500FW_SEMIBOLD600FW_DEMIBOLD600FW_BOLD700FW_EXTRABOLD800FW_ULTRABOLD800FW_BLACK900FW_HEAVY900bItalic 是否為斜體bUnderline 是否有下劃線cStrikeOut 是否帶刪除線nCharSet 指定字符集合,可取以下值ConstantValueANSI_CHARSET0DEFAULT_CHARSET1SYMBOL_CHARSET2SHIFTJIS_CHARSET128OEM_CHARSET255nOutPrecision 輸出精度OUT_CHARACTER_PRECISOUT_STRING_PRECISOUT_DEFAULT_PRECISOUT_STROKE_PRECISOUT_DEVICE_PRECISOUT_TT_PRECISOUT_RASTER_PRECIS nClipPrecision 剪輯精度,可取以下值CLIP_CHARACTER_PRECISCLIP_MASKCLIP_DEFAULT_PRECISCLIP_STROKE_PRECISCLIP_ENCAPSULATECLIP_TT_ALWAYSCLIP_LH_ANGLES nQuality 輸出質(zhì)量,可取以下值 DEFAULT_QUALITY Appearance of the font does not matter. DRAFT_QUALITY Appearance of the font is less important than when PROOF_QUALITY is used. For GDI raster fonts, scaling is enabled. Bold, italic, underline, and strikeout fonts are synthesized if necessary. PROOF_QUALITY Character quality of the font is more important than exact matching of the logical-font attributes. For GDI raster fonts, scaling is disabled and the font closest in size is chosen. Bold, italic, underline, and strikeout fonts are synthesized if necessary. nPitchAndFamily 字體間的間距l(xiāng)pszFacename 指定字體名稱(chēng),為了得到系統(tǒng)所擁有的字體可以利用EmunFontFamiliesEx。(可以參考文章在同一系統(tǒng)中顯示GB字符和BIG5字符)此外可以利用CFontDialog來(lái)得到用戶(hù)選擇的字體的LOGFONT數(shù)據(jù)。最后我講一下文本坐標(biāo)的計(jì)算,利用CDC:GetTextExtent( const CString& str )可以得到字符串的在輸出時(shí)所占用的寬度和高度,這樣就可以在手工輸出多行文字時(shí)使用正確的行距。另外如果需要更精確的對(duì)字體高度和寬度進(jìn)行計(jì)算就需要使用CDC:GetTextMetrics( LPTEXTMETRIC lpMetrics ) 該函數(shù)將會(huì)填充TEXTMETRIC結(jié)構(gòu),該結(jié)構(gòu)中的分量可以非常精確的描述字體的各種屬性。2.3 使用點(diǎn)、刷子、筆進(jìn)行繪圖在Windows中畫(huà)點(diǎn)的方法很簡(jiǎn)單,只需要調(diào)用COLORREF CDC:SetPixel( int x, int y, COLORREF crColor )就可以在指定點(diǎn)畫(huà)上指定顏色,同時(shí)返回原來(lái)的顏色。COLORREF CDC:GetPixel( int x, int y)可以得到指定點(diǎn)的顏色。在Windows中應(yīng)該少使用畫(huà)點(diǎn)的函數(shù),因?yàn)檫@樣做的執(zhí)行效率比較低。刷子和畫(huà)筆在Windows作圖中是使用最多的GUI對(duì)象,本節(jié)在講解刷子和畫(huà)筆使用方法的同時(shí)也講述一寫(xiě)基本作圖函數(shù)。在畫(huà)點(diǎn)或畫(huà)線時(shí)系統(tǒng)使用當(dāng)前DC中的畫(huà)筆,所以在創(chuàng)建畫(huà)筆后必須將其選入DC才會(huì)在繪圖時(shí)產(chǎn)生效果。畫(huà)筆可以通過(guò)CPen對(duì)象來(lái)產(chǎn)生,通過(guò)調(diào)用CPen:CreatePen( int nPenStyle, int nWidth, COLORREF crColor )來(lái)創(chuàng)建。其中nPenStyle指名畫(huà)筆的風(fēng)格,可取如下值: PS_SOLID 實(shí)線 Creates a solid pen. PS_DASH 虛線,寬度必須為一 Creates a dashed pen. Valid only when the pen width is 1 or less, in device units. PS_DOT 點(diǎn)線,寬度必須為一 Creates a dotted pen. Valid only when the pen width is 1 or less, in device units. PS_DASHDOT 點(diǎn)劃線,寬度必須為一 Creates a pen with alternating dashes and dots. Valid only when the pen width is 1 or less, in device units. PS_DASHDOTDOT 雙點(diǎn)劃線,寬度必須為一 Creates a pen with alternating dashes and double dots. Valid only when the pen width is 1 or less, in device units. PS_NULL 空線,使用時(shí)什么也不會(huì)產(chǎn)生 Creates a null pen. PS_ENDCAP_ROUND 結(jié)束處為圓形 End caps are round. PS_ENDCAP_SQUARE 結(jié)束處為方形 End caps are square.nWidth和crColor為線的寬度和顏色。刷子是在畫(huà)封閉曲線時(shí)用來(lái)填充的顏色,例如當(dāng)你畫(huà)圓形或方形時(shí)系統(tǒng)會(huì)用當(dāng)前的刷子對(duì)內(nèi)部進(jìn)行填充。刷子可利用CBrush對(duì)象產(chǎn)生。通過(guò)以下幾種函數(shù)創(chuàng)建刷子: BOOL CreateSolidBrush( COLORREF crColor ); 創(chuàng)建一種固定顏色的刷子 BOOL CreateHatchBrush( int nIndex, COLORREF crColor ); 創(chuàng)建指定顏色和網(wǎng)格的刷子,nIndex可取以下值: HS_BDIAGONAL Downward hatch (left to right) at 45 degrees HS_CROSS Horizontal and vertical crosshatch HS_DIAGCROSS Crosshatch at 45 degrees HS_FDIAGONAL Upward hatch (left to right) at 45 degrees HS_HORIZONTAL Horizontal hatch HS_VERTICAL Vertical hatch BOOL CreatePatternBrush( CBitmap* pBitmap ); 創(chuàng)建以8*8位圖為模板的刷子 在選擇了畫(huà)筆和刷子后就可以利用Windows的作圖函數(shù)進(jìn)行作圖了,基本的畫(huà)線函數(shù)有以下幾種 CDC:MoveTo( int x, int y ); 改變當(dāng)前點(diǎn)的位置 CDC:LineTo( int x, int y ); 畫(huà)一條由當(dāng)前點(diǎn)到參數(shù)指定點(diǎn)的線 CDC:BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 畫(huà)弧線 CDC:BOOL Polyline( LPPOINT lpPoints, int nCount ); 將多條線依次序連接 基本的作圖函數(shù)有以下幾種: CDC:BOOL Rectangle( LPCRECT lpRect ); 矩形 CDC:RoundRect( LPCRECT lpRect, POINT point ); 圓角矩形 CDC:Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight ); 3D邊框 CDC:Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 扇形 CDC:Ellipse( LPCRECT lpRect ); 橢圓形 CDC:Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); CDC:Polygon( LPPOINT lpPoints, int nCount ); 多邊形 對(duì)于矩形,圓形或類(lèi)似的封閉曲線,系統(tǒng)會(huì)使用畫(huà)筆繪制邊緣,使用刷子填充內(nèi)部。如果你不希望填充或是畫(huà)出邊緣,你可以選入空刷子(NULL_PEN)或是(NULL_BRUSH)空筆。 下面的代碼創(chuàng)建一條兩象素寬的實(shí)線并選入DC。并進(jìn)行簡(jiǎn)單的作圖:.CPen
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專(zhuān)業(yè)搬家搬運(yùn)工健康保險(xiǎn)合同書(shū)
- 2025年中國(guó)干簧式浮子液位控制器市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)封墊片市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)四槍機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)半空心螺絲市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)亞銷(xiāo)酸鈉市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)絲扣式彎頭市場(chǎng)調(diào)查研究報(bào)告
- 2025年煤炭采掘機(jī)械設(shè)備項(xiàng)目建議書(shū)
- 油脂的化學(xué)性質(zhì)及應(yīng)用試題及答案
- 2025年病房護(hù)理設(shè)備器具合作協(xié)議書(shū)
- 傳統(tǒng)園林技藝智慧樹(shù)知到期末考試答案章節(jié)答案2024年華南農(nóng)業(yè)大學(xué)
- GB/T 29602-2013固體飲料
- 食品中天然有毒物質(zhì)與食品安全精課件
- 電力拖動(dòng)自動(dòng)控制系統(tǒng)-運(yùn)動(dòng)控制系統(tǒng)(第5版)習(xí)題答案
- 幼兒園童話劇“拔蘿卜”劇本
- 小學(xué)統(tǒng)編版道德與法治一年級(jí)下冊(cè)教材分析解讀課件
- 信息經(jīng)濟(jì)學(xué)-信號(hào)傳遞:斯賓塞勞動(dòng)市場(chǎng)模型課件
- 創(chuàng)傷急救-止血、包扎課件
- 豬肉品質(zhì)及其營(yíng)養(yǎng)調(diào)控
- 小學(xué)數(shù)學(xué) 西南師大版 四年級(jí)下冊(cè) 小數(shù)的加法和減法部?jī)?yōu)課件
- 四川大學(xué)-劉龍飛-畢業(yè)答辯PPT模板
評(píng)論
0/150
提交評(píng)論