已閱讀5頁(yè),還剩133頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章 Visual C+編程實(shí)例,10.1 MFC編程流程 10.2 常用FC類和消息處理 10.3 對(duì)話框的應(yīng)用 10.4 菜 單 的 應(yīng) 用 10.5 工具欄應(yīng)用,10.1 MFC編程流程,在普通的C/C+程序中,可以看到程序從main函數(shù)開(kāi)始到結(jié)束的所有代碼,但在Visual C+中MFC封裝了一部分類,同時(shí)也隱藏了一部分代碼,因此我們看不到源程序的所有代碼,例如從項(xiàng)目的所有源文件中找不到main函數(shù)。 基本對(duì)話框的MFC程序流程圖如圖10-1所示。,圖 10-1,一個(gè)MFC程序運(yùn)行的一般過(guò)程如下: (1) 生成CwinApp的一個(gè)實(shí)例(調(diào)用CwinApp的構(gòu)造函數(shù)),初始化全局對(duì)象; (2) Win32入口程序函數(shù)WinMain調(diào)用函數(shù)AfxWinMain; (3) AfxWinMain調(diào)用函數(shù)CwinApp的成員函數(shù)InitInstance; (4) AfxWinMain調(diào)用函數(shù)CwinApp的成員函數(shù)Run; (5) AfxWinMain函數(shù)返回到WinMain,WimMain結(jié)束,程序結(jié)束。,例10-1 吹泡泡程序。每當(dāng)用戶在窗口客戶區(qū)中按下鼠標(biāo)左鍵時(shí)即可產(chǎn)生一個(gè)泡泡(彩色圓形)。 設(shè)計(jì)思路:顯示一個(gè)泡泡所需的數(shù)據(jù)包括其位置和大小,在MFC中可用其包含矩形表示??稍O(shè)置一數(shù)組,每當(dāng)用戶按下鼠標(biāo)左鍵時(shí),就產(chǎn)生一個(gè)泡泡的數(shù)據(jù)并存入數(shù)組中。最后,由框架窗口類的OnPaint()函數(shù)顯示所有的泡泡。,#include #define MAX_BUBBLE 250 class CMyWnd:public CFrameWnd CRect m_rectBubbleMAX_BUBBLE; int m_nBubbleCount; public: CMyWnd() m_nBubbleCount=0;,protected: afx_msg void OnLButtonDown(UINT nFlags,CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() ; /消息映射 BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP(),/框架窗口類的成員函數(shù) void CMyWnd:OnLButtonDown(UINT nFlags,CPoint point) if(m_nBubbleCountMAX_BUBBLE) int r=rand()%50+10; CRect rect(point.x-r,point.y-r,point.x+r,point.y+r); m_rectBubblem_nBubbleCount=rect; m_nBubbleCount+; InvalidateRect(rect,FALSE); , void CMyWnd:OnPaint() CPaintDC dc(this); CBrush brushNew; CPen penNew; brushNew.CreateSolidBrush(RGB(rand()%255,rand()%255,rand()%255); penNew.CreatePen(PS_SOLID,1,RGB(255,0,0); dc.SelectObject(,for(int i=0;im_nBubbleCount;i+) dc.Ellipse(m_rectBubblei); /應(yīng)用程序類 class CMyApp:public CWinApp public: BOOL InitInstance(); ; BOOL CMyApp:InitInstance(), CMyWnd *pFrame=new CMyWnd; pFrame-Create(0,_T(“吹彩色泡泡“); pFrame-ShowWindow(m_nCmdShow); this-m_pMainWnd=pFrame; return TRUE; CMyApp ThisApp; /全局應(yīng)用程序?qū)ο?按【Ctrl+F5】運(yùn)行程序,運(yùn)行結(jié)果如圖10-2所示。,說(shuō)明: 該程序聲明了兩個(gè)類,一個(gè)是由應(yīng)用程序類CwinApp派生出來(lái)的CmyApp類,一個(gè)是由框架窗口CframeWnd類派生出來(lái)的CmyWnd類。MFC的基本類名均以字母C打頭,習(xí)慣上在為使用MFC編寫的應(yīng)用程序中的類起名時(shí)也這樣做。在程序中還聲明了一個(gè)CmyWnd類的全局對(duì)象ThisApp。,圖 10-2,在CmyWnd類中聲明了一個(gè)數(shù)組成員m_rectBubble,用于存放泡泡的數(shù)據(jù);另外,還聲明了一個(gè)整型數(shù)據(jù)成員m_nBubbleCount, 用來(lái)存放數(shù)組中泡泡的實(shí)際數(shù)量。在框架窗口類的構(gòu)造函數(shù)中該成員變量被初始化為0,由于構(gòu)造函數(shù)非常簡(jiǎn)單,因此使用了內(nèi)聯(lián)函數(shù)的形式。,OnPaint()函數(shù)用于繪制客戶區(qū)的內(nèi)容。要完成這項(xiàng)任各,需要先建立一個(gè)設(shè)備環(huán)境(Device Context),這可以通過(guò)聲明一個(gè)CpaintDC類的對(duì)象dc實(shí)現(xiàn)。在聲明語(yǔ)句中,應(yīng)將當(dāng)前窗口對(duì)象指針this 傳給CpaintDC類的構(gòu)造函數(shù),把繪圖區(qū)域確定為當(dāng)前窗口的客戶區(qū)。Windows在窗口更新、移動(dòng)、改變尺寸或移去覆蓋在其上的其它窗口對(duì)象時(shí)均會(huì)向該窗口發(fā)送WM_PAINT消息,從而觸發(fā)應(yīng)用程序調(diào)用OnPaint()函數(shù)重繪窗口客戶區(qū)。,OnPaint()函數(shù)根據(jù)數(shù)組m_rectBubble的內(nèi)容畫出一個(gè)泡泡。其中語(yǔ)句。 dc.SelectStockObject(LTGRAY_BRUSH); 用于選擇一個(gè)庫(kù)存畫刷,畫刷決定了所畫圖形(如橢圓、矩形和多邊形等)內(nèi)部的顏色。 在處理鼠標(biāo)消息的ONLButtonDown()函數(shù)中,語(yǔ)句 int r=rand()%50+10; 隨機(jī)確定了要畫出的泡泡的半徑(范圍為1050像素點(diǎn)),其中全局函數(shù)rand()可產(chǎn)生一個(gè)隨機(jī)整數(shù)。,調(diào)試: 首先,使用Visual C+集成開(kāi)發(fā)環(huán)境中的菜單選項(xiàng)“文件/新建”,并在項(xiàng)目選項(xiàng)卡中選擇“Win32 Application“。 其次,在編譯時(shí)要確定應(yīng)用程序的可執(zhí)行程序如何使用MFC的類庫(kù)。一種方法是使用共享的動(dòng)態(tài)鏈接庫(kù)(DLL)。這種鏈接方式顯著地減小了應(yīng)用程序的可執(zhí)行文件的大小,并能有效地利用系統(tǒng)資源。,用系統(tǒng)資源。 然而,動(dòng)態(tài)鏈接到MFC時(shí)要求提供Mfcnn.dll庫(kù)文件,文件名中的nn代表MFC的版本號(hào)。該文件通常在Windows System或System32文件夾下。如果一個(gè)應(yīng)用程序動(dòng)態(tài)鏈接到了MFC,但該應(yīng)用程序通常用在那些可能沒(méi)有Mfcnn.dll庫(kù)的計(jì)算機(jī)系統(tǒng)上,則應(yīng)把這個(gè)庫(kù)文件作為應(yīng)用程序包的一部分提供給用戶。Microsoft允許程序員自由地把這些庫(kù)文件附在應(yīng)用程序中。,另外,也可以選擇應(yīng)用程序靜態(tài)鏈接到MFC。靜態(tài)鏈接意味著,應(yīng)用程序不依賴于MFC庫(kù)文件的存在(但仍然可能需要Msvcrt.dll文件)。靜態(tài)鏈接的代價(jià)是可執(zhí)行文件更大,而且MFC內(nèi)存的利用可能不夠充分。 在菜單中選擇“工程”中的“設(shè)置”對(duì)話框,在對(duì)話框右方的“General”選項(xiàng)卡中通過(guò)組合框“Microsoft Foundation Classes”選擇使用MFC類庫(kù)的方法??蛇x項(xiàng)有三種,分別為“Not Using MFC(不使用MFC)“,“Use MFC in a Shared DLL(以動(dòng)態(tài)鏈接庫(kù)方式使用MFC)”和“Use MFC in a Static Library(以靜態(tài)庫(kù)方式使用MFC)”。,10.2 常用FC類和消息處理,10.2.1 常用MFC類 MFC的類構(gòu)成了一個(gè)完整的體系,該體系由一個(gè)被稱為Cobject的類作為基類,其它類大部分由該類派生而來(lái),如CWnd(窗口類)、Cdocument(文檔類)、Cfile(文件類)等。也有一部分類如字符串類,Cstring和時(shí)間類Ctime等則不從Cobject繼承。,1. 窗口公共基類CWnd 類CWnd對(duì)所有Windows窗口提供功能支持,它是所有窗口類的直接或間接父類。 一個(gè)CWnd對(duì)象和一個(gè)Windows窗口是有本質(zhì)區(qū)別的,盡管它們有密切的聯(lián)系。CWnd對(duì)象是一個(gè)概念,即類的實(shí)例,而Windows窗口則是指向Windows內(nèi)部數(shù)據(jù)結(jié)構(gòu)的一個(gè)句柄,它的創(chuàng)建和顯示要消耗系統(tǒng)資源。一個(gè)CWnd對(duì)象通過(guò)其構(gòu)造函數(shù)被創(chuàng)建,被析構(gòu)函數(shù)銷毀,而一個(gè)Windows窗口則通過(guò)CWnd的Create函數(shù)創(chuàng)建,被DestroyWindow函數(shù)銷毀。,1) 窗口句柄 (1) 窗口句柄的創(chuàng)建:當(dāng)CWnd:Create被調(diào)用時(shí),Windows窗口被創(chuàng)建,窗口句柄存放在CWnd的成員變量m_hWnd中。 (2) 程序中窗口句柄的取得:可以直接利用成員變量m_hWnd,但安全的方法是調(diào)用函數(shù)CWnd:Get(),它返回與窗口對(duì)象相關(guān)聯(lián)的句柄,并且當(dāng)窗口對(duì)象沒(méi)有關(guān)聯(lián)句柄時(shí)或當(dāng)前CWnd指針為NULL時(shí)返回空指針。 (3) 窗口句柄的銷毀:調(diào)用CWnd:DestroyWindow。,2) 窗口的大小和位置 (1) IsIconic:窗口是否處在最小化狀態(tài)。 (2) IsZoomed:判斷窗口是否在最大化狀態(tài)。 (3) MoveWindow:改變窗口的大小、位置和Z軸順序。Z軸順序指本窗口和其他窗口的覆蓋關(guān)系。,3) 窗口的狀態(tài) (1) ShowWindow:顯示或隱藏一個(gè)窗口,顯示可以有多種方式:最大化、最小化、正常顯示等。 (2) IsWindowEnabled:判斷一個(gè)窗口是否可見(jiàn)。 (3) IsWindowEnabled:判斷窗口的禁止/使能狀態(tài),禁止?fàn)顟B(tài)的窗口不能響應(yīng)用戶的鍵盤和鼠標(biāo)的輸入。 (4) EnableWindow:設(shè)置窗口的禁止/使能狀態(tài),參數(shù)為true表示使能。,4) 定時(shí)器函數(shù) (1) SetTimer:開(kāi)始一個(gè)系統(tǒng)定時(shí)器。定時(shí)器的作用是每隔指定時(shí)間發(fā)一次WM_TIMER消息。 (2) KillTimer:結(jié)束一個(gè)指定的系統(tǒng)定時(shí)器。 5) 提示函數(shù) (1) FlashWindow:閃爍窗口。 (2) MessageBox:彈出一個(gè)標(biāo)準(zhǔn)消息框。,例如:開(kāi)始一個(gè)系統(tǒng)定時(shí)器每0.5秒發(fā)一次WM_TIMER消息,代碼為: SetTimer(1,500,NULL): 其中,第一個(gè)參數(shù)表示定時(shí)器的標(biāo)識(shí),第二個(gè)參數(shù)表示發(fā)送WM_TIMER的間隔時(shí)間,第三個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),一般設(shè)為NULL??梢栽赪M_TIMER消息的處理函數(shù)OnTimer(通過(guò)ClassWizard添加)中加入處理代碼來(lái)響應(yīng)定時(shí)器消息。結(jié)束定時(shí)器的方法是調(diào)用以定時(shí)器標(biāo)識(shí)為參數(shù)的函數(shù)KillTimer,比如:KillTimer(1);,2字符串類CString Cstring類是MFC對(duì)字符串的封裝,它包含一個(gè)可變長(zhǎng)的字符序列,提供了很多串操作,使用它比使用其它字符串類型更加方便??梢哉f(shuō),幾乎每個(gè)MFC程序都要用到這個(gè)類。CString沒(méi)有繼承任何類,且其各個(gè)字符都是TCHAR類型。 CString對(duì)象可以隨著串合并操作動(dòng)態(tài)增加其長(zhǎng)度,而無(wú)須用戶來(lái)對(duì)其長(zhǎng)度進(jìn)行專門設(shè)置。CString可以看作一個(gè)串類型,而不是一個(gè)指向字符串的指針。,1) CString的構(gòu)造函數(shù) CString類擁有眾多的構(gòu)造函數(shù),用于以不同的數(shù)據(jù)類型和不同的方式構(gòu)造一個(gè)字符串對(duì)象,它們是 (1) CString(); /無(wú)參數(shù)的構(gòu)造函數(shù),產(chǎn)生一個(gè)空的Cstring對(duì)象 (2) CString(const Cstring /用一個(gè)字符重復(fù)若干次來(lái)初始化對(duì)象,(4) CString(LPCTSTR lpch,int nLength); /用一個(gè)字符數(shù)組和一定長(zhǎng)度初始化對(duì)象 (5) CString(const unsigned char *psz); /從一個(gè)無(wú)符號(hào)字符指針構(gòu)造對(duì)象 例如: CString s1; CString s2(“big“); CString s3=s2; CString s4(s2+“ “+s3);,2) CString的基本操作 Cstring的基本操作如下: (1) 求得到字符串長(zhǎng)度:GetLength返回一個(gè)int類型的數(shù)。 (2) 判斷字符串是否為空:BOOL IsEmpth() const。 (3) 強(qiáng)制字符串長(zhǎng)度為0:void Empty()。 (4) 得到字符串某位置的字符:TCHAR GetAt(int nIndex) const。 (5) 設(shè)置字符串某位置的字符:void SetAt(int nIndex,TCHAR ch)。 (6) 強(qiáng)制轉(zhuǎn)換為字符串指針類型:operator LPCTSTR。,例如,獲取字符串str最后一個(gè)字符的語(yǔ)句如下: CString str=“aabbcde“; Char c1=str.GetAt(str.GetLength()-1);,3) 串提取 串提取函數(shù)由于根據(jù)某種原則從串中提取一個(gè)子串。相關(guān)函數(shù)包括Mid,Left和Right。 (1) CString Mid(int nFirst) const; /獲取從nFirst位置字符開(kāi)始的子串 (2) CString Mid(int nFrist,int nCount) const; /獲取從nFirst位置的字符開(kāi)始包含nCount /個(gè)字符的子串(即到nFirst+nCount-1位置 /的字符為止),(3) CString Left(int nCount)const; /獲取左邊nCount個(gè)字符所構(gòu)成的子串 (4) CString Right(int nCount)const; /獲取右邊nCount個(gè)字符所構(gòu)成的子串 4) 轉(zhuǎn)換字符串 (1) void MakeUpper();/將字符串中所有字符換成大寫 (2) void MakeLower();/將字符串中所有字符換成小寫 (3) void MakeReverse();/將字符串中各字符的順序倒轉(zhuǎn) (4) void Empty(); /將字符串中所有字符刪除,5) 字符串格式化函數(shù) 字符串格式化函數(shù)是CString:Format,它根據(jù)一個(gè)參數(shù)字符串(格式控制字符串)和幾個(gè)變量來(lái)格式化一個(gè)串。 該函數(shù)的格式如下: void Format(LPCTSTR lpszFormat,.); void Format(UINT nFormatID,.);,該成員函數(shù)用于根據(jù)格式lpszFormat,用其它數(shù)據(jù)構(gòu)造一個(gè)字符串。其中省略號(hào)“.“是輸出參數(shù)表,每個(gè)參數(shù)可以是一個(gè)變量或表達(dá)式。函數(shù)Format常常用于把其它類型的變量轉(zhuǎn)換為字符串形式,或者把幾個(gè)不同類型的值合并成一個(gè)字符串的形式。,例如: CString s1,s2,s3; s1.Format(“%c“,65); s2.Format(“float:%f,int:%d,hexint:%x“,3.48,20,0xFF); s3.Format(“string:%s,formated float:%2.1f“,“hehe“,3.14159); 執(zhí)行以上代碼后s1字符串是“A“,s2字符串是“float:3.480000,int:20,hexint:ff“,s3 字符串是“string:hehe,formated float:3.1“。,3CPoint、Crect和Csize類 1) Cpoint類 MFC中的Cpoint類是對(duì)Windows結(jié)構(gòu)POINT的封裝,凡是能用POINT結(jié)構(gòu)的地方都可以用Cpoint代替。Cpoint提供了一些成員函數(shù),使得操作POINT結(jié)構(gòu)和Cpoint類更加方便。 結(jié)構(gòu)POINT表示一個(gè)屏幕上的二維點(diǎn),它的定義如下:,typedef struct tagPOINT LONG x; LONG y; POINT; 其中x和y分別是點(diǎn)的橫坐標(biāo)和縱坐標(biāo)。,2) CSize類 MFC中的Csize類是對(duì)indows結(jié)構(gòu)SIZE的封裝,凡是能用SIZE結(jié)構(gòu)的地方都可以用CSize代替。結(jié)構(gòu)SIZE表示一個(gè)矩形的長(zhǎng)度和寬度,它的定義如下: typedef struct tagSIZE int cx; int cy; SIZE; 其中cx和cy分別是矩形的長(zhǎng)度和寬度。,3) CRect類 Crect類是對(duì)Windows結(jié)構(gòu)RECT的封裝。結(jié)構(gòu)RECT表示一個(gè)矩形。 Typedef struct tagRECT LONG left; LONG top; LONG right; LONG bottom; RECT; 其中,left和top分別表示矩形左上角頂點(diǎn)的橫、縱坐標(biāo);right和bottom分別表示矩形右下角頂點(diǎn)的橫、縱坐標(biāo)。,4CPaintDC類 在CpaintDC類中封裝了大量的繪圖和文字輸出方法(成員函數(shù)) (1) 文字信息顯示。文字信息顯示的成員函數(shù)為: BOOL TextOut(int x,int y,LPCTSTR lpszString); 該函數(shù)用于在指定坐標(biāo)(x,y)處顯示字符串lpszString的內(nèi)容,顯示成功返回非0值,否則返回0。坐標(biāo)原點(diǎn)(0,0)在客戶區(qū)左上角,Y軸向下。,(2) 畫點(diǎn)。畫點(diǎn)的成員函數(shù)為 COLORREF SetPixel(int x,int y,COLORREF color); COLORREF SetPIxel(POINT point,COLORREF color); 該函數(shù)在指定坐標(biāo)處按給定顏色畫點(diǎn),返回值為原來(lái)此坐標(biāo)處的顏色。 (3) 取指定坐標(biāo)點(diǎn)的顏色。取指定坐標(biāo)點(diǎn)的顏色的函數(shù)為: COLORREF GetPixel(int x,int y)const; COLORREF GetPixel(POINT point)const; 該函數(shù)的返回值為指定坐標(biāo)處的顏色。,(4) 畫線。畫線分兩步完成:首先確定線的起始位置,然后再調(diào)用畫線函數(shù)。 用MovoTo將繪圖位置移動(dòng)到指定位置的原型為: CPoint MoveTo(int x,int y); Cpoint Moveto(POINT point); 用LineTo函數(shù)畫線的原型為: BOOL LineTo(int x,int y); BOOL LineTo(POINT point);,(5) 繪制矩形。繪制矩形的成員函數(shù)為: BOOL Rectangle(int x1,int y1,int x2,int y2); BOOL Rectangle(LPCRECT lpRect); 該函數(shù)的參數(shù)為需要繪制的矩形的左上角坐標(biāo)(x1,y1)和右下角坐標(biāo)(x2,y2)。 (6) 繪制橢圓。繪制橢圓的成員函數(shù)的原型為: BOOL Ellipse(int x1,int y1,int x2,int y2); BOOL Ellipse(LPCRECT lpRect); 該函數(shù)的參數(shù)的含義為所繪橢圓的包含矩形的左上角和右下角坐標(biāo)。,10.2.2 繪制圖形 1. 圖形對(duì)象的使用方法 普通繪圖對(duì)象使用的模式為以下4步: (1) 生成繪圖對(duì)象。 例如: Cpen pen,*op; pen.CreatePen(PS_SOLID,1,RGB(0,0,0);,這里定義的Cpen類指針op用于存儲(chǔ)繪圖前的畫筆,使繪圖結(jié)束后能夠恢復(fù)系統(tǒng)原有狀態(tài)。上面代碼中的RGB(0,0,0)是一個(gè)宏,用于定義COLORREF類型的顏色。COLORREF實(shí)際上是一個(gè)32位整數(shù)類型,用于表示顏色,其第0、1、2字節(jié)分別用于存放該顏色的紅、綠、藍(lán)色分量。如果已知某顏色的3個(gè)分量,則可使用宏RGB()構(gòu)造出該顏色: COLORREF RGB(BYTE bRed,BYTE bGreen,BYTE bBlue);,其中,第1個(gè)參數(shù)是顏色的紅色分量,第2個(gè)參數(shù)是顏色的綠色分量,第3個(gè)參數(shù)是顏色的藍(lán)色分量,各個(gè)分量的取值范圍為0255。例如:RGB(0,0,0)為黑色,RGB(255,255,255)為白色。,(2) 將繪圖對(duì)象選入繪圖設(shè)備環(huán)境。其代碼為: op=pDC-SelectObject(,(4) 繪圖工作結(jié)束后,進(jìn)行繪圖設(shè)備環(huán)境的恢復(fù)工作。其代碼為: pDC-SelectObject(op); 如果還要改變pen的參數(shù)的話,必須將pen刪除: pen.DeletObject();,2. 畫筆和畫刷 畫筆是用來(lái)畫線的工具,是Cpen類的對(duì)象。畫刷是用來(lái)填充圖形的工具,是Cbrush類的對(duì)象。 1) 畫筆 畫筆由Cpen類管理,使用Cpen類對(duì)象時(shí),需要無(wú)對(duì)其進(jìn)行初始化工作,初始化Cpen類對(duì)象的方法有以下3種: (1) 調(diào)用Cpen類的構(gòu)造函數(shù)。,(2) 調(diào)用Cpen:CreatePen(int nPenStyle, int nWidth,COLORREF crColor)函數(shù)。其中第1個(gè)參數(shù)是畫筆的樣式,可取值為: PS_SOLID /創(chuàng)建實(shí)線筆 PS_DASH /創(chuàng)建由短線構(gòu)成的虛線 PS_DOT /創(chuàng)建由點(diǎn)構(gòu)成的虛線 PS_DASHDOT /創(chuàng)建由短線和點(diǎn)構(gòu)成的虛線,(3) 調(diào)用Cpen:CreatePenIndirect()函數(shù),通過(guò)LPLOGPEN結(jié)構(gòu)來(lái)設(shè)置Cpen的屬性。例如: Cpen penRed; /說(shuō)明畫筆對(duì)象 penRed.CreatePen(PS_SOLID,3,RGB(255,0,0); /創(chuàng)建寬度為3的紅色實(shí)線畫筆 /使用新的畫筆時(shí),要保存原來(lái)的畫筆以便恢復(fù) Cpen *pOldPen; POldPen=dc.SelectObject( /恢復(fù)原來(lái)的畫筆,2) 畫刷 畫刷是用來(lái)填充圖形的工具,創(chuàng)建畫刷有兩種方法:一種是調(diào)用構(gòu)造函數(shù),另一種是調(diào)用相關(guān)的成員函數(shù)。 使用畫刷葉要定義畫刷對(duì)象,創(chuàng)建畫刷并保存原來(lái)的畫刷,在繪圖工作結(jié)束后還要恢復(fù)原來(lái)的畫刷。例如: Cbrush NewBrush; /聲明畫刷對(duì)象 Cbrush *POldBrush; /保存原畫刷的指針 NewBrush.CreateSolidBrush(PS_SOLID,21,RGB(0,0,255); /建立畫刷,Pold_Brush=pDC-SelectObject(,10.2.3 消息處理 Windows操作系統(tǒng)是一個(gè)基于消息的操作系統(tǒng),其程序總要同消息打交道,這正是Windows程序同DOS程序不同的地方。實(shí)際上,Windows系統(tǒng)通過(guò)Windows消息告訴所有應(yīng)用程序發(fā)生了什么事件,例如用戶點(diǎn)擊了鼠標(biāo)、用戶點(diǎn)擊了鍵盤的哪個(gè)鍵等,每個(gè)應(yīng)用程序都有消息處理或一組消息響應(yīng)函數(shù),用于對(duì)消息進(jìn)行響應(yīng)。,Windows操作系統(tǒng)中定義了900余個(gè)Windows消息,系統(tǒng)將用戶的輸入傳給應(yīng)用程序,然后又為每個(gè)輸入產(chǎn)生消息。此外,系統(tǒng)還為應(yīng)用程序的變化產(chǎn)生消息,如窗口的尺寸發(fā)生了變化等。應(yīng)用程序自已也可能產(chǎn)生消息,用于對(duì)應(yīng)用程序內(nèi)部發(fā)生的特殊事件進(jìn)行處理或其它應(yīng)用程序之間的通信。,系統(tǒng)向應(yīng)用程序發(fā)送消息時(shí),將向應(yīng)用程序發(fā)送個(gè)參數(shù): (1) 一個(gè)窗口的句柄:窗口句柄用于標(biāo)識(shí)窗口的一個(gè)常數(shù),Windows的每個(gè)窗口都有一個(gè)窗口句柄。消息參數(shù)中的窗口句柄標(biāo)識(shí)的是接受消息的窗口。 (2) 一個(gè)消息標(biāo)識(shí):標(biāo)識(shí)了產(chǎn)生的消息。消息標(biāo)識(shí)的例子有WM_CREATE,其中,WM_代表indows Message,是indows窗口產(chǎn)生的消息,而WM_CREATE代表窗口正在被創(chuàng)建,WM_PAINT則代表窗口的客戶區(qū)需要被重畫。,(3) 兩個(gè)32位的參數(shù):消息參數(shù)定義了Windows應(yīng)用程序處理消息所需的數(shù)據(jù)或數(shù)據(jù)所在的位置,這兩個(gè)參數(shù)的含義與具體的消息有關(guān)。消息參數(shù)可以包含一個(gè)整數(shù)、一組標(biāo)志或一個(gè)結(jié)構(gòu)對(duì)象的指針。消息參數(shù)也可以是NULL,表示消息沒(méi)有參數(shù)。 1. Windows消息分類 Windows消息大體上可以分為兩大類:一類是系統(tǒng)定義的消息,另一類是用戶自定義的消息。其中Windows系統(tǒng)定義的消息可以分為以下種:,(1) Windows消息:這類消息主要是以WM_作前綴的消息(WM_COMMAND除外,WM_COMMAND消息專門被用于處理菜單和控件發(fā)出的消息),且必須由CWnd類或CWnd類的派生類進(jìn)行處理。消息響應(yīng)函數(shù)也必須被定義在發(fā)送消息CWnd類或 CWnd派生類中??梢?jiàn),這類消息屬于面向Windows窗口的消息。,(2) 控件通知消息:這類消息主要由控件或其它子窗口發(fā)出,并對(duì)各控件或子窗口的父窗口進(jìn)行處理。這類消息屬于WM_COMMAND消息,只不過(guò)在WM_COMMAND消息的兩個(gè)消息參數(shù)中包含了每個(gè)控件的句柄、標(biāo)識(shí)(ID)和通知消息等信息。 (3) Windows命令消息:這類消息是指由菜單、工具條和加速鍵等發(fā)出的WM_COMMAND通知消息。,2. 鼠標(biāo)消息處理 移動(dòng)鼠標(biāo)或點(diǎn)擊鼠標(biāo)按鍵,Windows便產(chǎn)生一個(gè)或多個(gè)消息并將其發(fā)送給位于鼠標(biāo)光標(biāo)下的窗口。編程時(shí)常用的鼠標(biāo)消息有: WM_LBUTTONDOWN /按下鼠標(biāo)左鍵 WM_LBUTTONUP /釋放鼠標(biāo)左鍵 WM_LBUTTONDBLCLK /雙擊鼠標(biāo)左鍵 WM_RBUTTONDOWM /按下鼠標(biāo)右鍵 WM_RBUTTONUP /釋放鼠標(biāo)右鍵 WM_RBUTTONDBLCLK /雙擊鼠標(biāo)右鍵 WM_MOUSEMOVE /移動(dòng)鼠標(biāo),對(duì)應(yīng)的Wnd類的消息處理成員函數(shù)分別為: void OnLButtonDown(UINT nFlags,CPoint point); void OnLButtonUp(UINT nFlags,CPont point); void OnLButtonDblClk(UINT nFlags,Cpoint point); void OnRButtonDown(UINT nFlags,Cpoint point); void OnRButtonUp(UINT nFlags,Cpoint point); void OnRButtonDblClk(UINT nFlags,Cpoint point); void OnMouseMove(UINT nFlags,Cpoint point);,其中,參數(shù)point表示鼠標(biāo)的位置,nFlags是幾個(gè)控制鍵的狀態(tài),可以是下列值及其組合: MK_CONTROL /Ctrl鍵被按下 MK_LBUTTON /鼠標(biāo)左鍵被按下 MK_RBUTTON /鼠標(biāo)右鍵被按下 MK_SHIFT /Shift鍵被按下 例如:“MK_SHIFT|MK_LBUTTON”表示同時(shí)按下了Shift鍵和鼠標(biāo)左鍵。,10.3 對(duì)話框的應(yīng)用,對(duì)話框是一些彈出式窗口信息的彈出式窗口。它通常包含,應(yīng)用程序利用它可和用戶進(jìn)行交互式操作。對(duì)話框是應(yīng)用程序,用于顯示或提示并等待用戶輸入一個(gè)或多個(gè)控件,利用這些控件,用戶可以輸入文本、選擇選項(xiàng),并完成某一特定命令。,對(duì)話框分為模式對(duì)話框和非模式對(duì)話框兩種。模式對(duì)話框是指這種對(duì)話框出現(xiàn)時(shí),它的父窗口將暫時(shí)失效,只有處理完對(duì)話框所要求的動(dòng)作后,才會(huì)將控制權(quán)交回給父窗口。非模態(tài)對(duì)話框圖類似普通的窗口,并不壟斷用戶的輸入。在非模式對(duì)話框打開(kāi)時(shí),用戶隨時(shí)可用鼠標(biāo)點(diǎn)擊等手段激活其它窗口對(duì)象,操作完畢后再回到本對(duì)話框。本節(jié)只通過(guò)一個(gè)實(shí)例來(lái)介紹模式對(duì)話框。 圖10-3是用AppWizard生成的一個(gè)基于對(duì)話框的程序運(yùn)行界面。下面詳細(xì)介紹它的實(shí)現(xiàn)步驟:,圖 10-3,1. 產(chǎn)生對(duì)話框模板 在VC+ 6.0中選擇菜單“File”“New”或按【Ctrl+N】鍵,彈出一個(gè)對(duì)話框,如圖10-4所示。在對(duì)話框中選擇工程標(biāo)簽頁(yè),用鼠標(biāo)選中左邊列表框中的“MFC AppWizard 【exe】”一行;在“C位置:”處輸入存放源代碼的目錄的名字,單擊“確定”后出現(xiàn)圖10-5所示對(duì)話框。,圖 10-4,圖 10-5,2. 設(shè)置對(duì)話框模板 設(shè)置對(duì)話框模板一般需要以下幾步:設(shè)置對(duì)話框的屬性;向?qū)υ捒蚰0宸胖每丶?;通過(guò)控件屬性對(duì)話框設(shè)置各個(gè)控件的屬性和控件的跳表順序。 1) 設(shè)置對(duì)話框的屬性 首先調(diào)整模板的大?。喊咽髽?biāo)放在對(duì)話框模板的邊或角上,等鼠標(biāo)變?yōu)殡p箭頭形狀,拖動(dòng)鼠標(biāo)即可。 點(diǎn)擊對(duì)話框模板(而不是它上面某一控件),按【Enter】鍵彈出屬性設(shè)置對(duì)話框,圖10-6所示為該對(duì)話框的General頁(yè)。可以設(shè)置對(duì)話框的風(fēng)格和各邊界滾動(dòng)條的類型,對(duì)話框的標(biāo)題等。,圖 10-6,2) 添加控件并設(shè)置控件屬性 添加控件要借助于控件工具條(圖10-7所示),控件工具條提供了25種控件。常用的控件是:圖形控件(Picture)、靜態(tài)文本框(Static Text)、編輯框(Edit Box)、組框(Gorup Box)、按鈕(Botton)、復(fù)選框(Check Box)和單選框(Radio Button)。圖形控件用于顯示位圖(Bitmap)和圖標(biāo)(Icon);靜態(tài)文本框用于顯示靜態(tài)文本(當(dāng)然顯示的內(nèi)容可以通過(guò)程序改變);編輯框用于數(shù)據(jù)的輸入和顯示;組框用于把若干控件從視覺(jué)上組合成一組,形成友好的界面;按鈕用于用戶向程序提供命令;復(fù)選框完成開(kāi)關(guān)功能;單選框也提供選擇,它與復(fù)選框的區(qū)別是在一組單選框中,用戶只能選擇其中一個(gè),并且單選框自已不能取消自已的選擇,而只能通過(guò)選中別的單選框來(lái)取消。,圖 10-7,向?qū)υ捒蛟黾右粋€(gè)控件的方法是在控件工具條上通過(guò)單擊選擇一個(gè)控件,然后在對(duì)話框模板上按下鼠標(biāo)左鍵,控件就會(huì)按默認(rèn)大小放置在對(duì)話框上。通過(guò)單擊選中控件,把鼠標(biāo)光標(biāo)移動(dòng)到控件邊緣,等光標(biāo)呈箭頭狀時(shí)拖動(dòng)鼠標(biāo)可以改變控件的大小。刪除一個(gè)控件的方法是先選中控件后按【Delete】鍵。 設(shè)置控件的屬性:先選中控件,按【Enter】鍵(或者按鼠標(biāo)右鍵,在彈出的菜單上選擇Properties項(xiàng))彈出圖10-8所示的屬性對(duì)話窗口,在該窗口中可以設(shè)置控件的標(biāo)識(shí)符(ID),標(biāo)題(Caption)和各種風(fēng)格(Style)等。,圖 10-8,在圖10-9中,將對(duì)話框模板上的“TODO:在這是設(shè)置對(duì)話控制”靜態(tài)文本框和“確定”按鈕刪除。為對(duì)話框增加3個(gè)編輯框,它們的ID分別為ID_EDIT_ADD1,ID_EDIT_ADD2和ID_EDIT_ADD3;添加兩個(gè)靜態(tài)文本框,它們的Caption分別為“+”和“=”。另外,“+”和“=”的屬性頁(yè)對(duì)話框的Styles屬性頁(yè)要作兩點(diǎn)改變:將“X對(duì)齊文本”屬性設(shè)為Center,選擇“C中垂直”復(fù)選框,如圖10-10所示。,圖 10-9,圖 10-10,再添加兩個(gè)命令按鈕,它們的Caption分別為“計(jì)算結(jié)果”和“退出”,“計(jì)算結(jié)果”的ID是IDC_BUTTON1,“退出”的ID是IDC_BUTTON2。 3) 定義成員變量 增加了3個(gè)編輯框后,獲取三個(gè)編輯框中的輸入數(shù)字的常用方法是:先定義一些與控件相聯(lián)系的變量,然后在程序中通過(guò)這些變量來(lái)完成對(duì)控件的控制。 為控件定義變量最方便的方法是通過(guò)ClassWizard。按【Ctrl+W】鍵,彈出圖10-11所示的MFC ClassWizard對(duì)話框,選擇Member Variables窗口如圖10-12所示。,圖 10-11,圖 10-12,選中“IDC_EDIT1”,雙擊鼠標(biāo)或單擊Add Variable.按鈕,彈出圖10-13所示的對(duì)話框,這個(gè)對(duì)話框用來(lái)增加與控件相聯(lián)系的成員變量。先為變量取名為m_add1,填在Member variable name中。這個(gè)變量用來(lái)存放用戶在IDC_EDIT1編輯框中輸入的數(shù),供程序計(jì)算結(jié)果用;再選擇變量的類別填在Category中,可以為Value或Control,后者表示所定義的變量是控件類的一個(gè)對(duì)象,比如對(duì)于編輯框而言,Control類變量的類型是Cedit,前者表示所定義的變量是與控件相聯(lián)系的一個(gè)值,,這個(gè)值的含義隨不同類型的控件而不同,如對(duì)于編輯框而言,變量表示在編輯框所輸入的內(nèi)容。有的控件不能定義與之相關(guān)的Value變量,如按扭;最后選擇變量的類型填在Variable type中,變量m_add1的類型定義為double類型。 用同樣的方法可以為其它控件增加變量,最終增加的所有變量如下: IDC_EDIT1,double,a_add1 IDC_EDIT2,double,a_add2 IDC_EDIT3,double,a_add3,圖 10-13,4) 增加事件處理函數(shù) 在程序中希望點(diǎn)擊圖10-3中的命令按鈕“計(jì)算結(jié)果”時(shí),會(huì)將輸入的兩個(gè)數(shù)的和填入第3個(gè)編輯框。要想實(shí)現(xiàn)以上操作,必須為“計(jì)算結(jié)果”這個(gè)命令按鈕填加鼠標(biāo)左鍵單擊命令按扭的處理函數(shù)。這樣當(dāng)鼠標(biāo)左鍵單擊這個(gè)事件發(fā)生時(shí),就會(huì)執(zhí)行這個(gè)處理函數(shù)。 增加事件處理函數(shù)有兩種方法: (1) 通過(guò)專門的事件處理對(duì)話框,(2) 可以在10-11窗口中所示的ClassWizard的Message Maps標(biāo)簽頁(yè)為控件添加事件處理函數(shù)。 下面介紹第1種方法:選中圖10-3中“計(jì)算結(jié)果”按鈕,單擊鼠標(biāo)右鍵,在彈出菜單中選擇Events,彈出的對(duì)話框如圖10-14所示。,圖 10-14,此窗口用于添加、刪除窗口的消息和事件處理函數(shù)。本程序需為按鈕增加單擊事件處理函數(shù):雙擊左邊列表框中的“BN_CLICKED”(這時(shí)會(huì)彈出一個(gè)對(duì)話框讓用戶修改事件處理函數(shù)的名字,若保持默認(rèn)的名字,直接單擊“確定”即可)。添加完單擊事件處理函數(shù)后的對(duì)話框如圖10-15所示,注意到增加了處理函數(shù)的事件名移動(dòng)到了右邊的列表框中,在圖10-15中單擊Edit Existing按鈕可以直接進(jìn)入對(duì)話框的源文件(.CPP),并為事件響應(yīng)函數(shù)增加代碼。,圖 10-15,因?yàn)樘砑拥暮瘮?shù)全都是空的,所以需要手工添加代碼來(lái)實(shí)現(xiàn)用戶想要的功能。在下面的程序中有一個(gè)函數(shù)UpdateData()出現(xiàn)了兩次,其格式為: BOOL UpdateData(BOOL bSaveAndValidate=TRUE); UpdateData函數(shù)是MFC中的CWnd類的成員函數(shù),CWnd類是很重要的MFC類,所有窗口類都直接或間接地繼承于它。本程序主對(duì)話窗口類ClitleAdderDlg繼承了Cdialog,而Cdialog又繼承了CWnd,因此可以在程序中使用函數(shù)UpdateData。,用戶在程序運(yùn)行過(guò)程中通過(guò)鼠標(biāo)或鍵盤修改了對(duì)話框控件的狀態(tài)后,對(duì)話框中與控件相關(guān)聯(lián)的變量值并沒(méi)有馬上更新。以參數(shù)TRUE調(diào)用函數(shù)UpdateData()的作用就是更新所有與對(duì)話框圖控件相關(guān)聯(lián)的變量值,而以參數(shù)FALSE調(diào)用此函數(shù)則更新與變量相關(guān)聯(lián)的控件的顯示狀態(tài),使之與變量一致。也可以通俗地說(shuō),以TRUE和FALSE作為參數(shù)可分別實(shí)現(xiàn)控件關(guān)聯(lián)變量的“里傳”和“外傳”。下面的語(yǔ)句起刷新編輯框的作用。,void CSf1Dlg:BUTTON1() / TODO: Add extra validation here(在這里增加用戶代碼) UpdateData(true); m_add3=m_add1+m_add2; UpdateData(false); ,各關(guān)聯(lián)變量的初值在函數(shù)CSf1Dlg:CSf1Dlg(它是程序主對(duì)話框類的構(gòu)造函數(shù))中初始化,它是由程序自動(dòng)生成的。如果想修改某些變量的初值,可以在源程序中找到該函數(shù),修改某些變量的初始值。即 CSf1Dlg:CSf1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CSf1Dlg:IDD, pParent) ,/AFX_DATA_INIT(CSf1Dlg) m_add1 = 0.0f; m_add2 = 0.0f; m_add3 = 0.0f; /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); ,到此本程序編制完成,可以按【Ctrl+F5】鍵看它的運(yùn)行結(jié)果。本程序并不是很完善,但作者僅僅是想通過(guò)這個(gè)例子告訴讀者簡(jiǎn)單的對(duì)話窗口是如何編制的。如果讀者感興趣,你可以試著增加一些控件或功能使它更加完善。,10.4 菜 單 的 應(yīng) 用,菜單是一個(gè)專業(yè)程序不可缺少的程序界面構(gòu)件,對(duì)于不同的程序,這些構(gòu)件會(huì)以不同的面貌出現(xiàn)。菜單是Windows使用者天天都要見(jiàn)到的應(yīng)用元素。,菜單由上層水平列表項(xiàng)及與其相連的彈出式菜單項(xiàng)組成,用戶選擇了上層某個(gè)列表項(xiàng)時(shí),與之相連的彈出式菜單就會(huì)隨即出現(xiàn)。菜單的各個(gè)菜單項(xiàng)用來(lái)響應(yīng)用戶的鼠標(biāo)單擊而產(chǎn)生命令消息,從而提供一種用戶對(duì)程序進(jìn)行控制的方式。由于彈出式菜單平時(shí)是隱藏的,只露出上層水平列表項(xiàng),因此菜單能容納大量的操作。,菜單也是一種資源,因此要通過(guò)Developer Studio的資源編輯器編輯?!皬棾鍪讲藛巍薄ⅰ斑x項(xiàng)”和“分隔線”是構(gòu)成“樹(shù)狀菜單”的三大要素。通過(guò)“彈出式菜單”可以調(diào)出一個(gè)子菜單,分隔線用來(lái)區(qū)分一組選項(xiàng)。通過(guò)菜單中的“選項(xiàng)”可以調(diào)用應(yīng)用程序的某項(xiàng)功能。每個(gè)選項(xiàng)均有一個(gè)標(biāo)識(shí)符,而且只有選項(xiàng)才有標(biāo)識(shí)符。 在應(yīng)用程序中只對(duì)選項(xiàng)編程。當(dāng)用戶選擇了一個(gè)菜單選項(xiàng)后,就會(huì)向應(yīng)用程序發(fā)送一個(gè)命令消息WM_COMMAND。該消息的格式為 ON_COMMAND(id,memberFxn),1. 編輯菜單 選擇“插入”“資源”菜單項(xiàng)或按【Ctrl+R】鍵,在彈出的添加資源對(duì)話框中選擇“菜單”,然后按【Enter】鍵,即可向項(xiàng)目添加一個(gè)菜單資源。這時(shí),菜單資源編輯器打開(kāi),菜單編輯器的窗口如圖10-16所示。其中,灰色的橫條是菜單,周圍有一個(gè)白框的灰色塊是要添加的菜單項(xiàng)。下面分幾步編輯菜單:,圖 10-16,圖 10-17,1) 添加菜單上層水平列表項(xiàng) 單擊選中要添加的菜單項(xiàng)小灰塊,按【Enter】鍵彈出其屬性對(duì)話框(如圖10-7所示),上層水平列表項(xiàng)是具有彈出屬性的菜單項(xiàng),它沒(méi)有ID,它的“C標(biāo)題”是菜單上顯示的字符串,也叫菜單的名字。在圖中的“C標(biāo)題”處輸入了字符串“文件(&F)“,當(dāng)程序運(yùn)行時(shí)界面上將顯示“文件(F)(字符&并不顯示出來(lái)),實(shí)際上,字符&的作用是使緊跟在它后面的字符下面加下劃線。這樣按【Alt+V】鍵可激活此菜單項(xiàng),這是利用鍵盤選擇菜單項(xiàng)的一種方法。,2) 添加各上層水平列表項(xiàng)的子菜單項(xiàng) 單擊已經(jīng)添加的某一個(gè)水平列表菜單項(xiàng),其下面會(huì)出現(xiàn)一個(gè)空的菜單項(xiàng),選中這個(gè)空的菜單項(xiàng),按【Enter】鍵彈出要新加子菜單的屬性對(duì)話框,在對(duì)話框中輸入菜單項(xiàng)的ID和Caption,然后設(shè)置菜單的其它屬性。有時(shí)希望把功能相近的菜單項(xiàng)放在一起成為一組,通過(guò)一個(gè)橫的分割線把它與其它菜單項(xiàng)分割開(kāi)。產(chǎn)生一條分割線的方法是在菜單項(xiàng)的屬性對(duì)話框中選擇“分隔符”復(fù)選框。,圖 10-18,2. 為菜單單擊增加消息響應(yīng)函數(shù) 1) 方法一 設(shè)置好菜單的各個(gè)菜單項(xiàng)后,就可用ClassWizard為菜單增加消息響應(yīng)函數(shù)了。(通過(guò)按【Ctrl+W】鍵)彈出ClassWizard對(duì)話框后,選擇ClassWizard的Message Maps頁(yè)(如圖10-19所示),圖 10-19,在圖10-19中的Project和Class name組合框中分別選擇要為哪個(gè)項(xiàng)目的哪個(gè)類增加消息響應(yīng)函數(shù),所以Project 中選擇“Menutest“和Class name組合框中選擇“CmenuTestView“。在Object Ids列表框中選中一個(gè)菜單ID(比如ID_TEST_COMMAND),可以為這個(gè)ID的菜單增加單擊響應(yīng)函數(shù),方法是:選中右邊Message列表框中的COMMAND行,單擊Add Function.(或雙擊COMMAND行),在彈出的對(duì)話框中單擊OK按鈕。用同樣的操作為所有菜單項(xiàng)增加單擊響應(yīng)函數(shù)。最后單擊ClassWizard對(duì)話框的“確定”按鈕來(lái)確認(rèn)添加(或者單擊edit Code按鈕直接跳到源文件為函數(shù)增加實(shí)現(xiàn)代碼)。,例10.2 在單文檔界面的應(yīng)用程序中,添加一個(gè)“畫圖”菜單項(xiàng)包括“畫矩形”和“畫圓形”,并添加不同的顏色。 第一步:創(chuàng)建一個(gè)基于單文檔界面的應(yīng)用程序,將工程命名為MenuTest(參照1.3.2節(jié)的步驟) 第二步:在“工程管理區(qū)”中點(diǎn)擊“Resource View”,在Menu文件夾中選擇“IDR_ MAINFRAME”,雙擊菜單中添加一個(gè)菜單,如圖10-20所示。 菜單項(xiàng)“畫矩形”的ID標(biāo)識(shí)為“ID_RECT_COMMAND”。 菜單項(xiàng)“畫圓形”的ID標(biāo)識(shí)為“ID_CIRCLE_COMMAND”。,第三步:為“畫圖”菜單項(xiàng)添加消息響應(yīng)函數(shù)。按【Ctrl+w】鍵彈出如圖10-21的窗口,選擇“Pojec“為工程名“MenuTest”,選擇“Class name“為“CmenuTestView”,選擇“Object Ids:”為畫矩形的標(biāo)識(shí)“ID_RECT_COMMAND”,選中右邊Message列表框中的COMMAND行,單擊Add Function.(或雙擊COMMAND行),在彈出的對(duì)話框中單擊OK按鈕。用同樣的操作為“畫圓形”菜單項(xiàng)增加單擊響應(yīng)函數(shù)。最后單擊ClassWizard對(duì)話框的“確定”按鈕來(lái)確認(rèn)添加(或者單擊Edit Code按鈕直接跳到源文件為函數(shù)增加實(shí)現(xiàn)代碼)。,圖 10-20,圖 10-21,兩個(gè)菜單項(xiàng)的響應(yīng)函數(shù)為: void CMenuTestView:OnRectCommand() / TODO: Add your command handler code here(在這里加入命令處理代碼) CClientDC dc(this); CBrush brushNew; CPen penNew; brushNew.CreateSolidBrush(RGB(255,0,0); penNew.CreatePen(PS_SOLID,1,RGB(255,0,0); dc.SelectObject(,dc.SelectObject(,brushNew.CreateSolidBrush(RGB(0,0,255); penNew.CreatePen(PS_SOLID,1,RGB(255,0,0); dc.SelectObject( 分析:首先生成一個(gè)CclientDC類型的對(duì)象dc,Cclient繼承了設(shè)備上下文類CDC。CDC用于指定設(shè)備上下文(如窗口客戶區(qū)、打印機(jī))進(jìn)行繪圖、顯示文本等操作,而CclientDC用于在窗口客戶區(qū)畫圖和顯示文本。,BrushNew.CreateSolidBrush()是用于設(shè)置畫刷的顏色,penNew.CreatePen()是用于設(shè)置畫筆的顏色,dc.Ellipse()是畫橢圓的函數(shù)。 代碼輸入完成后,按Ctrl+F5鍵開(kāi)始運(yùn)行,運(yùn)行結(jié)果如圖10-22所示。,圖 10-22,2) 方法二 (1) 載入菜單的工作可以在CWnd類的PreCreateWindow()函數(shù)中進(jìn)行,其原型為 virtual BOOL PreCreateWindow(CREATESTRUCT,(2) 為每個(gè)菜單選項(xiàng)添加消息映射 WM_COMMAND()和消息處理成員函數(shù)。 例10.3
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026廣東茂名市電白區(qū)城鎮(zhèn)公益性崗位招聘1人(第二批)筆試備考試題及答案解析
- 2026年海西州事業(yè)單位面向社會(huì)公開(kāi)招聘工作人員筆試備考題庫(kù)及答案解析
- 2026新疆騰源水務(wù)集團(tuán)有限公司招聘4人筆試備考題庫(kù)及答案解析
- 2026年青海高等職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試備考題庫(kù)含詳細(xì)答案解析
- 2026福建龍巖漳平市招聘高校師范類畢業(yè)生101人筆試備考題庫(kù)及答案解析
- 2026上海交通大學(xué)醫(yī)學(xué)院附屬第九人民醫(yī)院招聘100人筆試備考試題及答案解析
- 2026貴州貴陽(yáng)市南明甲秀高級(jí)中學(xué)招聘臨聘教師2人筆試備考題庫(kù)及答案解析
- 2026中國(guó)鐵建高新裝備股份有限公司招聘(云南)筆試備考題庫(kù)及答案解析
- 2026年甘肅省慶陽(yáng)市中心血站招聘臨時(shí)檢驗(yàn)專業(yè)技術(shù)人員筆試備考題庫(kù)及答案解析
- 2026江蘇南京大學(xué)智能科學(xué)與技術(shù)學(xué)院辦公室文員招聘筆試備考試題及答案解析
- 工業(yè)區(qū)位·脈絡(luò)貫通-九年級(jí)地理中考二輪復(fù)習(xí)大單元思維建模與遷移
- 26新版八下語(yǔ)文必背古詩(shī)文言文21篇
- 2025陜西事業(yè)單位d類考試真題及答案
- 2025年中考英語(yǔ)真題完全解讀(重慶卷)
- 學(xué)前教育創(chuàng)意短片
- 建筑臨時(shí)設(shè)施設(shè)計(jì)方案
- 污水廠春節(jié)復(fù)工安全培訓(xùn)課件
- 廣州市2025年中考物理試題及答案
- 審貸分離管理辦法
- DB32/T 4502-2023企業(yè)質(zhì)量文化建設(shè)評(píng)價(jià)規(guī)范
- 特殊教育教師職業(yè)發(fā)展的路徑研究論文
評(píng)論
0/150
提交評(píng)論