版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第10章 Visual C+編程實例第第10章章 Visual C+編程實例編程實例10.1 MFC編程流程編程流程10.2 常用常用FC類和消息處理類和消息處理10.3 對話框的應(yīng)用對話框的應(yīng)用10.4 菜菜 單單 的的 應(yīng)應(yīng) 用用10.5 工具欄應(yīng)用工具欄應(yīng)用第10章 Visual C+編程實例10.1 MFC編程流程編程流程 在普通的C/C+程序中,可以看到程序從main函數(shù)開始到結(jié)束的所有代碼,但在Visual C+中MFC封裝了一部分類,同時也隱藏了一部分代碼,因此我們看不到源程序的所有代碼,例如從項目的所有源文件中找不到main函數(shù)。 基本對話框的MFC程序流程圖如圖10-1所示。
2、第10章 Visual C+編程實例圖 10-1程序開始生成CwinApp的一個實例,初始化全局對象WindMain()的函數(shù)體初始化句柄AfxWinMain()的函數(shù)體退出句柄消息循環(huán)退出句柄程序結(jié)束第10章 Visual C+編程實例一個MFC程序運(yùn)行的一般過程如下:(1) 生成CwinApp的一個實例(調(diào)用CwinApp的構(gòu)造函數(shù)),初始化全局對象;(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) Afx
3、WinMain函數(shù)返回到WinMain,WimMain結(jié)束,程序結(jié)束。第10章 Visual C+編程實例 例10-1 吹泡泡程序。每當(dāng)用戶在窗口客戶區(qū)中按下鼠標(biāo)左鍵時即可產(chǎn)生一個泡泡(彩色圓形)。 設(shè)計思路:顯示一個泡泡所需的數(shù)據(jù)包括其位置和大小,在MFC中可用其包含矩形表示。可設(shè)置一數(shù)組,每當(dāng)用戶按下鼠標(biāo)左鍵時,就產(chǎn)生一個泡泡的數(shù)據(jù)并存入數(shù)組中。最后,由框架窗口類的OnPaint()函數(shù)顯示所有的泡泡。第10章 Visual C+編程實例#include#define MAX_BUBBLE 250class CMyWnd:public CFrameWnd CRect m_rectBubbl
4、eMAX_BUBBLE; int m_nBubbleCount;public: CMyWnd() m_nBubbleCount=0;第10章 Visual C+編程實例 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()第10章 Visu
5、al C+編程實例/框架窗口類的成員函數(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); 第10章 Visual C+編程實例void CMyWnd:OnPaint() CPaintDC
6、 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(&brushNew); dc.SelectObject(&penNew);第10章 Visual C+編程實例for(int i=0;iCreate(0,_T(吹彩色泡泡); pFrame-ShowWindow(m_nCmdShow); this-m_pMa
7、inWnd=pFrame; return TRUE;CMyApp ThisApp; /全局應(yīng)用程序?qū)ο?按【Ctrl+F5】運(yùn)行程序,運(yùn)行結(jié)果如圖10-2所示。第10章 Visual C+編程實例 說明: 該程序聲明了兩個類,一個是由應(yīng)用程序類CwinApp派生出來的CmyApp類,一個是由框架窗口CframeWnd類派生出來的CmyWnd類。MFC的基本類名均以字母C打頭,習(xí)慣上在為使用MFC編寫的應(yīng)用程序中的類起名時也這樣做。在程序中還聲明了一個CmyWnd類的全局對象ThisApp。第10章 Visual C+編程實例圖 10-2第10章 Visual C+編程實例 在CmyWnd類中聲
8、明了一個數(shù)組成員m_rectBubble,用于存放泡泡的數(shù)據(jù);另外,還聲明了一個整型數(shù)據(jù)成員m_nBubbleCount, 用來存放數(shù)組中泡泡的實際數(shù)量。在框架窗口類的構(gòu)造函數(shù)中該成員變量被初始化為0,由于構(gòu)造函數(shù)非常簡單,因此使用了內(nèi)聯(lián)函數(shù)的形式。 第10章 Visual C+編程實例 OnPaint()函數(shù)用于繪制客戶區(qū)的內(nèi)容。要完成這項任各,需要先建立一個設(shè)備環(huán)境(Device Context),這可以通過聲明一個CpaintDC類的對象dc實現(xiàn)。在聲明語句中,應(yīng)將當(dāng)前窗口對象指針this 傳給CpaintDC類的構(gòu)造函數(shù),把繪圖區(qū)域確定為當(dāng)前窗口的客戶區(qū)。Windows在窗口更新、移動
9、、改變尺寸或移去覆蓋在其上的其它窗口對象時均會向該窗口發(fā)送WM_PAINT消息,從而觸發(fā)應(yīng)用程序調(diào)用OnPaint()函數(shù)重繪窗口客戶區(qū)。第10章 Visual C+編程實例 OnPaint()函數(shù)根據(jù)數(shù)組m_rectBubble的內(nèi)容畫出一個泡泡。其中語句。 dc.SelectStockObject(LTGRAY_BRUSH); 用于選擇一個庫存畫刷,畫刷決定了所畫圖形(如橢圓、矩形和多邊形等)內(nèi)部的顏色。 在處理鼠標(biāo)消息的ONLButtonDown()函數(shù)中,語句 int r=rand()%50+10; 隨機(jī)確定了要畫出的泡泡的半徑(范圍為1050像素點),其中全局函數(shù)rand()可產(chǎn)生一
10、個隨機(jī)整數(shù)。第10章 Visual C+編程實例 調(diào)試: 首先,使用Visual C+集成開發(fā)環(huán)境中的菜單選項“文件/新建”,并在項目選項卡中選擇“Win32 Application。 其次,在編譯時要確定應(yīng)用程序的可執(zhí)行程序如何使用MFC的類庫。一種方法是使用共享的動態(tài)鏈接庫(DLL)。這種鏈接方式顯著地減小了應(yīng)用程序的可執(zhí)行文件的大小,并能有效地利用系統(tǒng)資源。第10章 Visual C+編程實例 用系統(tǒng)資源。 然而,動態(tài)鏈接到MFC時要求提供Mfcnn.dll庫文件,文件名中的nn代表MFC的版本號。該文件通常在Windows System或System32文件夾下。如果一個應(yīng)用程序動態(tài)鏈
11、接到了MFC,但該應(yīng)用程序通常用在那些可能沒有Mfcnn.dll庫的計算機(jī)系統(tǒng)上,則應(yīng)把這個庫文件作為應(yīng)用程序包的一部分提供給用戶。Microsoft允許程序員自由地把這些庫文件附在應(yīng)用程序中。第10章 Visual C+編程實例 另外,也可以選擇應(yīng)用程序靜態(tài)鏈接到MFC。靜態(tài)鏈接意味著,應(yīng)用程序不依賴于MFC庫文件的存在(但仍然可能需要Msvcrt.dll文件)。靜態(tài)鏈接的代價是可執(zhí)行文件更大,而且MFC內(nèi)存的利用可能不夠充分。 在菜單中選擇“工程”中的“設(shè)置”對話框,在對話框右方的“General”選項卡中通過組合框“Microsoft Foundation Classes”選擇使用MFC
12、類庫的方法??蛇x項有三種,分別為“Not Using MFC(不使用MFC),Use MFC in a Shared DLL(以動態(tài)鏈接庫方式使用MFC)”和“Use MFC in a Static Library(以靜態(tài)庫方式使用MFC)”。第10章 Visual C+編程實例10.2 常用常用FC類和消息處理類和消息處理 10.2.1 常用MFC類 MFC的類構(gòu)成了一個完整的體系,該體系由一個被稱為Cobject的類作為基類,其它類大部分由該類派生而來,如CWnd(窗口類)、Cdocument(文檔類)、Cfile(文件類)等。也有一部分類如字符串類,Cstring和時間類Ctime等則不
13、從Cobject繼承。 第10章 Visual C+編程實例 1. 窗口公共基類CWnd 類CWnd對所有Windows窗口提供功能支持,它是所有窗口類的直接或間接父類。 一個CWnd對象和一個Windows窗口是有本質(zhì)區(qū)別的,盡管它們有密切的聯(lián)系。CWnd對象是一個概念,即類的實例,而Windows窗口則是指向Windows內(nèi)部數(shù)據(jù)結(jié)構(gòu)的一個句柄,它的創(chuàng)建和顯示要消耗系統(tǒng)資源。一個CWnd對象通過其構(gòu)造函數(shù)被創(chuàng)建,被析構(gòu)函數(shù)銷毀,而一個Windows窗口則通過CWnd的Create函數(shù)創(chuàng)建,被DestroyWindow函數(shù)銷毀。第10章 Visual C+編程實例 1) 窗口句柄 (1) 窗
14、口句柄的創(chuàng)建:當(dāng)CWnd:Create被調(diào)用時,Windows窗口被創(chuàng)建,窗口句柄存放在CWnd的成員變量m_hWnd中。 (2) 程序中窗口句柄的取得:可以直接利用成員變量m_hWnd,但安全的方法是調(diào)用函數(shù)CWnd:Get(),它返回與窗口對象相關(guān)聯(lián)的句柄,并且當(dāng)窗口對象沒有關(guān)聯(lián)句柄時或當(dāng)前CWnd指針為NULL時返回空指針。 (3) 窗口句柄的銷毀:調(diào)用CWnd:DestroyWindow。第10章 Visual C+編程實例 2) 窗口的大小和位置 (1) IsIconic:窗口是否處在最小化狀態(tài)。 (2) IsZoomed:判斷窗口是否在最大化狀態(tài)。 (3) MoveWindow:改
15、變窗口的大小、位置和Z軸順序。Z軸順序指本窗口和其他窗口的覆蓋關(guān)系。 第10章 Visual C+編程實例 3) 窗口的狀態(tài) (1) ShowWindow:顯示或隱藏一個窗口,顯示可以有多種方式:最大化、最小化、正常顯示等。 (2) IsWindowEnabled:判斷一個窗口是否可見。 (3) IsWindowEnabled:判斷窗口的禁止/使能狀態(tài),禁止?fàn)顟B(tài)的窗口不能響應(yīng)用戶的鍵盤和鼠標(biāo)的輸入。 (4) EnableWindow:設(shè)置窗口的禁止/使能狀態(tài),參數(shù)為true表示使能。第10章 Visual C+編程實例 4) 定時器函數(shù) (1) SetTimer:開始一個系統(tǒng)定時器。定時器的作
16、用是每隔指定時間發(fā)一次WM_TIMER消息。 (2) KillTimer:結(jié)束一個指定的系統(tǒng)定時器。 5) 提示函數(shù) (1) FlashWindow:閃爍窗口。 (2) MessageBox:彈出一個標(biāo)準(zhǔn)消息框。第10章 Visual C+編程實例 例如:開始一個系統(tǒng)定時器每0.5秒發(fā)一次WM_TIMER消息,代碼為: SetTimer(1,500,NULL): 其中,第一個參數(shù)表示定時器的標(biāo)識,第二個參數(shù)表示發(fā)送WM_TIMER的間隔時間,第三個參數(shù)是一個回調(diào)函數(shù),一般設(shè)為NULL??梢栽赪M_TIMER消息的處理函數(shù)OnTimer(通過ClassWizard添加)中加入處理代碼來響應(yīng)定時器
17、消息。結(jié)束定時器的方法是調(diào)用以定時器標(biāo)識為參數(shù)的函數(shù)KillTimer,比如:KillTimer(1); 第10章 Visual C+編程實例 2字符串類CString Cstring類是MFC對字符串的封裝,它包含一個可變長的字符序列,提供了很多串操作,使用它比使用其它字符串類型更加方便??梢哉f,幾乎每個MFC程序都要用到這個類。CString沒有繼承任何類,且其各個字符都是TCHAR類型。 CString對象可以隨著串合并操作動態(tài)增加其長度,而無須用戶來對其長度進(jìn)行專門設(shè)置。CString可以看作一個串類型,而不是一個指向字符串的指針。第10章 Visual C+編程實例 1) CStri
18、ng的構(gòu)造函數(shù) CString類擁有眾多的構(gòu)造函數(shù),用于以不同的數(shù)據(jù)類型和不同的方式構(gòu)造一個字符串對象,它們是(1) CString(); /無參數(shù)的構(gòu)造函數(shù),產(chǎn)生一個空的Cstring對象(2) CString(const Cstring&stringSrc); /用另外一個Cstring對象的值初始化對象(3) CString(TCHAR ch,int nRepeat=1); /用一個字符重復(fù)若干次來初始化對象第10章 Visual C+編程實例(4) CString(LPCTSTR lpch,int nLength); /用一個字符數(shù)組和一定長度初始化對象(5) CString(
19、const unsigned char *psz); /從一個無符號字符指針構(gòu)造對象 例如: CString s1; CString s2(big); CString s3=s2; CString s4(s2+ +s3);第10章 Visual C+編程實例2) CString的基本操作Cstring的基本操作如下:(1) 求得到字符串長度:GetLength返回一個int類型的數(shù)。(2) 判斷字符串是否為空:BOOL IsEmpth() const。(3) 強(qiáng)制字符串長度為0:void Empty()。(4) 得到字符串某位置的字符:TCHAR GetAt(int nIndex) const
20、。(5) 設(shè)置字符串某位置的字符:void SetAt(int nIndex,TCHAR ch)。(6) 強(qiáng)制轉(zhuǎn)換為字符串指針類型:operator LPCTSTR。 第10章 Visual C+編程實例 例如,獲取字符串str最后一個字符的語句如下: CString str=aabbcde; Char c1=str.GetAt(str.GetLength()-1);第10章 Visual C+編程實例 3) 串提取 串提取函數(shù)由于根據(jù)某種原則從串中提取一個子串。相關(guān)函數(shù)包括Mid,Left和Right。 (1) CString Mid(int nFirst) const; /獲取從nFirs
21、t位置字符開始的子串 (2) CString Mid(int nFrist,int nCount) const; /獲取從nFirst位置的字符開始包含nCount /個字符的子串(即到nFirst+nCount-1位置 /的字符為止)第10章 Visual C+編程實例 (3) CString Left(int nCount)const; /獲取左邊nCount個字符所構(gòu)成的子串 (4) CString Right(int nCount)const; /獲取右邊nCount個字符所構(gòu)成的子串 4) 轉(zhuǎn)換字符串 (1) void MakeUpper();/將字符串中所有字符換成大寫 (2) v
22、oid MakeLower();/將字符串中所有字符換成小寫 (3) void MakeReverse();/將字符串中各字符的順序倒轉(zhuǎn) (4) void Empty(); /將字符串中所有字符刪除第10章 Visual C+編程實例 5) 字符串格式化函數(shù) 字符串格式化函數(shù)是CString:Format,它根據(jù)一個參數(shù)字符串(格式控制字符串)和幾個變量來格式化一個串。 該函數(shù)的格式如下: void Format(LPCTSTR lpszFormat,.); void Format(UINT nFormatID,.);第10章 Visual C+編程實例 該成員函數(shù)用于根據(jù)格式lpszForm
23、at,用其它數(shù)據(jù)構(gòu)造一個字符串。其中省略號“.是輸出參數(shù)表,每個參數(shù)可以是一個變量或表達(dá)式。函數(shù)Format常常用于把其它類型的變量轉(zhuǎn)換為字符串形式,或者把幾個不同類型的值合并成一個字符串的形式。第10章 Visual C+編程實例 例如: CString s1,s2,s3; s1.Format(%c,65); s2.Format(float:%f,int:%d,hexint:%x,3.48,20,0 xFF); s 3 . F o r m a t ( s t r i n g : % s , f o r m a t e d float:%2.1f,hehe,3.14159); 執(zhí)行以上代碼后s
24、1字符串是A,s2字符串是float:3.480000,int:20,hexint:ff,s3 字符串是string:hehe,formated float:3.1。第10章 Visual C+編程實例 3CPoint、Crect和Csize類 1) Cpoint類 MFC中的Cpoint類是對Windows結(jié)構(gòu)POINT的封裝,凡是能用POINT結(jié)構(gòu)的地方都可以用Cpoint代替。Cpoint提供了一些成員函數(shù),使得操作POINT結(jié)構(gòu)和Cpoint類更加方便。 結(jié)構(gòu)POINT表示一個屏幕上的二維點,它的定義如下:第10章 Visual C+編程實例typedef struct tagPOIN
25、TLONG x;LONG y;POINT;其中x和y分別是點的橫坐標(biāo)和縱坐標(biāo)。第10章 Visual C+編程實例 2) CSize類 MFC中的Csize類是對indows結(jié)構(gòu)SIZE的封裝,凡是能用SIZE結(jié)構(gòu)的地方都可以用CSize代替。結(jié)構(gòu)SIZE表示一個矩形的長度和寬度,它的定義如下: typedef struct tagSIZE int cx; int cy; SIZE; 其中cx和cy分別是矩形的長度和寬度。第10章 Visual C+編程實例 3) CRect類 Crect類是對Windows結(jié)構(gòu)RECT的封裝。結(jié)構(gòu)RECT表示一個矩形。 Typedef struct tagR
26、ECT LONG left; LONG top; LONG right; LONG bottom; RECT; 其中,left和top分別表示矩形左上角頂點的橫、縱坐標(biāo);right和bottom分別表示矩形右下角頂點的橫、縱坐標(biāo)。 第10章 Visual C+編程實例 4CPaintDC類 在CpaintDC類中封裝了大量的繪圖和文字輸出方法(成員函數(shù)) (1) 文字信息顯示。文字信息顯示的成員函數(shù)為: BOOL TextOut(int x,int y,LPCTSTR lpszString); 該函數(shù)用于在指定坐標(biāo)( x,y) 處顯示字符串lpszString的內(nèi)容,顯示成功返回非0值,否則返
27、回0。坐標(biāo)原點(0,0)在客戶區(qū)左上角,Y軸向下。第10章 Visual C+編程實例(2) 畫點。畫點的成員函數(shù)為COLORREF SetPixel(int x,int y,COLORREF color);COLORREF SetPIxel(POINT point,COLORREF color);該函數(shù)在指定坐標(biāo)處按給定顏色畫點,返回值為原來此坐標(biāo)處的顏色。(3) 取指定坐標(biāo)點的顏色。取指定坐標(biāo)點的顏色的函數(shù)為:COLORREF GetPixel(int x,int y)const;COLORREF GetPixel(POINT point)const;該函數(shù)的返回值為指定坐標(biāo)處的顏色。第1
28、0章 Visual C+編程實例(4) 畫線。畫線分兩步完成:首先確定線的起始位置,然后再調(diào)用畫線函數(shù)。用MovoTo將繪圖位置移動到指定位置的原型為:CPoint MoveTo(int x,int y);Cpoint Moveto(POINT point);用LineTo函數(shù)畫線的原型為:BOOL LineTo(int x,int y);BOOL LineTo(POINT point);第10章 Visual C+編程實例 (5) 繪制矩形。繪制矩形的成員函數(shù)為: BOOL Rectangle(int x1,int y1,int x2,int y2); BOOL Rectangle(LPCR
29、ECT 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章 Visual C+編程實例 10.2.2 繪制圖形 1. 圖形對象的使用方法 普通繪圖對象使用的模式為以下4步: (1) 生成繪圖對象。 例如: Cpen pen,*op; pen.CreatePen(PS_SOLID,1,
30、RGB(0,0,0);第10章 Visual C+編程實例 這里定義的Cpen類指針op用于存儲繪圖前的畫筆,使繪圖結(jié)束后能夠恢復(fù)系統(tǒng)原有狀態(tài)。上面代碼中的RGB(0,0,0)是一個宏,用于定義COLORREF類型的顏色。COLORREF實際上是一個32位整數(shù)類型,用于表示顏色,其第0、1、2字節(jié)分別用于存放該顏色的紅、綠、藍(lán)色分量。如果已知某顏色的3個分量,則可使用宏RGB()構(gòu)造出該顏色: COLORREF RGB(BYTE bRed,BYTE bGreen,BYTE bBlue);第10章 Visual C+編程實例 其中,第1個參數(shù)是顏色的紅色分量,第2個參數(shù)是顏色的綠色分量,第3個參
31、數(shù)是顏色的藍(lán)色分量,各個分量的取值范圍為0255。例如:RGB(0,0,0)為黑色,RGB(255,255,255)為白色。第10章 Visual C+編程實例 (2) 將繪圖對象選入繪圖設(shè)備環(huán)境。其代碼為: op=pDC-SelectObject(&pen); 可以看出,將繪圖對象選入繪圖設(shè)備環(huán)境的方法是調(diào)用CDC:SelectObject()函數(shù),與此同時,還要保留舊的畫筆。 (3) 進(jìn)行繪圖。其代碼為: pDC-Moveto(100,100); pDC-Lineto(200,200);第10章 Visual C+編程實例 (4) 繪圖工作結(jié)束后,進(jìn)行繪圖設(shè)備環(huán)境的恢復(fù)工作。其代碼
32、為: pDC-SelectObject(op); 如果還要改變pen的參數(shù)的話,必須將pen刪除: pen.DeletObject();第10章 Visual C+編程實例 2. 畫筆和畫刷 畫筆是用來畫線的工具,是Cpen類的對象。畫刷是用來填充圖形的工具,是Cbrush類的對象。 1) 畫筆 畫筆由Cpen類管理,使用Cpen類對象時,需要無對其進(jìn)行初始化工作,初始化Cpen類對象的方法有以下3種: (1) 調(diào)用Cpen類的構(gòu)造函數(shù)。第10章 Visual C+編程實例 (2) 調(diào)用Cpen:CreatePen(int nPenStyle, int nWidth,COLORREF crCo
33、lor)函數(shù)。其中第1個參數(shù)是畫筆的樣式,可取值為: PS_SOLID /創(chuàng)建實線筆 PS_DASH /創(chuàng)建由短線構(gòu)成的虛線 PS_DOT /創(chuàng)建由點構(gòu)成的虛線 PS_DASHDOT /創(chuàng)建由短線和點構(gòu)成的虛線第10章 Visual C+編程實例(3) 調(diào)用Cpen:CreatePenIndirect()函數(shù),通過LPLOGPEN結(jié)構(gòu)來設(shè)置Cpen的屬性。例如:Cpen penRed; /說明畫筆對象penRed.CreatePen(PS_SOLID,3,RGB(255,0,0); /創(chuàng)建寬度為3的紅色實線畫筆 /使用新的畫筆時,要保存原來的畫筆以便恢復(fù)Cpen *pOldPen;POldPe
34、n=dc.SelectObject(&penRed); /以下是作圖代碼,且使用新畫筆畫線 dc.SelectObject(pOldPen); /恢復(fù)原來的畫筆第10章 Visual C+編程實例 2) 畫刷 畫刷是用來填充圖形的工具,創(chuàng)建畫刷有兩種方法:一種是調(diào)用構(gòu)造函數(shù),另一種是調(diào)用相關(guān)的成員函數(shù)。 使用畫刷葉要定義畫刷對象,創(chuàng)建畫刷并保存原來的畫刷,在繪圖工作結(jié)束后還要恢復(fù)原來的畫刷。例如:Cbrush NewBrush;/聲明畫刷對象Cbrush *POldBrush;/保存原畫刷的指針NewBrush.CreateSolidBrush(PS_SOLID,21,RGB(0,0,
35、255);/建立畫刷第10章 Visual C+編程實例 Pold_Brush=pDC-SelectObject(&NewBrush);/將畫刷選入設(shè)備文本對象 /使用畫刷 /恢復(fù)原先的畫刷對象 pDC-Selectobject(PoldBrush);第10章 Visual C+編程實例 10.2.3 消息處理 Windows操作系統(tǒng)是一個基于消息的操作系統(tǒng),其程序總要同消息打交道,這正是Windows程序同DOS程序不同的地方。實際上,Windows系統(tǒng)通過Windows消息告訴所有應(yīng)用程序發(fā)生了什么事件,例如用戶點擊了鼠標(biāo)、用戶點擊了鍵盤的哪個鍵等,每個應(yīng)用程序都有消息處理或一組消
36、息響應(yīng)函數(shù),用于對消息進(jìn)行響應(yīng)。第10章 Visual C+編程實例 Windows操作系統(tǒng)中定義了900余個Windows消息,系統(tǒng)將用戶的輸入傳給應(yīng)用程序,然后又為每個輸入產(chǎn)生消息。此外,系統(tǒng)還為應(yīng)用程序的變化產(chǎn)生消息,如窗口的尺寸發(fā)生了變化等。應(yīng)用程序自已也可能產(chǎn)生消息,用于對應(yīng)用程序內(nèi)部發(fā)生的特殊事件進(jìn)行處理或其它應(yīng)用程序之間的通信。第10章 Visual C+編程實例 系統(tǒng)向應(yīng)用程序發(fā)送消息時,將向應(yīng)用程序發(fā)送個參數(shù): (1) 一個窗口的句柄:窗口句柄用于標(biāo)識窗口的一個常數(shù),Windows的每個窗口都有一個窗口句柄。消息參數(shù)中的窗口句柄標(biāo)識的是接受消息的窗口。 (2) 一個消息標(biāo)識:
37、標(biāo)識了產(chǎn)生的消息。消息標(biāo)識的例子有WM_CREATE,其中,WM_代表indows Message,是indows窗口產(chǎn)生的消息,而WM_CREATE代表窗口正在被創(chuàng)建,WM_PAINT則代表窗口的客戶區(qū)需要被重畫。第10章 Visual C+編程實例 (3) 兩個32位的參數(shù):消息參數(shù)定義了Windows應(yīng)用程序處理消息所需的數(shù)據(jù)或數(shù)據(jù)所在的位置,這兩個參數(shù)的含義與具體的消息有關(guān)。消息參數(shù)可以包含一個整數(shù)、一組標(biāo)志或一個結(jié)構(gòu)對象的指針。消息參數(shù)也可以是NULL,表示消息沒有參數(shù)。 1. Windows消息分類 Windows消息大體上可以分為兩大類:一類是系統(tǒng)定義的消息,另一類是用戶自定義的
38、消息。其中Windows系統(tǒng)定義的消息可以分為以下種:第10章 Visual C+編程實例 (1) Windows消息:這類消息主要是以WM_作前綴的消息(WM_COMMAND除外,WM_COMMAND消息專門被用于處理菜單和控件發(fā)出的消息),且必須由CWnd類或CWnd類的派生類進(jìn)行處理。消息響應(yīng)函數(shù)也必須被定義在發(fā)送消息CWnd類或 CWnd派生類中??梢姡@類消息屬于面向Windows窗口的消息。第10章 Visual C+編程實例 (2) 控件通知消息:這類消息主要由控件或其它子窗口發(fā)出,并對各控件或子窗口的父窗口進(jìn)行處理。這類消息屬于WM_COMMAND消息,只不過在WM_COMMA
39、ND消息的兩個消息參數(shù)中包含了每個控件的句柄、標(biāo)識(ID)和通知消息等信息。 (3) Windows命令消息:這類消息是指由菜單、工具條和加速鍵等發(fā)出的WM_COMMAND通知消息。第10章 Visual C+編程實例 2. 鼠標(biāo)消息處理 移動鼠標(biāo)或點擊鼠標(biāo)按鍵,Windows便產(chǎn)生一個或多個消息并將其發(fā)送給位于鼠標(biāo)光標(biāo)下的窗口。編程時常用的鼠標(biāo)消息有: WM_LBUTTONDOWN /按下鼠標(biāo)左鍵 WM_LBUTTONUP /釋放鼠標(biāo)左鍵 WM_LBUTTONDBLCLK /雙擊鼠標(biāo)左鍵 WM_RBUTTONDOWM /按下鼠標(biāo)右鍵 WM_RBUTTONUP /釋放鼠標(biāo)右鍵 WM_RBUTT
40、ONDBLCLK /雙擊鼠標(biāo)右鍵 WM_MOUSEMOVE /移動鼠標(biāo) 第10章 Visual C+編程實例對應(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
41、 OnRButtonDblClk(UINT nFlags,Cpoint point);void OnMouseMove(UINT nFlags,Cpoint point);第10章 Visual C+編程實例 其中,參數(shù)point表示鼠標(biāo)的位置,nFlags是幾個控制鍵的狀態(tài),可以是下列值及其組合:MK_CONTROL /Ctrl鍵被按下MK_LBUTTON /鼠標(biāo)左鍵被按下MK_RBUTTON /鼠標(biāo)右鍵被按下MK_SHIFT /Shift鍵被按下例如:“MK_SHIFT|MK_LBUTTON”表示同時按下了Shift鍵和鼠標(biāo)左鍵。第10章 Visual C+編程實例10.3 對話框的應(yīng)用對
42、話框的應(yīng)用 對話框是一些彈出式窗口信息的彈出式窗口。它通常包含,應(yīng)用程序利用它可和用戶進(jìn)行交互式操作。對話框是應(yīng)用程序,用于顯示或提示并等待用戶輸入一個或多個控件,利用這些控件,用戶可以輸入文本、選擇選項,并完成某一特定命令。第10章 Visual C+編程實例 對話框分為模式對話框和非模式對話框兩種。模式對話框是指這種對話框出現(xiàn)時,它的父窗口將暫時失效,只有處理完對話框所要求的動作后,才會將控制權(quán)交回給父窗口。非模態(tài)對話框圖類似普通的窗口,并不壟斷用戶的輸入。在非模式對話框打開時,用戶隨時可用鼠標(biāo)點擊等手段激活其它窗口對象,操作完畢后再回到本對話框。本節(jié)只通過一個實例來介紹模式對話框。 圖1
43、0-3是用AppWizard生成的一個基于對話框的程序運(yùn)行界面。下面詳細(xì)介紹它的實現(xiàn)步驟:第10章 Visual C+編程實例圖 10-3 第10章 Visual C+編程實例 1. 產(chǎn)生對話框模板 在VC+ 6.0中選擇菜單“File”“New”或按【Ctrl+N】鍵,彈出一個對話框,如圖10-4所示。在對話框中選擇工程標(biāo)簽頁,用鼠標(biāo)選中左邊列表框中的“MFC AppWizard 【exe】”一行;在“C位置:”處輸入存放源代碼的目錄的名字,單擊“確定”后出現(xiàn)圖10-5所示對話框。第10章 Visual C+編程實例圖 10-4第10章 Visual C+編程實例圖 10-5 第10章 Vi
44、sual C+編程實例 2. 設(shè)置對話框模板 設(shè)置對話框模板一般需要以下幾步:設(shè)置對話框的屬性;向?qū)υ捒蚰0宸胖每丶?;通過控件屬性對話框設(shè)置各個控件的屬性和控件的跳表順序。 1) 設(shè)置對話框的屬性 首先調(diào)整模板的大?。喊咽髽?biāo)放在對話框模板的邊或角上,等鼠標(biāo)變?yōu)殡p箭頭形狀,拖動鼠標(biāo)即可。 點擊對話框模板(而不是它上面某一控件),按【Enter】鍵彈出屬性設(shè)置對話框,圖10-6所示為該對話框的General頁。可以設(shè)置對話框的風(fēng)格和各邊界滾動條的類型,對話框的標(biāo)題等。第10章 Visual C+編程實例圖 10-6第10章 Visual C+編程實例 2) 添加控件并設(shè)置控件屬性 添加控件要借助于
45、控件工具條(圖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)容可以通過程序改變);編輯框用于數(shù)據(jù)的輸入和顯示;組框用于把若干控件從視覺上組合成一組,形成友好的界面;按鈕用于用戶向程序提供命令;復(fù)選框完成開關(guān)功能;單選框也提供選擇,它與復(fù)選框的區(qū)別是在一組單選框中,用戶只能選擇其中一
46、個,并且單選框自已不能取消自已的選擇,而只能通過選中別的單選框來取消。第10章 Visual C+編程實例圖 10-7 選擇指針靜態(tài)文本框復(fù)選框組框圖形控件編輯框按鈕單選框第10章 Visual C+編程實例 向?qū)υ捒蛟黾右粋€控件的方法是在控件工具條上通過單擊選擇一個控件,然后在對話框模板上按下鼠標(biāo)左鍵,控件就會按默認(rèn)大小放置在對話框上。通過單擊選中控件,把鼠標(biāo)光標(biāo)移動到控件邊緣,等光標(biāo)呈箭頭狀時拖動鼠標(biāo)可以改變控件的大小。刪除一個控件的方法是先選中控件后按【Delete】鍵。 設(shè)置控件的屬性:先選中控件,按【Enter】鍵(或者按鼠標(biāo)右鍵,在彈出的菜單上選擇Properties項)彈出圖10
47、-8所示的屬性對話窗口,在該窗口中可以設(shè)置控件的標(biāo)識符(ID),標(biāo)題(Caption)和各種風(fēng)格(Style)等。第10章 Visual C+編程實例圖 10-8 第10章 Visual C+編程實例 在圖10-9中,將對話框模板上的“TODO:在這是設(shè)置對話控制”靜態(tài)文本框和“確定”按鈕刪除。為對 話 框 增 加 3 個 編 輯 框 , 它 們 的 I D 分 別 為ID_EDIT_ADD1,ID_EDIT_ADD2和ID_EDIT_ADD3;添加兩個靜態(tài)文本框,它們的Caption分別為“+”和“=”。另外,“+”和“=”的屬性頁對話框的Styles屬性頁要作兩點改變:將“X對齊文本”屬性
48、設(shè)為Center,選擇“C中垂直”復(fù)選框,如圖10-10所示。第10章 Visual C+編程實例 圖 10-9 第10章 Visual C+編程實例圖 10-10第10章 Visual C+編程實例 再添加兩個命令按鈕,它們的Caption分別為“計算結(jié)果”和“退出”,“計算結(jié)果”的ID是IDC_BUTTON1,“退出”的ID是IDC_BUTTON2。 3) 定義成員變量 增加了3個編輯框后,獲取三個編輯框中的輸入數(shù)字的常用方法是:先定義一些與控件相聯(lián)系的變量,然后在程序中通過這些變量來完成對控件的控制。 為控件定義變量最方便的方法是通過ClassWizard。按 【 C t r l + W
49、 】 鍵 , 彈 出 圖 1 0 - 11 所 示 的 M F C ClassWizard對話框,選擇Member Variables窗口如圖10-12所示。第10章 Visual C+編程實例圖 10-11 第10章 Visual C+編程實例圖 10-12 第10章 Visual C+編程實例 選中“IDC_EDIT1”,雙擊鼠標(biāo)或單擊Add Variable.按鈕,彈出圖10-13所示的對話框,這個對話框用來增加與控件相聯(lián)系的成員變量。先為變量取名為m_add1,填在Member variable name中。這個變量用來存放用戶在IDC_EDIT1編輯框中輸入的數(shù),供程序計算結(jié)果用;再
50、選擇變量的類別填在Category中,可以為Value或Control,后者表示所定義的變量是控件類的一個對象,比如對于編輯框而言,Control類變量的類型是Cedit,前者表示所定義的變量是與控件相聯(lián)系的一個值, 第10章 Visual C+編程實例 這個值的含義隨不同類型的控件而不同,如對于編輯框而言,變量表示在編輯框所輸入的內(nèi)容。有的控件不能定義與之相關(guān)的Value變量,如按扭;最后選擇變量的類型填在Variable type中,變量m_add1的類型定義為double類型。 用同樣的方法可以為其它控件增加變量,最終增加的所有變量如下: IDC_EDIT1,double,a_add1
51、IDC_EDIT2,double,a_add2 IDC_EDIT3,double,a_add3第10章 Visual C+編程實例圖 10-13 第10章 Visual C+編程實例 4) 增加事件處理函數(shù) 在程序中希望點擊圖10-3中的命令按鈕“計算結(jié)果”時,會將輸入的兩個數(shù)的和填入第3個編輯框。要想實現(xiàn)以上操作,必須為“計算結(jié)果”這個命令按鈕填加鼠標(biāo)左鍵單擊命令按扭的處理函數(shù)。這樣當(dāng)鼠標(biāo)左鍵單擊這個事件發(fā)生時,就會執(zhí)行這個處理函數(shù)。 增加事件處理函數(shù)有兩種方法: (1) 通過專門的事件處理對話框第10章 Visual C+編程實例 (2) 可以在10-11窗口中所示的ClassWizard
52、的Message Maps標(biāo)簽頁為控件添加事件處理函數(shù)。 下面介紹第1種方法:選中圖10-3中“計算結(jié)果”按鈕,單擊鼠標(biāo)右鍵,在彈出菜單中選擇Events,彈出的對話框如圖10-14所示。第10章 Visual C+編程實例圖 10-14 第10章 Visual C+編程實例 此窗口用于添加、刪除窗口的消息和事件處理函數(shù)。本程序需為按鈕增加單擊事件處理函數(shù):雙擊左邊列表框中的“BN_CLICKED”(這時會彈出一個對話框讓用戶修改事件處理函數(shù)的名字,若保持默認(rèn)的名字,直接單擊“確定”即可)。添加完單擊事件處理函數(shù)后的對話框如圖10-15所示,注意到增加了處理函數(shù)的事件名移動到了右邊的列表框中,
53、在圖10-15中單擊Edit Existing按鈕可以直接進(jìn)入對話框的源文件(.CPP),并為事件響應(yīng)函數(shù)增加代碼。第10章 Visual C+編程實例圖 10-15第10章 Visual C+編程實例 因為添加的函數(shù)全都是空的,所以需要手工添加代碼來實現(xiàn)用戶想要的功能。在下面的程序中有一個函數(shù)UpdateData()出現(xiàn)了兩次,其格式為: BOOL UpdateData(BOOL bSaveAndValidate=TRUE); UpdateData函數(shù)是MFC中的CWnd類的成員函數(shù),CWnd類是很重要的MFC類,所有窗口類都直接或間接地繼承于它。本程序主對話窗口類ClitleAdderDl
54、g繼承了Cdialog,而Cdialog又繼承了CWnd,因此可以在程序中使用函數(shù)UpdateData。第10章 Visual C+編程實例 用戶在程序運(yùn)行過程中通過鼠標(biāo)或鍵盤修改了對話框控件的狀態(tài)后,對話框中與控件相關(guān)聯(lián)的變量值并沒有馬上更新。以參數(shù)TRUE調(diào)用函數(shù)UpdateData()的作用就是更新所有與對話框圖控件相關(guān)聯(lián)的變量值,而以參數(shù)FALSE調(diào)用此函數(shù)則更新與變量相關(guān)聯(lián)的控件的顯示狀態(tài),使之與變量一致。也可以通俗地說,以TRUE和FALSE作為參數(shù)可分別實現(xiàn)控件關(guān)聯(lián)變量的“里傳”和“外傳”。下面的語句起刷新編輯框的作用。第10章 Visual C+編程實例void CSf1Dlg
55、:BUTTON1() / TODO: Add extra validation here(在這里增加用戶代碼)UpdateData(true);m_add3=m_add1+m_add2;UpdateData(false);第10章 Visual C+編程實例 各關(guān)聯(lián)變量的初值在函數(shù)CSf1Dlg:CSf1Dlg(它是程序主對話框類的構(gòu)造函數(shù))中初始化,它是由程序自動生成的。如果想修改某些變量的初值,可以在源程序中找到該函數(shù),修改某些變量的初始值。即 CSf1Dlg:CSf1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CSf1Dlg:IDD, pParent)
56、第10章 Visual C+編程實例/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 Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); 第10章 Visual C+編程實例 到此本程序編制完成,可以按【Ctrl+F5】鍵看它的運(yùn)行結(jié)果。本程序并不是很完善,但作者僅僅是想通過這個例子告訴讀者簡單的對話窗口是
57、如何編制的。如果讀者感興趣,你可以試著增加一些控件或功能使它更加完善。第10章 Visual C+編程實例10.4 菜菜 單單 的的 應(yīng)應(yīng) 用用 菜單是一個專業(yè)程序不可缺少的程序界面構(gòu)件,對于不同的程序,這些構(gòu)件會以不同的面貌出現(xiàn)。菜單是Windows使用者天天都要見到的應(yīng)用元素。第10章 Visual C+編程實例 菜單由上層水平列表項及與其相連的彈出式菜單項組成,用戶選擇了上層某個列表項時,與之相連的彈出式菜單就會隨即出現(xiàn)。菜單的各個菜單項用來響應(yīng)用戶的鼠標(biāo)單擊而產(chǎn)生命令消息,從而提供一種用戶對程序進(jìn)行控制的方式。由于彈出式菜單平時是隱藏的,只露出上層水平列表項,因此菜單能容納大量的操作。
58、第10章 Visual C+編程實例 菜單也是一種資源,因此要通過Developer Studio的資源編輯器編輯?!皬棾鍪讲藛巍薄ⅰ斑x項”和“分隔線”是構(gòu)成“樹狀菜單”的三大要素。通過“彈出式菜單”可以調(diào)出一個子菜單,分隔線用來區(qū)分一組選項。通過菜單中的“選項”可以調(diào)用應(yīng)用程序的某項功能。每個選項均有一個標(biāo)識符,而且只有選項才有標(biāo)識符。 在應(yīng)用程序中只對選項編程。當(dāng)用戶選擇了一個菜單選項后,就會向應(yīng)用程序發(fā)送一個命令消息WM_COMMAND。該消息的格式為 ON_COMMAND(id,memberFxn)第10章 Visual C+編程實例 1. 編輯菜單 選擇“插入”“資源”菜單項或按【C
59、trl+R】鍵,在彈出的添加資源對話框中選擇“菜單”,然后按【Enter】鍵,即可向項目添加一個菜單資源。這時,菜單資源編輯器打開,菜單編輯器的窗口如圖10-16所示。其中,灰色的橫條是菜單,周圍有一個白框的灰色塊是要添加的菜單項。下面分幾步編輯菜單: 第10章 Visual C+編程實例圖 10-16 要添加的菜單項菜單第10章 Visual C+編程實例圖 10-17第10章 Visual C+編程實例 1) 添加菜單上層水平列表項 單擊選中要添加的菜單項小灰塊,按【Enter】鍵彈出其屬性對話框(如圖10-7所示),上層水平列表項是具有彈出屬性的菜單項,它沒有ID,它的“C標(biāo)題”是菜單上
60、顯示的字符串,也叫菜單的名字。在圖中的“C標(biāo)題”處輸入了字符串“文件(&F),當(dāng)程序運(yùn)行時界面上將顯示“文件(F)(字符&并不顯示出來),實際上,字符&的作用是使緊跟在它后面的字符下面加下劃線。這樣按【Alt+V】鍵可激活此菜單項,這是利用鍵盤選擇菜單項的一種方法。第10章 Visual C+編程實例 2) 添加各上層水平列表項的子菜單項 單擊已經(jīng)添加的某一個水平列表菜單項,其下面會出現(xiàn)一個空的菜單項,選中這個空的菜單項,按【Enter】鍵彈出要新加子菜單的屬性對話框,在對話框中輸入菜單項的ID和Caption,然后設(shè)置菜單的其它屬性。有時希望把功能相近的菜單項放在一起成為一組,通過一個橫的分割線把它與其它菜單項分割開。產(chǎn)生一條分割線的方法是在菜單項的屬性對話框
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《國際貨運(yùn)代理》題集
- 《規(guī)范漢字書寫傳承中華文化之美》班會教案3篇
- 3.4.1 二次函數(shù)y=ax2+k與y=a(x-h)2的圖象與性質(zhì) 同步練習(xí)
- 【人教】期末模擬卷01【九年級上下冊】
- 專項24-弧、弦、角、距的關(guān)系-重難點題型
- 特殊作業(yè)票管理制度
- 語法專題十六 主謂一致【考點精講精練】-2023年中考語法一點通(學(xué)生版)
- 青花瓷的教案8篇
- 新生軍訓(xùn)心得體會
- 暑假自我總結(jié)
- 中鹽青海昆侖堿業(yè)有限公司柯柯鹽礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 監(jiān)理檢測與試驗儀器設(shè)備一覽表實用文檔
- 部編版五年級上冊第二單元《習(xí)作“漫畫”老師》一等獎創(chuàng)新教案
- 醫(yī)院影像科醫(yī)療安全不良事件報告制度
- GB/T 7364-1987石蠟易碳化物試驗法
- 2023年聚合物材料表征測試題庫
- 碟式離心機(jī)圖片集
- 2020人文素養(yǎng)試題及答案
- 高血壓(英文版)-課件
- 冷庫安裝與維修4-1(冷庫的安全防護(hù))課件
- 螺紋一螺紋基礎(chǔ)知識
評論
0/150
提交評論