【正文】
上面程序使用到得Windows系統(tǒng)調(diào)用函數(shù)均在MSDN中平臺SDK文檔中說明,并在不同的頭文件中聲明。 選擇菜單Project/settings(或Alt+F7),在Project Settings對話框中的General頁中的Microsoft Foundation Classes:選擇Use MFC in a Static Library或Use MFC in a Shared DLL,然后編譯運行。 //消息 //聲明一個窗口類 WNDCLASS wndcls。 = LoadCursor( hInstance, IDC_ARROW )。 = Windows prog test。wndcls)。 /*消息循環(huán)*/ //從消息隊列中循環(huán)讀取有效消息,如果是有效消息,則復(fù)制到msg中,然后從隊列中刪除該消息 while (GetMessage( amp。msg)。 MessageBox(hwnd,szChar,Title,0)。 /* retrieves a handle to a display device context (DC) for the client area of a specified window or for the entire screen */ hdc=GetDC(hwnd)。 //鼠標(biāo)右鍵按下消息 case WM_RBUTTONDOWN: MessageBox(hwnd,鼠標(biāo)右鍵按下,Title,0)。 PAINTSTRUCT ps。rect) 。ps) 。 } break。 } return 0。 //主窗口構(gòu)造函數(shù)protected: afx_msg void OnPaint()。 /新建一個窗口 m_pMainWndShowWindow(m_nCmdShow)。}void CMainWindow::OnPaint(){ CPaintDC dc(this)。 (_T(Hell world),1,amp。實驗二、MFC曲線繪制實驗l 了解Windows圖形處理的基本原理。l MFC曲線繪制實現(xiàn)l 圖形設(shè)備接口和接口環(huán)境Windows 是一個圖形操作系統(tǒng),Windows 使用圖形設(shè)備接口(GDI)進行圖形和文本輸出,MFC 封裝了GDI 對象,提供了CGdiObject 類和CDC 類支持圖形和文本輸出。2. 光柵圖形:指光柵圖形函數(shù)對以位圖形式存儲的數(shù)據(jù)進行操作,它包括各種位圖和圖標(biāo)的輸出。設(shè)備環(huán)境DC 是由GDI 創(chuàng)建、用來代表設(shè)備連接的數(shù)據(jù)結(jié)構(gòu)。(4) 保存窗口剪切區(qū)域(Clipping Region),限制程序輸出到輸出設(shè)備中窗口覆蓋的區(qū)域。CWindowDC代表整個窗口的設(shè)備環(huán)境,包括客戶區(qū)和非客戶區(qū);除非要自己繪制窗口邊框和按鈕,否則一般不用它。直接設(shè)置 COLORREF 類型的數(shù)據(jù)不太方便。很多涉及到顏色的 GDI 函數(shù)都需要使用COLORREF 類型的參數(shù),如設(shè)置背景色的成員函數(shù)CDC::SetBkColor( )、設(shè)置文本顏色的成員函數(shù)CDC::SetTextColor( )。 //背景色為灰色pDCSetTextColor(RGB(0,0,255))。這些繪圖工具統(tǒng)稱為GDI 對象。1. CPen類:裝GDI 畫筆。畫刷是用來填充一個封閉圖形對象(如矩形、圓形)的內(nèi)部區(qū)域的,默認(rèn)的畫刷顏色是白色。主要用于設(shè)置文本輸出的效果,包括文字的大小、是否加粗、是否斜體、是否加下劃線等。包含系統(tǒng)可用的色彩信息,是應(yīng)用程序和彩色輸出設(shè)備環(huán)境(如顯示器)的接口。l 畫筆和畫刷的使用庫存對象是由操作系統(tǒng)維護的、用于繪制屏幕的常用對象,包括庫存畫筆、畫刷、字體等。 創(chuàng)建MFC 應(yīng)用程序框架打開VS2005, 使用MFC AppWizard[exe]向?qū)?chuàng)建MFC應(yīng)用程序Sy5 框架,選擇單文檔應(yīng)用程序,其它默認(rèn)。 創(chuàng)建快捷菜單為應(yīng)用程序添加一個快捷菜單,并將快捷菜單的菜單項設(shè)置為菜單欄中的相應(yīng)項,如下圖所示:216。 //顏色初始為黑色m_wid=1。y=sin(x*PI/180)。 //計算余弦return y。CFont myfont,*oldfont。drawline(pDC,50,10,50,290)。i=i+90){drawline(pDC,i,145,i,150)。i11。else pDCTextOut(15,45+20*i,0)。 //調(diào)用成員函數(shù)繪制坐標(biāo)系CPoint point[750]。mypen)。if(m_typ==1) //根據(jù)參數(shù)m_typ 的值確定曲線類型point[i].y=(int)(150calsin(i)*100)。i++)drawline(pDC,point[i].x,point[i].y,point[i+1].x,point[i+1].y)。 //選擇正弦曲線m_able=1。Invalidate()。Invalidate()。Invalidate()。}void CSy5View::OnUpdateColr(CCmdUI* pCmdUI){pCmdUIEnable(m_able)。if(m_wid==2)pCmdUISetCheck(true)。elsepCmdUISetCheck(false)。afx_msg void OnUpdatePrompt(CCmdUI* pCmdUI)。void CSy5View::OnUpdatePrompt(CCmdUI* pCmdUI){CMainFrame *pMainFrame=(CMainFrame*)AfxGetMainWnd()。str2=寬1,。else if(m_wid==3)str2=寬3,。if(m_able==0) str=選擇曲線類型。實驗三、MFC基本控件實驗l 了解MFC基本控件的使用方法。l 使用按鈕、文本框、圖像框、列表框等控件編程。 rect, CWnd* pParentWnd, UINT nID )。BS_OWNERDRAW 自繪按鈕 Creates an ownerdrawn button. The framework calls the DrawItem member function when a visual aspect of the button has changed. This style must be set when using the CBitmapButton class.BS_PUSHBUTTON 普通按鈕 Creates a pushbutton that posts a WM_COMMAND message to the owner window when the user selects the button.BS_RADIOBUTTON 圓形選擇按鈕 Creates a small circle that has text displayed to its right (unless this style is bined with the BS_LEFTTEXT style). Radio buttons are usually used in groups of related but mutually exclusive choices.BS_3STATE 允許按鈕有三種狀態(tài)即:選中,未選中,未定 Same as a check box, except that the box can be dimmed as well as checked. The dimmed state typically is used to show that a check box has been disabled. rect為窗口所占據(jù)的矩形區(qū)域,pParentWnd為父窗口指針,nID為該窗口的ID值。設(shè)置當(dāng)前選中狀態(tài)。創(chuàng)建一個窗口可以使用成員函數(shù): BOOL CStatic::Create( LPCTSTR lpszText, DWORD dwStyle, const RECTamp。 SS_GRAYRECT 顯示一個灰色的矩形 SS_NOPREFIX 如果指明該風(fēng)格,對于字符amp。必須使用amp??刂骑@示的圖標(biāo)利用成員函數(shù)SetIcon/GetIcon用于設(shè)置/得到當(dāng)前顯示的圖標(biāo)。CBitmap bmpLoad。創(chuàng)建一個輸入窗口可以使用成員函數(shù): BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECTamp。 ES_CENTER,ES_LEFT,ES_RIGHT 指定對齊方式 ES_MULTILINE 是否允許多行輸入 ES_PASSWORD 是否為密碼輸入框,如果指明該風(fēng)格則輸入的文字顯示為* ES_READONLY 是否為只讀 ES_UPPERCASE,ES_LOWERCASE 顯示大寫/小寫字符 控制顯示的文本利用成員函數(shù)SetWindowText/GetWindowText用于設(shè)置/得到當(dāng)前顯示的文本。 nEndChar )得到用戶選擇的字符范圍,通過調(diào)用void CEdit::SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE )可以設(shè)置當(dāng)前選擇的文本范圍,如果指定nStartChar=0 nEndChar=1則表示選中所有的文本??蓪⑦x中的文本送入剪貼板,void Paste( )。的函數(shù),并且定義形式如ON_Notification( id, memberFxn )的消息映射。通過調(diào)用BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR )。(uID,2)。 AppWizard在生成代碼時也會同時生成狀態(tài)條的代碼。 List Box控件ListBox窗口用來列出一系列的文本,每條文本占一行。 LBS_MULTIPLESEL 指明列表框可以同時選擇多行 LBS_EXTENDEDSEL 可以通過按下Shift/Ctrl鍵選擇多行 LBS_SORT 所有的行按照字母順序進行排序 在列表框生成后需要向其中加入或是刪除行,可以利用: int AddString( LPCTSTR lpszItem )添加行, int DeleteString( UINT nIndex )刪除指定行, int InsertString( int nIndex, LPCTSTR lpszItem )將行插入到指定位置。如果你指明了選擇多行的風(fēng)格,你就需要先調(diào)用int GetSelCount( )得到被選中的行的數(shù)量,然后int GetSelItems( int nMaxItems, LPINT rgIndex )得到所有選中的行,參數(shù)rgIndex為存放被選中行的數(shù)組。在MFC ,該類是由CListBox派生并擁有CListBox的所有功能,不同的是可以在每行前加上一個檢查框。最后介紹一下列表框幾種常用的消息映射宏: ON_LBN_DBLCLK 鼠標(biāo)雙擊 ON_EN_ERRSPACE 輸入框無法分配內(nèi)存時產(chǎn)生 ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在輸入框失去/得到輸入焦點時產(chǎn)生 ON_LBN_SELCHANGE 選擇的行發(fā)生改變 使用以上幾種消息映射的方法為定義原型如:afx_msg void memberFxn( )。MFC中使用CListCtrl類來封裝列表控件的各種操作。 LVS_SHOWSELALWAYS 在失去焦點時也顯示當(dāng)前選中的結(jié)點 LVS_SINGLESEL 同時只能選中列表中一項 首先你需要設(shè)置列表控件所使用的ImageList,如果你使用大圖標(biāo)顯示風(fēng)格,你就需要以如下形式調(diào)用: CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL)。除LVS_REPORT風(fēng)格外其他三種風(fēng)格都只需要直接調(diào)用InsertItem就可以了,但如果使用報表風(fēng)格就必須先設(shè)置列表控件中的列信息。 在有多列的列表控件中就需要為每一項指明其在每一列中的顯示字符,通過調(diào)用 BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText )。m_listSmall,LVSIL_SMALL)。 (0,Item 1_1)。 COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr )。 void SetItemCount( int iCount )。將刪除所有項。用于得到某項的顯示字符。在控件顯示該結(jié)點時會通過發(fā)送TVN_GETDISPINFO來取得所需要的字符,在處理該消息時先將參數(shù)pNMHDR轉(zhuǎn)換為LPNMLVDISPINFO。 pLVDI=szOut[pTVDI]。下面的代碼說明如何處理這些消息: //處理消息 LVN_BEGINLABELEDIT void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR。 } //處理消息 LVN_BEGINLABELEDIT void CParentWnd::OnBeginEditList(NMHDR* pNMHDR,