【正文】
碼)。命令消息與其他消息不同,它可被更廣泛的對象如文檔、文檔模板、應(yīng)用程序?qū)ο蟆⒋翱诤鸵晥D等處理。它的消息處理函數(shù)原型為:afx_msg void OnPaint()。我們以處理鼠標(biāo)左鍵按下消息的函數(shù)OnLButtonDown( )為例來進(jìn)行說明。我們以WM_CHAR 消息的處理函數(shù)OnChar( )為例來進(jìn)行說明。MFC 類庫以消息名為基礎(chǔ)形成這些處理函數(shù)的名稱,這些函數(shù)的名稱都以前綴“On”開始。MFC 首先調(diào)用CWinApp 類的成員函數(shù)ExitInstance( ),然后調(diào)用靜態(tài)對象的析構(gòu)函數(shù),包括CWinApp 對象,最后退出應(yīng)用程序,將控制權(quán)交給操作系統(tǒng)。8. CFrameWnd類CFrameWnd類往往用于創(chuàng)建應(yīng)用程序的主窗口,并定義了大量管理視圖和文檔對象的成員函數(shù)及變量。建立文檔模板結(jié)構(gòu)。MFC框架結(jié)構(gòu)如下圖所示:1. CObject類CObject類是MFC類庫的根類,它幾乎描述了MFC類的一些公共特性。 Windows定義了成百上千個不同的消息類型。對于普通用戶來說,Windows圖形化界面友好、操作簡單,用戶不需要花費長時間學(xué)習(xí)如何使用計算機和新程序,因為所有的Windows應(yīng)用程序都具相近的外觀和感覺;對于程序員來說,標(biāo)準(zhǔn)化的圖形用戶界面來自于Windows構(gòu)造菜單和對話框的內(nèi)置程序,這些工作由Windows處理,與應(yīng)用程序無關(guān),使程序員可以編寫出易于用戶操作的程序。實驗一、HelloWorld在VS2005上的實現(xiàn)l 掌握Windows程序基本的運行原理。l Windows編程模型Windows程序采用如下圖所示的事件驅(qū)動編程模型,應(yīng)用程序通過處理操作系統(tǒng)發(fā)送出來的消息來響應(yīng)事件。大多數(shù)消息的開始字符為“WM”并帶有下劃線;216。2. CCmdTarget類CCmdTarget類是MFC的消息映射基礎(chǔ)類,MFC為該類設(shè)計了許多的成員變量及函數(shù)以解決消息映射的問題。循環(huán)檢索消息隊列中的消息并將這些消息發(fā)送到指定的地方。在編寫文檔/視圖結(jié)構(gòu)的應(yīng)用程序時,視圖對象等將作為CFrameWnd的子窗口實現(xiàn)對客戶區(qū)的共享,并被CFrameWnd有序排列。任何—個對象都可以通過調(diào)用全局函數(shù)AfxGetApp( )或AfxGetInstanceHandle( )來獲取應(yīng)用程序?qū)ο?;通過調(diào)用全局函數(shù)AfxGetMainWnd( )來獲得程序主窗口。有的處理函數(shù)不帶參數(shù),有的帶幾個參數(shù)。此函數(shù)的原型如下:afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)。此函數(shù)的原型如下:afx_msg void OnLButtonDown(UINT nFlags,CPoint point)。?? WM_TIMER:每當(dāng)計時器被觸發(fā)時,系統(tǒng)就發(fā)送WM_TIMER 消息。l MFC消息映射機制MFC 采用消息映射來處理消息。在編寫Windows應(yīng)用程序時候可以借助MSDN查閱相關(guān)Windows API(Platform SDK)和MFC基礎(chǔ)類(Microsoft Foundation Class Library)的詳細(xì)用法。 //窗口風(fēng)格 WNDPROC lpfnWndProc。 //窗口類菜單 LPCTSTR lpszClassName。216。 //發(fā)送消息給窗口過程}Msg變量為MSG結(jié)構(gòu)體類型,類型定義如下:typedef struct tagMSG { HWND hwnd。 頭文件包含在每一個Windows程序C語言編寫的Windows程序都可以看到include。 //窗口句柄 MSG msg。 = WinLiuProc。 //更新窗口 UpdateWindow(hwnd)。 sprintf(szChar,鍵盤按鍵按下)。 break。 GetClientRect(hwnd, amp。//系統(tǒng)發(fā)出一個WM_DESTROY消息。class CMainWindow:public CFrameWnd{public: CMainWindow()。}//CMainWindow 消息映射宏BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) ON_WM_PAINT()END_MESSAGE_MAP()CMainWindow::CMainWindow(){ Create(NULL,_T(The Hello Program,MFC style))?!拔沂浅绦騿T”,并將窗口的標(biāo)題欄改為:MyProg。應(yīng)用程序可以使用GDI創(chuàng)建3種類型的圖像:1. 適量圖形:如各種集合圖形。(3) 保存當(dāng)前信息,例如當(dāng)前的畫筆、畫刷、字體和位圖等圖形對象及其屬性,以及顏色和背景等影響圖形輸出的繪圖模式。任何一種顏色都是由紅、綠、藍(lán)3 種基本顏色組成的,COLORREF 類型數(shù)據(jù)的低位字節(jié)存放紅色強度值,第2 個字節(jié)存放綠色強度值,第3個字節(jié)存放藍(lán)色強度值,高位字節(jié)為0,每一種顏色分量的取值范圍為0~255。 //定義灰色pDCSetBkColor(rgbBkClr)。MFC 對GDI 對象進(jìn)行了很好的封裝,提供了封裝GDI 對象的類。用戶可以建立一種GDI 字體,并使用CFont 的成員函數(shù)來訪問它。CRgn 用于設(shè)備環(huán)境(通常是窗口)內(nèi)的區(qū)域操作,通常和CDC 類中與裁剪(clipping)有關(guān)的成員函數(shù)配合使用。在主菜單【幫助】的后面添加3 個菜單項【曲線】、【線寬】和【顏色】,并分別給它們添加子菜單,如下圖所示216。打開 文件,添加如下文件包含代碼:include include 為上表中各成員函數(shù)添加代碼:double CSy5View::calsin(int x){double y。}void CSy5View::drawaxis(CDC *pDC){CString str。i780。if(i!=5) pDCTextOut(15,45+20*i,str)。 //創(chuàng)建實線畫筆、線寬及顏//色由參數(shù)m_wid 和m_col 確定oldpen=pDCSelectObject(amp。i721。m_able=1。}void CSy5View::OnWidsp3(){m_wid=3。}void CSy5View::OnUpdateWidsp2(CCmdUI* pCmdUI){pCmdUIEnable(m_able)。首先,選擇項目工作區(qū)的ClassView 視圖,雙擊CSy5View 類,在消息處理函數(shù)的聲明宏中添加代碼。//獲取狀態(tài)欄指針CString str,str1,str2,str3。str=str1+str2+str3。l VS2005集成開發(fā)環(huán)境。 the check mark disappears the next time the user selects the box.BS_AUTORADIOBUTTON 圓形選擇按鈕,按鈕的狀態(tài)會自動改變 Same as a radio button, except that when the user selects it, the button automatically highlights itself and removes the selection from any other radio buttons with the same style in the same group.BS_AUTO3STATE 允許按鈕有三種狀態(tài)即:選中,未選中,未定 Same as a threestate check box, except that the box changes its state when the user selects it.BS_CHECKBOX 檢查框 Creates a small square that has text displayed to its right (unless this style is bined with the BS_LEFTTEXT style).BS_DEFPUSHBUTTON 默認(rèn)普通按鈕 Creates a button that has a heavy black border. The user can select this button by pressing the ENTER key. This style enables the user to quickly select the most likely option (the default option).BS_LEFTTEXT 左對齊文字 When bined with a radiobutton or checkbox style, the text appears on the left side of the radio button or check box.。 Static Box控件靜態(tài)文本控件的功能比較簡單,可作為顯示字符串,圖標(biāo),位圖用。將不顯示而在其后的字符將有下劃線,如果需要直接顯示amp。pstaDisCreate(,WS_CHILD|WS_VISIBLE|SS_BITMAP|SSCENTERIMAGE,CRect(0,0,40,40),pWnd,1)。 ES_AUTOHSCROLL,ES_AUTOVSCROLL 指明輸入文字超出顯示范圍時自動滾動。刪除選中的文本,void Copy( )。MFC中使用CStatusBar類來封裝狀態(tài)條控件的各種操作。改變其風(fēng)格,ID和寬度。 其中dwStyle將指明該窗口的風(fēng)格,除了子窗口常用的風(fēng)格WS_CHILD,WS_VISIBLE外,你可以針對列表控件指明專門的風(fēng)格。 int SelectString( int nStartAfter, LPCTSTR lpszItem )可以選中包含指定字符串的行。 List Ctrl控件列表控件可以看作是功能增強的ListBox,它提供了四種風(fēng)格,而且可以同時顯示一列的多中屬性值??梢栽诹斜砜丶衝Item指明位置插入一項,lpszItem為顯示字符。下面的代碼演示了如何設(shè)置多列并插入數(shù)據(jù): (amp。 此外CListCtrl還提供了一些函數(shù)用于得到/修改控件的狀態(tài)。用于刪除某一項,BOOL DeleteAllItems( )。 關(guān)于動態(tài)提供結(jié)點所顯示的字符:首先你在項時需要指明lpszItem參數(shù)為:LPSTR_TEXTCALLBACK。如果編輯在中途中取消該變量為NULL。 if(pLVDI==0)。通過item中的iItem,iSubItem可以知道當(dāng)前顯示的為那一項。 BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent)。用于得到/設(shè)置顯示的字符顏色。//設(shè)置ImageList (0,Col 1,LVCFMT_LEFT,300,0)。通過調(diào)用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem)。通過調(diào)用BOOL Create( DWORD dwStyle, const RECTamp。必須注意的是在創(chuàng)建時必須指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE風(fēng)格。 void ResetContent( )可以刪除列表框中所有行。所以一般是不需要直接創(chuàng)建狀態(tài)條對象。創(chuàng)建一個窗口,dwStyle中可以使用以下一些狀態(tài)條控件的專用風(fēng)格: CBRS_TOP 狀態(tài)條在父窗口的頂部 TCBRS_BOTTOM 狀態(tài)條在父窗口的底部 創(chuàng)建一個狀態(tài)條的步驟如下:先使用Create創(chuàng)建窗口,然后調(diào)用BOOL SetIndicators( const UINT* lpIDArray, int nIDCount )。將剪貼板中內(nèi)容插入到當(dāng)前輸入框中光標(biāo)位置,void Cut( )。通過GetLimitText/SetLimitText可以得到/設(shè)置在輸入框中輸入的字符數(shù)量。(IDB_TEST)。amp。 rect, CWnd* pParentWnd, UINT nID = 0xffff )。 獲取/改變按鈕狀態(tài):對于檢查按鈕和圓形按鈕可能有兩種狀態(tài),選中和未選中,如果設(shè)置了BS_3STATE或BS_AUTO3STATE風(fēng)格就可能出現(xiàn)第三種狀態(tài):未定,這時按鈕顯示灰色。 Button控件按鈕窗口(控件)在MFC中使用CButton表示,CButton包含了三種樣式的按鈕,Push Button,Check Box,Radio Box。 //初始時狀態(tài)欄中提示信息pStatusBarSetPaneText(1,str)。str3=黑色。然后,打開 文件,在其消息映射表中添加代碼。elsepCmdUISetCheck(false)。}void CSy5View::OnUpdateColb(CCmdUI* pCmdUI){pCmdUIEnable(m_able)。}void CSy5View::OnColr(){m_col=RGB(255,0,0)。//調(diào)用函數(shù)繪制曲線pDCSelectObject(oldpen)。for(int i=0。}pDCSelectObject(oldfont)。 //繪制X 軸上刻度線(%d,i50)。(80,Arial,pDC)。 //計算正弦return y。 創(chuàng)建工具欄為應(yīng)用程序創(chuàng)建一個新的工具欄,并使工具欄上的各按鈕與菜單欄中的菜單項相對應(yīng),如下圖