




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 主要學(xué)習(xí)內(nèi)容: 文本輸出 繪圖 用戶界面編程 位圖(圖像)應(yīng)用 動(dòng)態(tài)鏈接庫(kù) 如果可能:vc與matlab混合編程第一章:VC+編程基礎(chǔ)一、初識(shí)vc+ 1、第一個(gè)vc+程序 (1)vc+6.0集成開發(fā)環(huán)境介紹(IDE) 標(biāo)題欄 菜單欄 工具欄 工作區(qū)窗口 源代碼窗口 輸出窗口 狀態(tài)欄 (2)用框架文件編輯器創(chuàng)建應(yīng)用程序框架 框架文件編輯器 MFC(Microsoft Foundation Classes)AppWizard 過程。 (3)程序介紹 平臺(tái)可視,程序所包含的編輯器、瀏覽器、編譯器、連接器、調(diào)試器等全部可視 資源集成,諸多最基本的Resource如菜單等不需編程直接可進(jìn)行編輯 方便的
2、類創(chuàng)建和管理,封裝了窗口函數(shù)、消息、控件、菜單、對(duì)話框、圖形設(shè)置接口等。 (4)四大類介紹CMainFrame是CApp類的主程序窗口,也就是程序的一個(gè)框架。 CApp中如無特殊的要求不用加什么代碼CDocument一般和CView一起使用,這樣的程序叫文檔/視圖結(jié)構(gòu)。 CDocument中加的代碼主要是和你的文檔內(nèi)容有關(guān)的,如文檔中信息(對(duì)象)等,需要處理的一般有文檔內(nèi)容的編輯、刪除、添加、序列化(讀寫文件)等方面的代碼。 CView的工作就是把你的CDocument中的內(nèi)容顯示在文檔上,主要處理的是顯示方面的工作。 2、第一個(gè)程序編譯、鏈接和執(zhí)行情況。 3、在程序中創(chuàng)建接口對(duì)象(用戶如何控
3、制程序,比如用菜單、對(duì)話框等) 4、添加消息處理代碼 MessageBox(“hello, how are you!”) 第一個(gè)程序擴(kuò)展: -消息機(jī)制和消息的引入 MessageBox(hello, how are you 2!); 添加鼠標(biāo)按下的消息響應(yīng): OnLButtonDown程序開始捕獲消息派發(fā)消息處理消息程序結(jié)束消息源1消息源2消息源n退出消息?NY基于事件驅(qū)動(dòng)的程序模型二、二、vc+的工作機(jī)制簡(jiǎn)介的工作機(jī)制簡(jiǎn)介1、 Windows消息機(jī)制消息機(jī)制(1)消息來源)消息來源 Windows應(yīng)用程序的消息來源有以下四種: (1)輸入消息:包括鍵盤和鼠標(biāo)的輸入。 (2)控制消息:用來與W
4、indows的控制對(duì)象,如列表框、按鈕、檢查框等進(jìn)行雙向通信。 (3)系統(tǒng)消息:對(duì)程序化的事件或系統(tǒng)時(shí)鐘中斷作出反應(yīng)。 (4)用戶消息:這是程序員自己定義并在應(yīng)用程序中主動(dòng)發(fā)出的,一般由應(yīng)用程序的某一部分內(nèi)部處理。 VC+中存在幾種系統(tǒng)定義的消息分類,不同的前綴符號(hào)經(jīng)常用于識(shí)別不同的消息類,系統(tǒng)定義的消息宏前綴如下:l BM:按鈕控制消息;l CB:組合框控制消息;l DM:默認(rèn)下壓式按鈕控制消息;l EM:編輯控制消息;l LB:列表框控制消息;l SBM:滾動(dòng)條控制消息;l WM:窗口控制消息。1.2 理解理解Windows消息機(jī)制消息機(jī)制1、消息的組成:一個(gè)消息由一個(gè)消息名稱(UINT)
5、,和兩個(gè)參數(shù)(WPARAM,LPARAM)。當(dāng)用戶進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時(shí)系統(tǒng)都會(huì)發(fā)送消息到某一個(gè)窗口。2、誰將收到消息:一個(gè)消息必須由一個(gè)窗口接收一個(gè)消息必須由一個(gè)窗口接收。在窗口的過程(WNDPROC)中可以對(duì)消息進(jìn)行分析,對(duì)自己感興趣的消息進(jìn)行處理。例如你希望對(duì)菜單選擇進(jìn)行處理那么你可以定義對(duì)WM_COMMAND進(jìn)行處理的代碼,如果希望在窗口中進(jìn)行圖形輸出就必須對(duì)WM_PAINT進(jìn)行處理。 3、未處理的消息到那里去了:M$為窗口編寫了默認(rèn)的窗口過程,這個(gè)窗口過程將負(fù)責(zé)處理那些你不處理消息。正因?yàn)橛辛诉@個(gè)默認(rèn)窗口過程我們才可以利用Windows的窗口進(jìn)行開發(fā)而不必過多關(guān)注窗口各種
6、消息的處理(有消息處理機(jī)制)。 例如窗口在被拖動(dòng)時(shí)會(huì)有很多消息發(fā)送,而我們都可以不予理睬讓系統(tǒng)自己去處理。 4、窗口句柄:說到消息就不能不說窗口句柄,系統(tǒng)通過窗口句柄來在整個(gè)系統(tǒng)中唯一標(biāo)識(shí)一個(gè)窗口,發(fā)送一個(gè)消息時(shí)必須指定一個(gè)窗口句柄表明該消息由那個(gè)窗口接收。而每個(gè)窗口都會(huì)有自己的窗口過程,所以用戶的輸入就會(huì)被正確的處理。例如有兩個(gè)窗口共用一個(gè)窗口過程代碼,你在窗口一上按下鼠標(biāo)時(shí)消息就會(huì)通過窗口一的句柄被發(fā)送到窗口一而不是窗口二。1.2 理解理解Windows消息機(jī)制消息機(jī)制 什么是消息機(jī)制: 系統(tǒng)將會(huì)維護(hù)一個(gè)或多個(gè)消息隊(duì)列,所有產(chǎn)生的消息都回被放入或是插入隊(duì)列中。系統(tǒng)會(huì)在隊(duì)列中取出每一條消息,
7、根據(jù)消息的接收句柄而將該消息發(fā)送給擁有該窗口的程序的消息循環(huán)。 1.2 理解理解Windows消息機(jī)制消息機(jī)制 每一個(gè)運(yùn)行的程序都有自己的消息循環(huán),在循環(huán)中得到屬于自己的消息并根據(jù)接收窗口的句柄調(diào)用相應(yīng)的窗口過程。而在沒有消息時(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)該程序沒有消息通知時(shí)getMessage就不會(huì)返回,也就不會(huì)占用系統(tǒng)的CPU時(shí)間。 開始執(zhí)行初始化從消息隊(duì)列取得一個(gè)消息終止執(zhí)行當(dāng)
8、前消息是否“退出”消息?是否本程序要處理的消息?默認(rèn)處理處理消息YNYNWindows程序和消息的基本流程2消息的數(shù)據(jù)結(jié)構(gòu)消息的數(shù)據(jù)結(jié)構(gòu)消息的數(shù)據(jù)結(jié)構(gòu)MSG的定義如下:typedef struct tagMSGHWND hwnd;/用以檢索消息的窗口句柄,如為NULL,/則可以檢索所有駐留在消息隊(duì)列中的消息UINT message;/消息值WPARAM wParam;/包含有關(guān)消息的附加信息LPARAM lParam;/隨不同的消息而有所不同DWORD time;/消息送到隊(duì)列的時(shí)間POINT pt;/消息發(fā)送時(shí),屏幕光標(biāo)的位置MSG;其中:typedef struct tagPOINTLON
9、G x,y;POINT; 3消息隊(duì)列消息隊(duì)列支持隊(duì)列特征的消息驅(qū)動(dòng)模型如圖所示。用戶交互內(nèi)核USER窗口1窗口函數(shù)WndProc消息隊(duì)列窗口2窗口函數(shù)WndProc消息隊(duì)列圖 支持隊(duì)列特征的消息驅(qū)動(dòng)模型 4常用消息常用消息Windows程序常用的消息有:WM_LBUTTONDOWN:?jiǎn)螕羰髽?biāo)左鍵時(shí)產(chǎn)生的消息;WM_LBUTTONUP:放開鼠標(biāo)左鍵時(shí)產(chǎn)生的消息;WM_RBUTTONDOWN:?jiǎn)螕羰髽?biāo)右鍵時(shí)產(chǎn)生的消息;WM_RBUTTONUP:放開鼠標(biāo)右鍵時(shí)產(chǎn)生的消息;WM_LBUTTONDBLCLK:雙擊鼠標(biāo)左鍵時(shí)產(chǎn)生的消息;WM_RBUTTONDBLCLK:雙擊鼠標(biāo)右鍵時(shí)產(chǎn)生的消息;WM_KE
10、YDOWN:按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息,附加信息參數(shù)wParam為按下鍵的虛擬鍵碼,虛擬鍵碼用以標(biāo)識(shí)按下或釋放的鍵,lParam記錄按鍵的重復(fù)次數(shù)、掃描碼等狀態(tài)信息; WM_CHAR:按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息,附加信息參數(shù)wParam為按下鍵的ASCII碼,lParam的意思同上; WM_CREATE:CreateWindows函數(shù)產(chǎn)生的消息; WM_CLOSE:關(guān)閉窗口時(shí)產(chǎn)生的消息; WM_DESTROY:消除窗口時(shí)由DestroyWindows()發(fā)出的消息; WM_QUIT:退出應(yīng)用程序時(shí)由PostQuitMessage()發(fā)出的消息; WM_PAINT:Windows系統(tǒng)需要重繪
11、時(shí)產(chǎn)生的消息。對(duì)象與句柄對(duì)象與句柄常見Windows對(duì)象的句柄如下所示:Windows對(duì)象相關(guān)句柄設(shè)備環(huán)境HDC 窗口HWND菜單HMENU光標(biāo)HCURSOR畫筆HPEN畫刷HBRUSH字體HFONT圖標(biāo)HICON位圖HBITMAP調(diào)色板HPALETTE文件HFILE區(qū)域HRGN加速鍵表HACCEL 文本、繪圖等的函數(shù)為OnDraw pDC-TextOut(20,10,This is the first VC programe!); 屬性的改變 pDC-SetTextColor(RGB(255,0,0); /pDC-SetBkMode(TRANSPARENT);pDC-SetBkColor(R
12、GB(0,0,255);第二個(gè)例子-類、對(duì)象的引入 CFont fn1; CFont *pfn1; fn1.CreatePointFont(60,Arial,pDC); pfn1=pDC-SelectObject(&fn1); pDC-SetTextColor(RGB(0,125,0); pDC-TextOut(20,300,1234567890); pDC-SelectObject(pfn1);如何改變字體? -引入類、對(duì)象第二章 MFC編程基礎(chǔ)1 MFC類庫(kù)簡(jiǎn)介類庫(kù)簡(jiǎn)介2 使用使用AppWizard開發(fā)開發(fā)MFC應(yīng)用程序應(yīng)用程序1 MFC類庫(kù)簡(jiǎn)介 下面是MFC類庫(kù)的類定義文件afx
13、win .h中的類說明部分源代碼,從中我們可以了解MFC類庫(kù)中都有哪些類以及它們的層次關(guān)系。代碼如下:class CSize;class CPoint;class CRect;/CObject/CException/CSimpleExceptionclass CResourceException; / Win resource failure exceptionclass CUserException; / Message Box alert and stop operationclass CGdiObject; / CDC drawing toolclass CPen; / a pen /
14、HPEN wrapperclass CBrush; / a brush / HBRUSH wrapperclass CFont; / a font / HFONT wrapperclass CBitmap; / a bitmap / HBITMAP wrapperclass CPalette; / a palette / HPALLETE wrapperclass CRgn; / a region / HRGN wrapperclass CDC; / a Display Context / HDC wrapperclass CClientDC; / CDC for client of wind
15、owclass CWindowDC; / CDC for entire windowclass CPaintDC; / embeddable BeginPaint struct helperclass CMenu; / a menu / HMENU wrapperclass CCmdTarget; / a target for user commandsclass CWnd; / a window / HWND wrapper class CDialog; / a dialog/ standard windows controls class CStatic; / Static control
16、class CButton; / Button control class CListBox; / ListBox controlclass CCheckListBox; / special listbox with checksclass CComboBox; / ComboBox controlclass CEdit; / Edit controlclass CScrollBar; / ScrollBar control/ frame windowsclass CFrameWnd; / standard SDI frameclass CMDIFrameWnd; / standard MDI
17、 frameclass CMDIChildWnd; / standard MDI childclass CMiniFrameWnd; / half-height caption frame wnd/ views on a documentclass CView; / a view on a documentclass CScrollView; / a scrolling viewclass CWinThread; / thread base classclass CWinApp; / application base classclass CDocTemplate; / template fo
18、r document creationclass CSingleDocTemplate; / SDI supportclass CMultiDocTemplate; / MDI supportclass CDocument; / main document abstraction/ Helper classesclass CCmdUI; / Menu/button enablingclass CDataExchange; / Data exchange and validation contextc l a s s C C o m m a n d L i n e I n f o ; /Comm
19、andLine parsing helperclass CDocManager; / CDocTemplate manager object下面按功能對(duì)MFC庫(kù)中的常用類做一簡(jiǎn)要介紹。1根類根類CObject Microsoft基本類庫(kù)中的大多數(shù)類都是由CObject類派生而來的。CObject對(duì)所有由它派生出的類提供了有用的基本服務(wù)。2MFC應(yīng)用結(jié)構(gòu)類應(yīng)用結(jié)構(gòu)類MFC應(yīng)用結(jié)構(gòu)類用于構(gòu)造一個(gè)應(yīng)用的框架,對(duì)大多數(shù)應(yīng)用提供了通用功能。我們可以在框架中填寫對(duì)于應(yīng)用特定的功能。AppWizard可以產(chǎn)生幾種類型的應(yīng)用,所有這些都以不同的方式使用應(yīng)用框架。1) 應(yīng)用程序和線程支持類2) 命令例程類3)
20、文檔類4) 文檔模板類3窗口、對(duì)話框和控件類窗口、對(duì)話框和控件類1) CWnd類2) 框架窗口類3) 對(duì)話框類4) 視圖類5) 控件類6) 控件條類4菜單類菜單類5繪圖和打印類繪圖和打印類6簡(jiǎn)單的數(shù)據(jù)類型類簡(jiǎn)單的數(shù)據(jù)類型類7數(shù)組、列表和映射類數(shù)組、列表和映射類8文件和數(shù)據(jù)庫(kù)類文件和數(shù)據(jù)庫(kù)類1) 文件文件I/O類類2) DAO類類3) ODBC類類9Internet和網(wǎng)絡(luò)類和網(wǎng)絡(luò)類Internet和網(wǎng)絡(luò)類允許與其他使用ISAPI的計(jì)算機(jī)或一個(gè)Windows Socket交換信息。10OLE類類11調(diào)試和異常類調(diào)試和異常類 2、使用MFC進(jìn)行基礎(chǔ)編程 (1)、文本輸出 (2)、繪圖 (3)、用戶界
21、面設(shè)計(jì) (4)位圖(圖像)使用 (5)動(dòng)態(tài)鏈接庫(kù)第三章第三章 文本輸出文本輸出 3.1 和和GUI(Graphical User Interface)有關(guān)有關(guān)的各種對(duì)象的各種對(duì)象在Windows中有各種GUI對(duì)象(字體、畫筆、刷子等等),當(dāng)你在進(jìn)行繪圖就需要利用這些對(duì)象。在vc+中GUI被抽象成為設(shè)備環(huán)境DC(Device Context),在文本輸出、繪圖等時(shí)常使用。 (1) 自帶設(shè)備環(huán)境對(duì)象輸出 文本、繪圖等的函數(shù)為OnDraw 自帶設(shè)備環(huán)境 自帶畫筆等對(duì)象 直接使用 pDC-TextOut(20,10,This is the first VC programe!); 屬性的改變pDC-S
22、etTextColor(RGB(255,0,0); /pDC-SetBkMode(TRANSPARENT);pDC-SetBkColor(RGB(0,0,255); (2)創(chuàng)建新的設(shè)備環(huán)境輸出 在Windows中使用GUI對(duì)象必須遵守一定的規(guī)則。 首先需要?jiǎng)?chuàng)建一個(gè)合法的對(duì)象,不同的對(duì)象創(chuàng)建方法不同。 然后需要將該GUI對(duì)象選入DC中,同時(shí)保存DC中原來的GUI對(duì)象。如果選入一個(gè)非法的對(duì)象將會(huì)引起異常。 在使用完后應(yīng)該恢復(fù)原來的對(duì)象,這一點(diǎn)特別重要,如果保存一個(gè)臨時(shí)對(duì)象在DC中,而在臨時(shí)對(duì)象被銷毀后可能引起異常。 注意:每一個(gè)對(duì)象在重新創(chuàng)建前必須銷毀對(duì)象的創(chuàng)建CFont fn;CFont *pf
23、n;fn.CreatePointFont(Da_ziti,ziti,pDC);pfn=pDC-SelectObject(&fn);pDC-SetTextColor(r_color);pDC-TextOut(x_zuobiao,y_zuobiao,1234567890);pDC-SelectObject(pfn); 函數(shù)的添加 CFont fn1; CFont *pfn1; fn1.CreatePointFont(60,Arial,pDC); pfn1=pDC-SelectObject(&fn1); pDC-SetTextColor(RGB(0,125,0); pDC-TextO
24、ut(20,300,1234567890); pDC-SelectObject(pfn1); 3.2 通過設(shè)計(jì)函數(shù)使通過設(shè)計(jì)函數(shù)使OnDraw()精煉()精煉 (1)設(shè)計(jì)函數(shù)text1() void CT1View:text1() /CDC *pDC; / pDC=GetDC(); /先不用這兩句看效果CFont fn1;CFont *pfn1;fn1.CreatePointFont(600,Arial,pDC);pfn1=pDC-SelectObject(&fn1);pDC-SetTextColor(RGB(0,125,0);pDC-TextOut(20,300,9876000);p
25、DC-SelectObject(pfn1); 1.先通過(點(diǎn)擊)類的相關(guān)向?qū)Вc(diǎn)擊鼠標(biāo)右鍵)添加。 3.2 通過設(shè)計(jì)函數(shù)使通過設(shè)計(jì)函數(shù)使OnDraw()精煉()精煉2.通過手動(dòng)添加 (1) 在*View.cpp文件的相應(yīng)處(習(xí)慣為最后)添加Text1(), (2) 函數(shù)設(shè)計(jì)完“戴帽” (3) 在*View.h注冊(cè) 變量的添加與此類似,比較兩種方法的優(yōu)缺點(diǎn)。 通過界面快速尋找相應(yīng)的函數(shù)? 如何知道一個(gè)類包含的函數(shù)、變量?(定義一個(gè)對(duì)象就可見) (2)設(shè)計(jì)函數(shù)可以改變參量的函數(shù) text2(CDC *pDC,int x_zuobiao,int y_zuobiao,int Da_ziti, LPCT
26、STR ziti, COLORREF r_color,CString str) CFont fn;CFont *pfn;fn.CreatePointFont(Da_ziti,ziti,pDC);pfn=pDC-SelectObject(&fn);pDC-SetTextColor(r_color);pDC-TextOut(x_zuobiao,y_zuobiao,str);pDC-SelectObject(pfn); 3.3 創(chuàng)建新的字體創(chuàng)建新的字體 處理字體的最簡(jiǎn)單的方法是使用GDI的常備字體,如要自己設(shè)置顯示字體的風(fēng)格需要?jiǎng)?chuàng)建一個(gè)CFont的對(duì)象,具體步驟如下: 定義定義CFont對(duì)象
27、對(duì)象 調(diào)用調(diào)用CreateFont()函數(shù)創(chuàng)建字體函數(shù)創(chuàng)建字體 將創(chuàng)建的字體對(duì)象選入將創(chuàng)建的字體對(duì)象選入DC,并保存前一個(gè),并保存前一個(gè)被選入被選入DC的字體對(duì)象的字體對(duì)象BOOL CreateFont( int nHeight, /字體所需高度,為0使用默認(rèn)值 int nWidth, /字符的寬度值,為0表示設(shè)備的縱橫比匹配可用字體的縱橫比 int nEscapement, /字體轉(zhuǎn)義,指定轉(zhuǎn)義矢量和x軸的夾角 int nOrientation, /字體方向,指定字符基線和x軸的夾角(以0.1度為單位) int nWeight, /字體厚度 BYTE bItalic,/是否斜體,布爾值 BY
28、TE bUnderline, /是否帶有下劃線,布爾值 BYTE cStrikeOut, /是否帶有刪除線,布爾值 BYTE nCharSet, /使用的字符集 BYTE nOutPrecision, /輸出精度 BYTE nClipPrecision, /剪取精度 BYTE nQuality, /輸出質(zhì)量 BYTE nPitchAndFamily, /字符間距和字族 LPCTSTR lpszFacename /字體的字樣名稱);參數(shù):nWeight 字體厚度常用參數(shù)有:FW_NORMAL、FW_REGULAR和FW_BOLD nCharSet 字符集常用參數(shù)有:ANSI_SHARSET、DE
29、FAULT_CHARSET、SYBOL_CHARSET、SHIFTJIS_CHARSET、OEM_CHARSET等nOutPrecision 輸出精確度定義。輸出與請(qǐng)求使用的字體的高度、寬度、字符走向、轉(zhuǎn)義和字間距的匹配程度,常用參數(shù)有:OUT_CHARACTER_PRECIS、 OUT_STRING_PRECIS、OUT_DEFAULT_PRECIS、OUT_DEVICE_PRECIS等等。nClipPrecision 剪取精度定義。如何剪取部分位于剪取區(qū)域之外的字符,常用參數(shù)有:CLIP_CHARACTER_PRECIS、 CLIP_DEFAULT_PRECIS、CLIP_MASK。nQu
30、ality 字體的輸出質(zhì)量定義。GDI怎樣才能將邏輯字體屬性與實(shí)際物理字體匹配起來,常用參數(shù)值:DEFAULT_QUALITY、DRAFT_QUALITY和PROOF_QUALITY。 nPitchAndFamily 通常是字符間距與字族的組合值,如:DEFAULT_PITCH|FF_DONTCARE void CT1View:text3(CDC *pDC) CFont NewFont;NewFont.CreateFont (65,65,0,0,FW_DONTCARE, true,false,false,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_C
31、HARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, 黑體);CFont *pOldFont;pOldFont=pDC-SelectObject (&NewFont);pDC-TextOut(10,10, 自創(chuàng)的傾斜黑體字); pDC-SelectObject(pOldFont); 3.4 格式化文本格式化文本 Windows系統(tǒng)不參與窗口客戶區(qū)的管理,這就意味著在客戶區(qū)內(nèi)輸出文本,應(yīng)用程序必須管理換行,后繼字符的位置等輸出格式。由于文本字符串的間隔不僅取決于由用戶指定的字體,而且取決于目標(biāo)設(shè)備的分辨率,因此在繪制任何
32、文本之前,需要計(jì)算文本坐標(biāo)。 函數(shù)說明函數(shù)說明 GetTextExtent當(dāng)選用當(dāng)前嵌入DC中的字體繪圖時(shí),獲得給定字符串將占據(jù)的空間寬度和高度GetTextMetrics為當(dāng)前選入DC的字體獲取類型為TEXTMETRIC的數(shù)據(jù),此數(shù)據(jù)結(jié)構(gòu)中包含基本的字體測(cè)量信息 使用GetTextExtent()函數(shù)可以獲得所選字體中的字符串的寬度和高度,函數(shù)的格式如下: CSize GetTextExtent(LPCTSTR lpszString, int nCount) 其中:lpszString是字符串的指針,nCount是所包括的字符數(shù)。返回值CSize是包含兩個(gè)成員的結(jié)構(gòu):cx是字符串的寬度,cy
33、是字符串的高度。 void CT1View:text4(CDC *pDC) int x,y;x=850; y=100;CString str1=格式化文本一; CString str2=格式化文本二;text2(pDC,x,y,200,Arial,RGB(0,0,126),str1); /取得第一個(gè)字符串的像素長(zhǎng)度 CSize strSize=pDC-GetTextExtent (str1,str1.GetLength (); /設(shè)定第二個(gè)字符串的輸出位置X坐標(biāo)x+=strSize.cx;text2(pDC,x,y,400,Arial,RGB(255,0,1),str2); 確定換行時(shí)文本坐標(biāo)
34、確定換行時(shí)文本坐標(biāo)GetTextMetric()函數(shù)用來計(jì)算涉及確定兩行文本之間的間隔。當(dāng)然你可以使用GetTextExtent()函數(shù)的返回值中的字符串的高度來決定兩行文本之間的間隔,但這種方式并不精確。文本中行之間的間隔包括兩部分:字符單元高度和外部行距大小。這兩部分內(nèi)容都包含在TEXTMETRIC數(shù)據(jù)結(jié)構(gòu)中。調(diào)用GetTextMetric()函數(shù)可以獲得當(dāng)前字體的TEXTMETRIC結(jié)構(gòu)的內(nèi)容,并計(jì)算文本行間隔方式如下:注:系統(tǒng)內(nèi)字體行間距無法控制,自創(chuàng)字體可以。注:系統(tǒng)內(nèi)字體行間距無法控制,自創(chuàng)字體可以。TEXTMETRIC tm;pDC-GetTextMetrics(&tm)
35、;int LineHeight=tm.tmHeight+tm.tmExternalLeading ; 數(shù)據(jù)類型TEXTMETRIC的定義和圖示如下: typedef struct tagTEXTMETRIC /* tm */ int tmHeight; int tmAscent; int tmDescent; int tmInternalLeading; int tmExternalLeading; int tmAveCharWidth; int tmMaxCharWidth; int tmWeight; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStr
36、uckOut; BYTE tmFirstChar; BYTE tmLastChar; BYTE tmDefaultChar; BYTE tmBreakChar; BYTE tmPitchAndFamily; BYTE tmCharSet; int tmOverhang; int tmDigitizedAspectX; int tmDigitizedAspectY; TEXTMETRIC; void CT1View:text5(CDC *pDC) CString outstr4;outstr0=第一個(gè)紫紅色的使用系統(tǒng)字體的文本串;outstr1=第二個(gè)紅色黑體文本串;outstr2=第三個(gè)藍(lán)色文
37、本串;outstr3=最后一個(gè)大號(hào)字,加下劃線的斜體文本串;int x=0;int y=0;/輸出第一行 pDC-SetTextColor (RGB(255,0,255); pDC-TextOut (x,y,outstr0);/輸出第二行 TEXTMETRIC tm; pDC-GetTextMetrics (&tm); y=y+tm.tmHeight+100*tm.tmExternalLeading ; CFont NewFont1;NewFont1.CreateFont (30,10,0,0,FW_HEAVY, false,false,false,ANSI_CHARSET, OUT_
38、DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, 黑體);CFont *pOldFont;pOldFont=pDC-SelectObject (&NewFont1);pDC-SetTextColor(RGB(255,0,0);pDC-TextOut(x,y,outstr1); /輸出第三個(gè)文本串 pDC-GetTextMetrics (&tm); pDC-SetTextColor (RGB(0,0,255); CSize strSize=pDC-GetTextExte
39、nt (outstr1,outstr1.GetLength (); x+=strSize.cx; pDC-TextOut (x,y,outstr2); / 輸出第四個(gè)文本串 pDC-GetTextMetrics (&tm); x=0; y=y+tm.tmHeight+60*tm.tmExternalLeading ; CFont NewFont2;NewFont2.CreateFont (30,0,0,0,FW_NORMAL, true,true,false,ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_Q
40、UALITY, DEFAULT_PITCH|FF_DONTCARE, 大號(hào)字);pDC-SelectObject (&NewFont2);pDC-SetTextColor(RGB(155,155,155);pDC-TextOut(x,y,outstr3); pDC-SelectObject (pOldFont); pDC-SelectObject (&NewFont2); pDC-SetTextColor(RGB(155,155,155); pDC-TextOut(x,y,outstr3); pDC-SelectObject (pOldFont); 其它格式文本 CDC提供了以
41、下幾個(gè)函數(shù)用于文本輸出: 函數(shù)說明函數(shù)說明 TextOut在屏幕的固定位置用當(dāng)前設(shè)定的顏色、字體、對(duì)齊方式輸出文本 TabbedTextOut與TextOut的功能相似,唯一差別是可以為支持制表符而定義一組制表站位置DrawText在一個(gè)區(qū)域中顯示并格式化文本ExtTextOut與TextOut的功能相似,但可以使用該函數(shù)刪去超出矩形的正文,用正文背景填充矩形,調(diào)整字符間隔 繪圖簡(jiǎn)單的圖形輸出簡(jiǎn)單的圖形輸出CDC提供了基本的繪圖操作函數(shù),如畫點(diǎn),畫線,畫圓,畫矩形,畫多邊形等等,簡(jiǎn)單介紹如下:點(diǎn)點(diǎn)pDC-SetPixel(CPoint(200,200),RGB(255,0,0); /在200,
42、200的位置畫一個(gè)紅點(diǎn)線線pDC-MoveTo(0,0); /直線起點(diǎn)的坐標(biāo)為(0,0)pDC-LineTo (100,100); /從起點(diǎn)(0,0)到終點(diǎn)(100,100)畫一條直線pDC-MoveTo (0,100);pDC-LineTo (100,0);矩形矩形CRect rect(0,0,100,100); /畫一個(gè)長(zhǎng)100,寬100的矩形pDC-Rectangle(&rect);圓和橢圓圓和橢圓CRect rect(0,0,100,100); /在矩形內(nèi)畫圓pDC-Ellipse(&rect); CRect rect(0,0,50,100); /在矩形內(nèi)畫橢圓 pDC
43、-Ellipse(&rect); 多邊形多邊形 CPoint poly4; /畫一個(gè)平行四邊形 poly0=CPoint(0,0); poly1=CPoint(50,50); poly2=CPoint(50,100); poly3=CPoint(0,50); pDC-Polygon(poly,4); 其它圖形其它圖形 CDC:Pie / 畫餅圖 CDC:Chord /畫弦 CDC:FillRect /用指定顏色填充矩形且不畫邊線 CDC:Draw3DRect /用于繪制名種3D邊框 CDC:RoundRect /畫圓角矩形 繪圖函數(shù)的具體的使用方法可以查閱MSDN。庫(kù)存對(duì)象庫(kù)存對(duì)象不管
44、以不管以CDC類指針形式還是以類指針形式還是以CDC子類對(duì)象形式獲得設(shè)備上下對(duì)象,子類對(duì)象形式獲得設(shè)備上下對(duì)象,系統(tǒng)都默認(rèn)指定了一組繪圖屬性系統(tǒng)都默認(rèn)指定了一組繪圖屬性庫(kù)存對(duì)象庫(kù)存對(duì)象使用使用SelectStockObject()函數(shù)可以直接選擇庫(kù)存對(duì)象修改系統(tǒng)默認(rèn)值函數(shù)可以直接選擇庫(kù)存對(duì)象修改系統(tǒng)默認(rèn)值 作一個(gè)菜單,并建立客戶區(qū) void CT1View:OnMENUClient() CClientDC dc(this); /this 指針將CExam5View賦值給創(chuàng)建的dc對(duì)象 CRect rect; GetClientRect(rect);dc.Rectangle(&rect)
45、;dc.Ellipse(&rect); 文本輸出(三)文本輸出(三)1、坐標(biāo)原點(diǎn)的改變、坐標(biāo)原點(diǎn)的改變CDC:SetViewportOrg()函數(shù)函數(shù)例如,下面程序語句段將坐標(biāo)系的原點(diǎn)移動(dòng)到客戶區(qū)中央:例如,下面程序語句段將坐標(biāo)系的原點(diǎn)移動(dòng)到客戶區(qū)中央:CRect rect;GetClientRect(rect);pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);下面語句為將坐標(biāo)系原點(diǎn)移到客戶區(qū)某個(gè)坐標(biāo)點(diǎn)處(像素)下面語句為將坐標(biāo)系原點(diǎn)移到客戶區(qū)某個(gè)坐標(biāo)點(diǎn)處(像素)pDC-SetViewportOrg(100,100);2、坐標(biāo)系模式
46、的改變坐標(biāo)系模式的改變 pDC- SetMapMode(MM_LOMETRIC); 3、成員變量、乘員函數(shù)的添加選擇WorkSpace的ClassView標(biāo)簽,右鍵單擊C*View類。在彈出的快捷菜單中選擇Add Member Variable菜單項(xiàng),增加int型的公有成員變量m_Mode,該變量表示采用的映像模式。在C*View類的構(gòu)造函數(shù)C*View()中將變量m_Mode初始化為MM_TEXT。4、通過對(duì)成員變量的控制,改變輸出模式4.1添加菜單項(xiàng)控制成員變量菜單1:m_Mode=MM_LOMETRIC; InvalidateRect (NULL,true); /客戶區(qū)重新繪制or In
47、validateRect (NULL,false); /客戶區(qū)添加繪制菜單2:m_Mode=MM_TEXT; InvalidateRect (NULL,true);4、通過對(duì)成員變量的控制,改變輸出模式4.2通過鼠標(biāo)控制成員變量打開ClassWizard,選擇Message Map標(biāo)簽,Class Name 列表中選擇C*View,Object IDS列表中選擇C*View,Messages列表中選擇WM_LBUTTONDOWN,單擊“Add Function”按鈕,添加鼠標(biāo)左鍵雙擊消息映射。單擊“Edit Code”按鈕,添加處理代碼,用映像模式左鍵下:m_Mode= MM_ISOTROPI
48、C;InvalidateRect (NULL,true); /客戶區(qū)重新繪制同理右鍵下:m_Mode=MM_TEXT;InvalidateRect (NULL,true);*回憶WM_事件設(shè)計(jì)用戶界面1 菜單和加速鍵菜單和加速鍵2 工具欄工具欄3 狀態(tài)欄狀態(tài)欄4 對(duì)話框欄對(duì)話框欄5 ReBar欄欄 6 通用對(duì)話框通用對(duì)話框習(xí)題習(xí)題 1 菜單和加速鍵1.1 使用菜單使用菜單1編輯菜單資源編輯菜單資源編輯由AppWizard自動(dòng)生成的菜單資源,進(jìn)行如下操作:(1) 選擇項(xiàng)目工作區(qū)的ResourceView標(biāo)簽,切換到資源視圖。(2) 選擇菜單資源類型。(3) 雙擊菜單資源IDR_MAINFRAME
49、,將彈出菜單編輯窗口。(4) 編輯當(dāng)前菜單。刪除:要?jiǎng)h除某個(gè)菜單項(xiàng)或彈出菜單,可用鼠標(biāo)單擊該菜單或用上下光標(biāo)鍵來回選擇,然后按Del鍵刪除。 插入:如果插入新菜單項(xiàng),可選定窗口中的空白菜單框后按回車。也可以在選擇一個(gè)已有的菜單項(xiàng)時(shí)按Ins鍵,在該菜單項(xiàng)上方插入一個(gè)空白菜單項(xiàng),然后雙擊該菜單項(xiàng),將彈出Properties對(duì)話框,如圖1所示。 動(dòng)態(tài)添加菜單1、找到某個(gè)具體的菜單 CWnd *pParent=GetParent();/得到主框窗口CMenu *pMenu=pParent-GetMenu ();/得到所有菜單 CMenu *SubMenu1=pMenu-GetSubMenu(4);/第
50、5列菜單2、添加 CMenu menu;menu.CreatePopupMenu();SubMenu1AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,add_1);menu.Detach();/Detach();意思是從這個(gè)菜單對(duì)象中把里面的菜單剝脫出去GetParent()-DrawMenuBar();3、添加后與代碼相連 參閱相關(guān)資料 CreatePopupMen該函數(shù)創(chuàng)建一個(gè)下拉式菜單、子菜單或快捷菜單。此菜單最初是空的,但可用函數(shù)InsertMenultem來插入或追加菜單項(xiàng)。也可用函數(shù)InsertMenu來插入菜單項(xiàng),用AppendMenu來追加菜單項(xiàng)。
51、函數(shù)原型:HMENU CreatePopupMenu(VOID)CMenu:AppendMenu追加新項(xiàng)目到菜單的末尾。BOOL AppendMenu( UINT nFlags, /常數(shù),表示增加菜單項(xiàng)的類型UINT_PTR nIDNewItem , / 新增加項(xiàng)的ID值LPCTSTR lpszNewItem / 指向新菜單項(xiàng)標(biāo)題的指針 );第一個(gè)參數(shù):MF_CHECKED, MF_DISABLED, MF_ENABLED, MF_POPUP,MF_STRINGAppendMenu(MF_STRING,70001,yourMenuName);動(dòng)態(tài)刪除菜單1、找到某個(gè)具體的菜單 CWnd *pP
52、arent=GetParent();/得到主框窗口CMenu *pMenu=pParent-GetMenu ();/得到所有菜單 CMenu *SubMenu1=pMenu-GetSubMenu(4);/第5列菜單2、刪除 CMenu menu;int n=GetParent()-GetMenu()-GetSubMenu(4)-GetMenuItemCount();GetParent()-GetMenu()-GetSubMenu(4)-RemoveMenu(n-1,MF_BYPOSITION);menu.Detach();/Detach();意思是從這個(gè)菜單對(duì)象中把里面的菜單剝脫出去GetPa
53、rent()-DrawMenuBar(); 3更新命令用戶界面消息1) 更新機(jī)制MFC應(yīng)用程序框架引入了更新命令用戶界面消息來專門解決這一問題。那么更新命令用戶界面是如何工作的呢?對(duì)于每一個(gè)菜單項(xiàng),將對(duì)應(yīng)如下兩種消息(參看圖2): l COMMAND; l UPDATE_COMMAND_UI。2) 用戶界面更新機(jī)制編程操作如下:(1) 激活ClassWizard,選擇Message Map標(biāo)簽。(2) 在Object IDs列表中選擇ID_菜單項(xiàng),在Messages列表中雙擊UPDATE_ COMMAND_UI條目,彈出Add Member Function對(duì)話框,單擊OK按鈕接收默認(rèn)函數(shù)名。
54、(3) 編輯接口更新成員函數(shù),程序清單如下所示:void C*View:OnUpdate*(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here /點(diǎn)擊菜單時(shí)給某菜單項(xiàng)前打?qū)μ?hào)標(biāo)記pCmdUI-CheckMenuItem(ID_*,MF_CHECKED); or pCmdUI-SetCheck(1); pCmdUI-SetCheck(0);思考:如何使本菜單點(diǎn)擊過一定次數(shù)(3次)后打?qū)μ?hào)標(biāo)記?/點(diǎn)擊某菜單時(shí)使該菜單項(xiàng)無效,k_xuan為某菜單點(diǎn)擊標(biāo)記 pCmdUI-Enable(false); /直接無效 pC
55、mdUI-Enable(k_xuan0)?false:true);思考:如何控制使其他菜單無效?打?qū)μ?hào)?1.2 定義加速鍵定義加速鍵具體操作如下:(1) 將項(xiàng)目工作區(qū)切換到資源視圖,選擇Accelerator資源類型,雙擊IDR_MAINFRAME加速鍵資源,打開加速鍵編輯窗口。(2) 編輯加速鍵資源。在ID下拉列表框中選擇AFX_ID_*,在Key一欄中輸入R,選擇Ctrl復(fù)選框和VirtKey單選按鈕,以完成加速鍵設(shè)置,如圖4所示。(3) 關(guān)閉加速鍵編輯窗口。圖4 加速鍵編輯窗口 添加右鍵菜單1. 在資源中添加菜單。 添加一個(gè)PopUP Menu,然后增加幾個(gè)你需要的子菜單。 給這個(gè)菜單取
56、個(gè)名字。如 IDR_POPUP2. 在View中添加OnRButtonDown事件處理程序,添加如下代碼: CMenu menu; menu.LoadMenu(IDR_MENU1); CMenu *pPopup = menu.GetSubMenu(0); ClientToScreen(&point);/轉(zhuǎn)換客戶區(qū)坐標(biāo)到屏幕坐標(biāo) pPopup-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x,point.y, this);如果要增加子菜單的處理程序,可以在某個(gè)子菜單上右鍵點(diǎn)擊,選擇創(chuàng)建事件處理程序。也可以自己手工創(chuàng)建。舉例函數(shù)
57、原型:BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, CONST RECT* prcRect);hMenu:被顯示的快捷菜單的句柄。此句柄可為調(diào)用CreatePopupMenu創(chuàng)建的新快捷菜單的句柄,也可以為調(diào)用GetSubMenu取得的與一個(gè)已存在菜單項(xiàng)相聯(lián)系的子菜單的句柄。uFlags:一種指定功能選項(xiàng)的位標(biāo)志。用下列標(biāo)志位之一來確定函數(shù)如何水平放置快捷菜單:TPM_CENTERALIGN:按參數(shù)x指定的坐標(biāo)水平居中放置快捷菜單。TPM_LEFTALIGN:快捷菜單的
58、左邊界與由參數(shù)X指定的坐標(biāo)對(duì)齊。TPM_RIGHTALIGN:快捷菜單的右邊界與由參數(shù)X指定的坐標(biāo)對(duì)齊。用下列標(biāo)志位之一來確定函數(shù)如何垂直放置快捷菜單:TPM_BOTTOMALIGN:快捷菜單的下邊界與由參數(shù)y指定的坐標(biāo)對(duì)齊。TPM_TOPALIGN:快捷菜單的上邊界與由參數(shù)y指定的坐標(biāo)對(duì)齊。TPM_VCENTERALIGN;按參數(shù)y指定的坐標(biāo)垂直居中放置快捷菜單用下列標(biāo)志位之一來確定在菜單沒有父窗口的情況下用戶的選擇:TPM_NONOTIFY:?jiǎn)螕舨藛雾?xiàng)時(shí)函數(shù)不發(fā)送通知消息。TPM_RETURNCMD;將用戶所選菜單項(xiàng)的標(biāo)識(shí)符返回到返回值里。 (新添加)菜單的功能1、添加int型成員變量m_
59、times、m_ID_old2、添加消息映射函數(shù)BOOL CT1View:OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) WPARAM MenuId=GetCurrentMessage()-wParam; /獲得當(dāng)前被單擊的菜單的ID號(hào)if(MenuId=(m_ID_old+m_times) & nCode=CN_COMMAND)/菜單項(xiàng)被單擊 /根據(jù)strMenuName進(jìn)行不同處理MessageBox(hello); return CView:OnCmdMsg(nID, nC
60、ode, pExtra, pHandlerInfo);3、 建立“添加”菜單 void CT1View:OnMENUAdd() CWnd *pParent=GetParent();/得到主框窗口CMenu *pMenu=pParent-GetMenu ();/得到所有菜單 CMenu *SubMenu1=pMenu-GetSubMenu(4);/第5列菜單if(m_times=0)int n=SubMenu1-GetMenuItemCount();m_ID_old=SubMenu1-GetMenuItemID(n-1);m_times+;/*int n=SubMenu1-GetMenuItemCount();CString str;int str1=SubMenu1-GetMenuItemID(n-1);str.Format( %d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 籃球單挑協(xié)議書
- 聯(lián)建工廠協(xié)議書
- 洗車臺(tái)租賃合同協(xié)議書
- 續(xù)租場(chǎng)地協(xié)議書
- 良田翻耕協(xié)議書
- 道路通信協(xié)議書
- 聯(lián)盟合作協(xié)議書
- 建房搭竹架安全協(xié)議書
- 店鋪?zhàn)赓U合同書協(xié)議書
- 肉羊供應(yīng)協(xié)議書
- 索緒爾“語言”和“言語”概念研究
- 2024年地板行業(yè)分析報(bào)告及未來發(fā)展趨勢(shì)
- 2020-心肌梗死后心力衰竭防治專家共識(shí)
- 經(jīng)典成語故事望梅止渴
- 二級(jí)公立醫(yī)院績(jī)效考核三級(jí)手術(shù)目錄(2020版)
- 2023年遼寧省普通高等學(xué)校招生錄取普通類本科批(物理學(xué)科類)投檔最低分
- 電裝 集團(tuán)禁限用工藝-2013版
- 燃?xì)庑袠I(yè)數(shù)字化轉(zhuǎn)型與智能化
- 牙周檢查記錄表
- 外墻涂料吊籃施工方案
- 《新時(shí)代勞動(dòng)教育》新時(shí)代勞動(dòng)價(jià)值觀
評(píng)論
0/150
提交評(píng)論