久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

MFC編程學習心得

時間:2019-05-12 15:29:56下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《MFC編程學習心得》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《MFC編程學習心得》。

第一篇:MFC編程學習心得

//

1、將C語言變量簡單重新定義 UINT、INT(32位,4字節)

LONG、DWORD(32位,4字節)WPARAM、LPARAM(32位,4字節)SHORT、WORD(16位,2字節)LONG、LRESULT BOOL(TRUE、FALSE)PINT

PSTR、LPSTR、LPCSTR(字符串指針,只讀和可寫)

//

2、H開頭,Windows句柄類型變量 HANDLE of Windows =>HWND HANDLE of Instance =>HINSTANCE HANDLE of Icon =>HICON

//3結構體類型

SIZE、POINT、RECT

MFC所有封裝類一共有200多個,但是MFC的內部技術不只是簡單地封裝。MFC內部總共有六大關鍵技術,構架起了整個MFC開發平臺。

一、MFC的六大關鍵技術包括: a)MFC程序的初始化過程: b)消息映射機制;

c)運行時類型識別(RTTI); d)動態創建; e)永久保存; f)消息傳遞;

六大關鍵技術的目的是為了提高開發效率,開發者只需要在局部做簡單的修改,即可處理大部分窗口事物。

二、SendMessage和PostMessage函數的功能:

a)能夠向指定的窗口內發送窗口消息,既可以是本進程內窗口也可以是其他進程的; b)既可以發送系統內部消息,消息編號的范圍是:1-WM_USER-1; 例如:WM_LBUTTONDONW,WM_MOUSEMOVE等; c)也可以發送非系統消息(開發者定義的消息),范圍是WM_USER-0x7FFF。

三、SendMessage和PostMessage兩個函數的區別是:

a)SendMessage是阻塞型函數,PostMessage是非阻塞型函數:

SendMessage用于調用指定窗口的內部程序,直到窗口程序處理完成以后再返回: PostMessage是將一個消息寄送到一個窗口內的消息隊列后就立即返回。b)兩個函數的返回值不同:

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM,lParam);BOOL PostMessage(HWND hWnd,UNIT Msg,WPARAM wParam,LPARAM,lParam);SendMessage的返回值依賴于消息處理函數

c)跨線程或者跨進程發送消息,推薦使用PostMessage函數。

一、更具主窗口類型,MFC軟件工程可以分為以下幾種構架模型:

1、SDI(Single Document Interface):單文檔界面,一個主框架窗口下只能編輯一份文檔。例如:記事本和畫筆等。

2、MDI(Multiple Document Interface):多文檔界面,一個主框架窗口下可以同時編輯多份文檔。

例如:VC++6.0,Photoshop等軟件。

3、基于對話框的軟件模型:主窗口是通過資源管理器,在對話框模板內擺放控件編輯而成的。

多數用于開發小規模軟件,例如:任務管理器。

4、其他自定義窗口做主窗口:主窗口既不是框架也不是對話框,而是直接開發通用窗口類CWind而成。

例如:輸入法窗口、QQ和360軟件等,有時這類軟件都可以使用框架和對話框模式來代替開發而成。

對話框常用消息映射函數:

二、對話框初始化消息:

1、WM_CREATE:通用窗口初始化消息

窗口還未顯示出來,只有父窗口,子窗口還沒創建

2、WM_INITDIALOG:對話框窗口專用消息

子窗口已經全部創建完成,可以調用和操作子窗口

三、對話框關閉過程消息:

1、WM_SYSCOMMAND:管理所有系統菜單和系統按鈕消息 包括通過最大化、最小化、移動、大小和關閉等

2、WM_CLOSE:是WM_SYSCOMMAND消息的一個專用關閉的分支 再次消息處理過程可以取消本次關閉任務

3、IDCANCEL按鈕消息:不但用于按鈕回調消息,也是系統按鈕關閉窗口的回調 執行真正關閉對話框函數是EndDialog,在此消息處理過程可以取消本次關閉任務

4、WM_DESTROY:通用窗口銷毀消息

窗口已經在屏幕中消失了,但是自身窗口和窗口內的控件都還可以調用 在此消息處理過程可以取消本次關閉任務

四、非模式對話框:

1、在調用EndDialog函數關閉時,非模式對話框只是隱藏沒有真正關閉;

2、在調用DestroyWindow函數關閉時,只是隱藏沒有真正關閉;

3、DestroyWindow函數是通用摧毀窗口的函數,適用于對話框、控件、框架和視圖等。

一個MFC軟件工程由至少一個CWind派生類和一個CWinApp派生類,因此這兩個類是MFC工程中最重要的兩個類。

一、CWind成員函數:主要就是一個核心成員變量m_hWnd。

1、DestroyWindow:摧毀窗口。

2、Create和CreateEx:創建窗口,CreateEx創建時可以指定擴展風格。

3、獲取窗口句柄:

a)pWnd->m_hWnd:直接調用前最好判斷一下指針是否為空。b)operator HWND():自動類型轉換,將對象轉換為句柄。

c)GetSafeHwnd():可以避免的a方法,因為指針為空造成軟件崩潰。

4、由句柄轉化為CWnd對象:

a)CWnd::FromHandle:生成一個臨時性窗口類指針

b)Attach和Detach:為一個CWnd對象嫁接和移除窗口句柄; c)SubclassWindow和UnsubclassWindow:子類化和反子類化; d)SubclassDlgItem:子類化指定ID對應的控件窗口。

5、獲取和設置窗口信息:

a)GetWindowText和SetWindowText:獲取和設置窗口的標題文字。b)GetStyle和ModifyStyle:獲取和設置窗口的基礎風格。c)GetExStyle和ModifyStyleEx:獲取和設置窗口的擴展風格。

6、計時器: a)SetTimer: b)KillTimer:

7、窗口操作: a)ShowWindow: b)EnableWindow: c)MoveWindow: d)CenterWindow:

二、CWinApp類成員變量:

三、CWinApp類成員函數:

//匈牙利命名法: //變量:

int long定義:int nSel;long nTel HANDLE hInst;CString szName,szPass;CString strAddr;LPCSTR pszName;DWORD dwID;//如果是成員變量,以“m_”開頭 //如果是全局變量,以“g_”開頭

第二篇:MFC編程講稿(二)

一、打字功能

1.加入數據成員

選擇ClassView,雙擊CMyView,光標直接停留在類CMyView的定義處。在類CMyView中加入如下部分: class CMyView : public CView { protected: // create from serialization only

CMyView();

DECLARE_DYNCREATE(CMyView)

// Attributes public:

CMyDoc* GetDocument();

// Operations public: //代碼編寫開始

POINT Caret;

//用于存放插入符當前坐標位置 //代碼編寫結束 // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyView)public: virtual void OnDraw(CDC* pDC);// overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL

// Implementation public: virtual ~CMyView();#ifdef _DEBUG virtual void AssertValid()const;virtual void Dump(CDumpContext& dc)const;#endif

protected:

// Generated message map functions protected: //{{AFX_MSG(CMyView)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);//}}AFX_MSG DECLARE_MESSAGE_MAP()};2.加入消息:WM_CREATE(1)在“查看”菜單中選擇“建立類向導”(ClassWizard)命令,打開MFC ClassWizard窗口。

(2)選擇 Message Maps。(3)分別選擇:

Project: 打字

Class Name: CMyView Objects: CMyView Messges: WM_CREATE(4)單擊Add Function按鈕。

(5)單擊Edit Code按鈕。在OnCreate()函數體中加入以下部分。

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct){ if(CView::OnCreate(lpCreateStruct)==-1)

return-1;//代碼編寫開始

TEXTMETRIC tm;

//聲明TEXTMETRIC結構類型對象tm,用于存放字符信息。

CClientDC dc(this);

//生成應用程序窗口設備情景對象

//調用CDC類成員函數GetTextMetrics()取得字符信息,并存入變量tm中。

dc.GetTextMetrics(&tm);//調用CWnd類成員函數CreateSolidCaret()創建黑色矩形條插入符,插入符寬度為tm.tmAveCharWidth/8,高度為tm.tmHeight。

CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//設置插入符的初始位置

Caret.x=0;

} Caret.y=tm.tmHeight;SetCaretPos(Caret);//在初始位置顯示插入符 ShowCaret();//代碼編寫結束 return 0;3.加入鍵盤消息:WM_CHAR(1)在“查看”菜單中選擇“建立類向導”(ClassWizard)命令,打開MFC ClassWizard窗口。

(2)選擇 Message Maps。(3)分別選擇:

Project: 打字

Class Name: CMyView Objects: CMyView Messges: WM_CHAR(4)單擊Add Function按鈕。

(5)單擊Edit Code按鈕。在OnChar()函數體中加入以下部分。

void CMyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){

// TODO: Add your message handler code here and/or call default

//代碼編寫開始

SIZE size;

//存放字符的寬度和長度。

static UINT dy=Caret.y;

//聲明靜態變量dy,存放插入符Y軸坐標。CString a;

//聲明CString類對象a,存放鍵盤檢索到的字符nChar。a=nChar;CClientDC dc(this);//生成應用程序窗口設備情景對象

} CView::OnChar(nChar, nRepCnt, nFlags);for(UINT i=0;i

} //代碼編寫結束 HideCaret();

//隱藏光標,使得顯示字符使插入符消失。switch(nChar){ case 'r':

//將插入符移動到下一行的開頭

Caret.x=0;Caret.y+=Caret.y;break;default:

} //將插入符移動到字符后面,并顯示出來。SetCaretPos(Caret);ShowCaret();dc.TextOut(Caret.x,Caret.y,a,1);//輸出字符 size=dc.GetTextExtent(a);//獲得字符大小

Caret.x+=size.cx;//將字符的寬度加入到插入符的當前坐標位置

二、繪圖功能

(一)生成Draw程序框架

(二)鼠標繪圖

用鼠標繪制圖形,一般分三個環節:

(1)確定繪圖位置:按下鼠標左鍵,產生WM_LBUTTONDOWN消息(2)確定圖形顯示范圍:拖動鼠標,產生WM_MOUSEMOVE消息(3)完成圖形顯示:放開鼠標左鍵,產生WM_LBUTTONUP消息 1.在視圖類CDrawView中加入數據成員

選擇ClassView視圖,雙擊CdrawView,光標直接停留在類CdrawView的定義處。在類CdrawView的定義中加入如下代碼。

class CDrawView : public CView { //代碼開始編寫 protected:

int m_Dragging;

CPoint m_PointOld;CPoint m_PointOrigin;//代碼編寫結束

protected: // create from serialization only

// Attributes public:

// Operations CDrawView();DECLARE_DYNCREATE(CDrawView)CDrawDoc* GetDocument();public:

// Overrides

// Implementation public: virtual ~CDrawView();// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CDrawView)public: virtual void OnDraw(CDC* pDC);// overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL #ifdef _DEBUG virtual void AssertValid()const;virtual void Dump(CDumpContext& dc)const;#endif

protected:

// Generated message map functions protected:

//{{AFX_MSG(CDrawView)// NOTEthe ClassWizard will add and remove member functions here.//

DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG DECLARE_MESSAGE_MAP()21 4.定義函數CdrawDoc::AddLine()選擇FileView,展開SourceFiles,雙擊DrawDoc.cpp,打開執行文件DrawDoc.cpp,在其末尾,加入以下代碼。

//代碼編寫開始

// AddLine()生成新的Cline對象,并調用CObArray成員函數Add()向m_LineArray添加Cline對象指針。

void CDrawDoc::AddLine(int X1,int Y1,int X2,int Y2){

} //代碼編寫結束 CLine *pLine=new CLine(X1,Y1,X2,Y2);m_LineArray.Add(pLine);5.定義函數CdrawDoc::GetLine()選擇FileView,展開SourceFiles,雙擊DrawDoc.cpp,打開執行文件DrawDoc.cpp,在其末尾,加入以下代碼。

//代碼編寫開始

// CObArray成員函數GetUpperBound()返回加入的最后一個指針的索引,即最大的有效索引,CObArray成員函數GetAt()返回對應的CLine指針。如果索引號小于0或大于最大的有效索引號,GetLine()返回0;否則,返回對應的CLine指針。

CLine *CDrawDoc::GetLine(int Index){

} //代碼編寫結束 if(Index<0||Index>m_LineArray.GetUpperBound())return 0;return(CLine *)m_LineArray.GetAt(Index);22 6.定義函數CdrawDoc::GetNumLines()選擇FileView,展開SourceFiles,雙擊DrawDoc.cpp,打開執行文件DrawDoc.cpp,在其末尾,加入以下代碼。

//代碼編寫開始

// 通過調用CObArray成員函數GetSize(),GetNumLines()返回m_LineArray當前存放的CLine指針的個數。

int CDrawDoc::GetNumLines(){ } //代碼編寫結束 return m_LineArray.GetSize();7.修改函數視圖類消息處理函數OnLButtonUp()調用GetDocument()和AddLine()來存放新直線。

回到Workspace,選擇ClassView,單擊CDrawView,展開CdrawView成員變量和成員函數。雙擊OnLButtonUp(),在函數OnLButtonUp()中定義后加入以下代碼。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point){ // TODO: Add your message handler code here and/or call default

int b;

CRect Rect(40,40,600,400);b=Rect.PtInRect(point);if(b)::SetCursor(m_HCross);else ::SetCursor(m_HArrow);if(m_Dragging&&b){

m_Dragging=0;CClientDC dc(this);dc.SetROP2(R2_NOT);

dc.MoveTo(m_PointOrigin);dc.LineTo(m_PointOld);dc.MoveTo(m_PointOrigin);dc.LineTo(point);//代碼開始編寫

//調用函數GetDocument()取得文檔類的指針,并存入pDoc中。CDrawDoc * pDoc=GetDocument();

//通過指針pDoc調用加入的文檔類成員函數AddLine()向m_LineArray加入 Cline類直線對象。

pDoc->AddLine(m_PointOrigin.x,m_PointOrigin.y,point.x,point.y);

// 當一條新的直線繪制完成,視圖類OnLButtonUp(nFlags, point)函數通過上面的工作將新繪制的直線存入文檔類中。

} } CView::OnLButtonUp(nFlags, point);//代碼編寫結束

8.修改視圖類成員函數OnDraw()void CDrawView::OnDraw(CDC* pDC){

CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here

pDC->MoveTo(40,40);

pDC->LineTo(600,40);

pDC->LineTo(600,400);

pDC->LineTo(40,400);

pDC->LineTo(40,40);

//代碼編寫結束

} 9.編譯、運行 //代碼開始編寫

int Index=pDoc->GetNumLines();while(Index--)pDoc->GetLine(Index)->Draw(pDC);

(六)圖形的刪除

下面向Draw程序加入圖形的編輯功能。選擇“編輯/撤銷”菜單命令就可以刪除最近繪制的直線,選擇“編輯/全部刪除”菜單命令可以清除掉視圖窗口中所有的直線。

函數DeleteContents專門負責文檔數據的刪除工作,可以在文檔類中加入該函數刪除存放的直線。我們的目的是通過菜單命令答道編輯的功能,因此需要加入“編輯/撤銷”和 “編輯/全部刪除”菜單命令的消息處理函數,在它們的消息處理函數中調用函數DeleteContents()。

1. 加入“編輯”菜單命令“全部刪除”

(1)選擇ResourceView視圖,打開Menu項目下的IDR_MAINFRAME標志符,在Edit菜單下面加入菜單命令 “全部刪除”。

ID標志符為:ID_EDIT_CLEAR_ALL,Caption為:全部刪除(&A)tCtrl+A(2)雙擊Accelerator項目下面的IDR_MAINFRAME標志符,打開快捷鍵編輯器。雙擊快捷鍵編輯框底部的空框,在ID文本框中輸入ID_EDIT_CLEAR_ALL,在Key文本框中輸入A,并選擇Ctrl。

2. 加入虛函數DeleteContents()25(1)在“查看”菜單中選擇“建立類向導”(ClassWizard)命令,打開MFC ClassWizard窗口。

(2)選擇 Message Maps。(3)分別選擇: Project: Draw Class Name: CDrawDoc Objects: CDrawDoc Messges: DeleteContents(4)單擊Add Function按鈕。

(5)單擊Edit Code按鈕。在DeleteContents()函數體中加入以下部分。void CDrawDoc::DeleteContents(){

} 3. 加入ID_EDIT_CLEAR_ALL的COMMAND消息處理函數OnEditClearAll()(1)在“查看”菜單中選擇“建立類向導”(ClassWizard)命令,打開MFC ClassWizard窗口。

(2)選擇 Message Maps。(3)分別選擇:

Project: Draw Class Name: CDrawDoc Objects IDs: ID_EDIT_CLEAR_ALL Messges: COMMAND // TODO: Add your specialized code here and/or call the base class //代碼編寫開始

int Index=m_LineArray.GetSize();while(Index--)delete m_LineArray.GetAt(Index);m_LineArray.RemoveAll();//代碼編寫結束

CDocument::DeleteContents();(4)單擊Add Function按鈕。

(5)單擊Edit Code按鈕。在OnEditClearAll()函數體中加入以下部分。void CDrawDoc::OnEditClearAll(){ // TODO: Add your command handler code here //代碼編寫開始

DeleteContents();

} 4. 加入ID_EDIT_CLEAR_ALL的UPDATE_COMMAND_UI消息處理函數(1)在“查看”菜單中選擇“建立類向導”(ClassWizard)命令,打開MFC ClassWizard窗口。

(2)選擇 Message Maps。(3)分別選擇:

Project: Draw Class Name: CDrawDoc Objects IDs: ID_EDIT_CLEAR_ALL Messges: UPDATE_COMMAND_UI(4)單擊Add Function按鈕。

(5)單擊Edit Code按鈕。在OnUpdateEditClearAll()函數體中加入以下部分。void CDrawDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI){

} 5. 加入ID_EDIT_UNDO的COMMAND消息處理函數 UpdateAllViews(0);//代碼編寫結束

// TODO: Add your command update UI handler code here //代碼編寫開始

pCmdUI->Enable(m_LineArray.GetSize());//代碼編寫結束(1)在“查看”菜單中選擇“建立類向導”(ClassWizard)命令,打開MFC ClassWizard窗口。

(2)選擇 Message Maps。(3)分別選擇:

Project: Draw Class Name: CDrawDoc Objects IDs: ID_EDIT_UNDO Messges: COMMAND(4)單擊Add Function按鈕。

(5)單擊Edit Code按鈕。在OnEditUndo()函數體中加入以下部分。void CDrawDoc::OnEditUndo(){ // TODO: Add your command handler code here //代碼編寫開始

int Index=m_LineArray.GetUpperBound();

} 6. 加入ID_EDIT_UNDO的UPDATE_COMMAND_UI消息處理函數

(1)在“查看”菜單中選擇“建立類向導”(ClassWizard)命令,打開MFC ClassWizard窗口。

(2)選擇 Message Maps。(3)分別選擇:

Project: Draw Class Name: CDrawDoc Objects IDs: ID_EDIT_UNDO if(Index>-1){

} UpdateAllViews(0);//代碼編寫結束 delete m_LineArray.GetAt(Index);m_LineArray.RemoveAt(Index);Messges: UPDATE_COMMAND_UI(4)單擊Add Function按鈕。

(5)單擊Edit Code按鈕。在OnUpdateEditUndo()函數體中加入以下部分。void CDrawDoc::OnUpdateEditUndo(CCmdUI* pCmdUI){ // TODO: Add your command update UI handler code here //代碼編寫開始

pCmdUI->Enable(m_LineArray.GetSize());//代碼編寫結束

}

(七)圖形的存取

(八)滾動窗口

(九)分割窗口

(十)拖放與注冊

第三篇:MFC 對話框編程 -- 總結

MFC 對話框編程--總結

一、創建對話框對象

1.首先利用資源編輯器創建對話框資源,并針對該對話框資源定義一個對話框類:classCTestDlg :public CDialog

2.創建話話框對象

模態對話框的創建:

如:

CTestDlgdlg;

dlg.DoModal();

非模態對話框創建:

如:

CTestDlgdlg;

dlg.Create(IDD_DIALOG, this);

但這樣是得不到一個正常顯示的非模態對話框的。因為模態與非模態對話框的實現方式并不相同,這里我們還要注意幾點。

非模態對話框創建完成后是隱藏著的,必須調用ShowWindow來進行顯示。

對于模態對話框,當執行到DoModal 函數以創建對話框時,程序會暫停執行,直至模態對話框關閉。所以創建模態對話框可以采用局部對象。

但是,對于非模態對話框,當執行Create函數時并不會暫停執行,當執行到大括號“}后Dlg局部對象被銷毀生命周期結束,于是異常出現了。

解決方法有兩個:

一、在View類中定義一個CTestDlg 成員變量。

二、動態創建一個CTestDlg 變量,并重寫CTestDlg 類的 PostNcDestroy函數,在該函數里銷毀對象 deletethis;

無論創建的是模態對話框,還是非模態對話框,當我們單擊確定或取消按鈕后對話框都會消失。但這時低層的操作卻是不同的。

對于模態對話框,此時對話框對象的確是被銷毀了,但對于非模態對話框,這時只是隱藏起來不再顯示。這需要我們自己調用DestoryWindow函數來進行銷毀工作。

這時我們必須重寫 CTestDlg 的 OnOK、OnCancel 兩個函數(這兩個是基類CDialog的虛函數),在這兩個函數內調用DestroyWindow函數,并注意不再調用基類CDialog相應的函數。正確地創建非模態對話框的代碼如下:

CTestDlg*pDlg = new CTestDlg;

pDlg->Create(IDD_DIALOG, this);

pDlg->ShowWindow(SW_SHOW);

同時,在CTestDlg 類的 PostNcDestroy函數中銷毀對象:deletethis;

二、動態創建按鈕

1.在對話框類CTestDlg 中定義一個 CButton 類對象,作為其成員變量。

2.在相應的消息處理中,調用 CButton類的Create函數創建按鈕。

要注意兩點:

如果在調用CButton::Create創建按鈕時沒有指定WS_VISIBLE 風格,那么隨后一定要調用這個按鈕對象的ShowWindow函數,來將該按鈕顯示出來。

為防止該CButton關聯多個按鈕,這里需要進行一些設置,如下:

if(!m_btn.m_hwnd)

{

// CButton 對象m_btn 未關聯一個按鈕

m_btn.Create(....);

}

else

{

// CButton 對象m_btn 已關聯一個按鈕

其他操作...}

當然,方法并不只這一種。但這是最漂亮的方法。

三、設置控件文本文字

1.下面列舉幾個用來設置控件文本文字的函數:

// 取得對話框中指定控件的窗口句柄??丶ㄟ^ID標識來指定

CWnd*GetDlgItem(int nID)const;

void CWnd::GetDlgItem(int nID, HWND* phWnd)const;

// 取得窗口文本

intGetWindowText(LPTSTR lpszStringBuf, int nMaxCount)const;

voidGetWindowText(CString& rString)const;

// 設置窗口文本

voidSetWindowText(LPCTSTR lpszString);

// 取得指定控件窗口文本??丶ㄟ^ID標識來指定

intGetDlgItemText(int nID, LPTSTR lpStr, int nMaxCount)const;

intGetDlgItemText(int nID, CString& rString)const;

// 設置指定控件窗口文本??丶ㄟ^ID標識來指定

void SetDlgItemText(int nID, LPCTSTR lpszString);

// 取得指定控件窗口文本,并轉化為UINT 類型返回。控件通過ID標識來指定

UINT GetDlgItemInt(int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE)const;// 設置指定控件窗口文本,由UINT類型轉化為字符??丶ㄟ^ID標識來指定

voidSetDlgItemInt(int nID, UINT nValue, BOOL bSigned = TRUE);

2.可以為對話框控件關聯一個變量,在CTestDlg 類的DoDataExchange來完成數據的更新與交換。這里我們需要重點說明 DoDataExChange 函數:

首先引用MSDN的一段解釋吧:Called by the framework to exchange and validate dialog data。意指框架調用此函數來改寫與確認對話框數據。

其實DoDataExChange函數主要是通過DDX_TEXT(....)或 DDX_CONTROL(....)來實現數據的實時關聯的。

我從我的MSDN中隨便拿來一個定義:

void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, BYTE& value);

其實這個要關聯的話也很簡單,沒有那么復雜。如下:

value = GetDlgItemInt(nIDC);

SetDlgItemInt(nIDC, value);

而DoDataExchange 函數是在UpdateData函數內部調用的。

該函數只有一個布爾型參數,b31.org 它決定了數據傳送的方向:

調用UpdateData(TRUE),將數據從對話框的控件中傳送到對應的數據成員中。

調用UpdateData(FALSE),則將數據從數據成員中傳送給對應的控件。

UpdateData(FALSE)是將變量的值傳到控件.UpdateData(TRUE)是從控件中取值到關聯的變量

四、對話框伸縮功能的實現

只關聯到兩個函數:

// 取得指定窗口邊框折尺寸

void GetWindowRect(LPRECT lpRect)const;

// 設置指定窗口(控件)的位置同尺寸

BOOL SetWindowPos(const CWnd* pWndInsertAfter, intx, inty, int cx, intcy, UINTnFlags);

五、逃跑按鈕的實現

1.創建一個基于對話框的MFC 程序,刪除原有的控件后,再添加兩個按鈕,更改兩按鈕名為”你能抓到我嗎?“

2.打開類視圖,定義一個新類CNewButton,這個新類的基類為CButton。并為此類添加一個成員變量:CNewButton*m_pbtn;

3.打開資源視圖,分別為兩個按鈕創建兩個CNewButton類關聯變量:m_btn1, m_btn2;

4.在CXXXDlg中改寫其OnInitDialog函數。主要添加:

m_btn1.m_pbtn = &m_btn2;

m_btn2.m_pbtn = &m_btn1;

5.對于CNewButton 類,必定其OnMouseMove函數。主要添加:

ShowWindow(SW_HIDE);

m_pbtn->ShowWindow(SW_SHOW);

編譯,連接。OK

六、屬性頁、屬性表單與向導的建立

1.創建屬性頁

打開資源編輯器,點擊Dialog 資源并在列出的選項中,選擇:IDD_PROPPAGE_LARGE。建立屬性頁資源。

之后,我們就可以其上添加其他控件來完善我們的屬性頁。關于屬性頁的完善操作我們在后面會談到。

屬性頁資源完善后,再為每一個屬性頁關聯一個類。

2.創建屬性表單

打開類視圖,添加新類CPropSheet,其基類為CPropertySheet。

之后再為其添加屬性頁類對象,并在其構造函數中利用AddPage函數將屬性頁添加到表單上。

3.消息響應

再主菜單的最后再增加一個菜單項,并為此菜單添加消息響應函數。

在此響應函數中創建屬性表單:

CPropSheetpropSheet(TEXT(”屬性表單"));

propSheet.DoModal();

4.向導的創建

創建一個向導類型的對話框,應該遵循創建一個標準屬性表單的步驟來實現。

但在調用屬性表單對象的DoModal函數之前,應該先調用SetWizardMode函數,來聲明建立的是一個作為向導的屬性表單。

所以,應在DoModal函數之前添加如下代碼:

propSheet.SetWizardMode();

5.屬性頁的完善操作

首先我們要注意到屬性頁,澳門新濠天地官網66bb.org 在三個不同時期的關鍵性操作:當屬性表單中的某屬性頁被選中,從而成為一個活動的頁面時,應用程序框架就會調用OnSetActive函數。

OnSetActive 是其基類的一個虛函數,我們可以重寫這個函數并在其中進行一些操作。

假設當前我們處于屬性表單中的某屬性頁,當我們點擊下一步并將進入下一個屬性頁時,應用程序框架會調用OnWizardNext函數。

OnWizardNext 是其基類的一個虛函數,我們可以重寫這個函數并在其中進行一些操作。類似的還有OnWizardBack 同 OnWizardFinish函數。

當一個屬性頁被創建時,會調用其OnInitDialog函數。

我們可以在這個函數里對屬性頁中的控件進行一些操作。如為列表框或下拉框添加字符串等。

第四篇:MFC編程實驗個人總結報告

MFC編程實驗總結報告

知識總結+個人心得

2011年暑期MFC編程實驗報告

/ 6

MFC編程實驗個人總結報告

一、MFC類、函數等知識小結:

1、SetTimer(1, m_intLevel, NULL);在MFC程序中SetTimer被封裝在CWnd類中,調用就不用指定窗口句柄了于是SetTimer函數的原型變為:

UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))

當使用SetTimer函數的時候,就會生成一個計時器。函數中nIDEvent指的是計時器的標識,也就是名字。nElapse指的是時間間隔,也就是每隔多長時間觸發一次事件。第三個參數是一個回調函數,在這個函數里,放入你想要做的事情的代碼,你可以將它設定為NULL,也就是使用系統默認的回調函數,系統默認認的是onTime函數。這個函數怎么生成的呢?你需要在需要計時器的類的生成onTime函數:在ClassWizard里,選擇需要計時器的類,添加WM_TIME消息映射,就自動生成onTime函數了。然后在函數里添加代碼,讓代碼實現功能。每隔一段時間就會自動執行一次。

例:

SetTimer(1,1000,NULL);

1:計時器的名稱;

1000:時間間隔,單位是毫秒;

NULL:使用onTime函數。

當不需要計時器的時候調用KillTimer(nIDEvent);

例如:KillTimer(1);

KillTimer(1);

2、typedef struct{};(1)struct{ int x;int y;}test1;好,定義了 結構 test1,test1.x 和 test1.y 可以在語句里用了。

(2)struct test {int x;int y;}test1;定義了結構 test1,test1.x 和 test1.y 可以在語句里用了。與(1)比,省寫 了 test

(3)typedef struct test

/ 6

{int x;int y;}text1,text2;

此處時說了這種結構體(類型)別名 叫 text1 或叫 text2,而不是定義了結構體變量.真正在語句里用,還要寫: text1 test1;//定義結構體變量 然后好用 test1.x test1.y 或寫 text2 test1;//定義結構體變量 然后好用 test1.x test1.y

3、Invalidate();//讓客戶區無效,即時重新繪制客戶區

void Invalidate(BOOL bErase = TRUE);

該函數的作用是使整個窗口客戶區無效。窗口的客戶區無效意味著需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前臺窗口,那么原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC為窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase為TRUE時,重繪區域內的背景將被擦除,否則,背景將保持不變。

4、CDC::Rectangle(左上x,左上y,右下x,右下y);使用該函數畫一個矩形,可以用當前的畫筆畫矩形輪廓,用當前畫刷進行填充。

函數原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);

hdc:設備環境句柄。

nLeftRect:指定矩形左上角的邏輯X坐標。

nTopRect:指定矩形左上角的邏輯Y坐標。

nRightRect:指定矩形右下角的邏輯X坐標。

nBottomRect:指定矩形右下角的邏輯Y坐標。

5、CBrush:: CBrush//畫刷類

eg:CBrush brushStick(RGB(127, 127, 127));四種構造函數: CBrush();

CBrush(COLORREF crColor);

CBrush(int nIndex, COLORREF crColor);

CBrush(CBitmap* pBitmap);

/ 6

參數說明: crColor指定畫刷的前景色(RGB方式)。如果畫刷是陰影線型的,則指定陰影線的顏色。

nIndex指定畫刷陰影線采用的風格,取值如下:

HS_BDIAGONAL45度的向下影線(從左到右)

HS_CROSS水平和垂直方向以網格線作出陰影

HS_DIAGCROSS 45度的網格線陰影

HS_FDIAGONAL 45度的向上陰影線(從左到右)

HS_HORIZONTAL 水平的陰影線

HS_VERTICAL 垂直的陰影線

pBitmap指向CBitmap對象的指針,該對象指定了畫刷要繪制的位圖。

構造函數說明: 類CBrush一共有四個覆蓋的構造函數。不帶參數的那個構造函數構造一個未初始化的CBrush對象,在使用該對象之前需要另外初始化。如果使用了不帶參數的那個構造函數,則必須用CreateSolidBrush、CreateHatchBrush、CreateBrushIndirect、CreatePatternBrush或CreateDIBPatternBrush來初始化返回的CBrush對象。如果使用了帶參數的構造函數,則不再需要初始化CBrush對象。帶參數的構造函數在出錯時會產生一個異常,而不帶參數的構造函數總是成功返回。只帶有一個參數COLORREF的構造函數用指定的顏色構造一個實線型的畫刷。顏色是一個RGB值,可以用WINDOWS.H中的宏RGB構造出來。帶兩個參數的構造函數構造一個陰影線型的畫刷,參數nIndex指定了陰影線模式的指數(index)。參數crColor指定了畫刷的顏色。帶有一個CBitmap型參數的構造函數構造一個模式化的畫刷。參數指定一個位圖。該位圖應該是已經用CBitmap::CreateBitmap、CBitmap::CreateBitmapIndirect、CBitmap::LoadBitmap或CBitmap::CreateCompatiableBitmap建立或加載的位圖。填充模式下的位圖的最小尺寸為8像素×8像素。

6、MessageBox(“Game Over!”);MessageBox(NULL,“text”,“title”,BUTTON);參數title:string類型,指定消息對話框的標題。text:指定消息對話框中顯示的消息,該參數可以是數值數據類型、字符串或boolean值。icon:Icon枚舉類型,可選項,指定要在該對話框左側顯示的圖標。button:Button枚舉類型,可選項,指定顯示在該對話框底部的按鈕。default:數值型,可選項,指定作為缺省按鈕的按鈕編號,按鈕編號自左向右依次計數,缺省值為1,如果該參數指定的編號超過了顯示的按鈕個數,那么MessageBox()函數將使用缺省值返回值Integer。函數執行成功時返回用戶選擇的按鈕編號(例如1、2、3等),發生錯誤時返回-1。如果任何參數的值為NULL,4 / 6

MessageBox()函數返回NULL。

函數原型:MessageBox.Show(Text,Title,MessageBoxButtons,MessageBoxIcon ,MessageBoxDefaultButtons)

參數說明:

(1)Text:必選項,消息框的正文。(2)Title:可選項,消息框的標題。

(3)MessageBoxButtons:可選項,消息框的按鈕設置,默認只顯示【確定】按鈕。

OK――確定 OKCancel――確定和取消 AbortRetryIgnore――終止、重試和忽略

YesNoCancel――是、否和取消 YesNo――是和否 RetryCancel――重試和取消

(4)MessageBoxIcon:對話框中顯示的圖標樣式,默認不顯示任何圖標。

Question――問號 Information、Asterisk――i號 Error、Stop、Hand――錯誤號

Warning、Exclamation――!號 None――不顯示任何圖標

(5)MessageBoxDefaultButtons:可選項,對話框中默認選中的按鈕設置。

DefaultButton1――第1個button是默認按鈕

DefaultButton2――第2個button是默認按鈕

DefaultButton3――第3個button是默認按鈕

7、Memcpy(拷貝目的地,拷貝對象,拷貝長度);包含在頭文件#include

函數原型:

extern void *memcpy(void *destin, void *source, unsigned n);功能:

由source指向地址為起始地址的連續n個字節的數據復制到以destin指向地址為起始地址的空間內。eg: int a=5,b=9;memcpy(a,b,sizeof(a));//將b按位拷給a;說明:

1.source和destin所指內存區域不能重疊,函數返回指向destin的指針。

2.與strcpy相比,memcpy并不是遇到'

主站蜘蛛池模板: av无码中文字幕不卡一区二区三区| 国产亚洲制服免视频| 亚洲综合国产成人无码| 天天躁夜夜躁狠狠眼泪| 精品国产va久久久久久久冰| 黑人巨大白妞出浆| 天堂网在线.www天堂在线资源| 久久ww精品w免费人成| 国产女人叫床高潮大片| 人妻丝袜中文无码av影音先锋| 久久婷婷五月综合色奶水99啪| 曝光无码有码视频专区| 久久久久亚洲精品中文字幕| 欧美国产一区二区三区激情无套| 又色又污又爽又黄的网站| 777亚洲精品乱码久久久久久| 亚洲国产日韩欧美一区二区三区| 图片区小说区av区| 高清视频在线观看一区二区三区| 人妻少妇av无码一区二区| 鲁大师影院在线观看| 亚洲码欧美码一区二区三区| 亚洲国产一二三精品无码| 青草青草久热精品视频国产4| 2021国产精品国产精华| 特黄做受又粗又大又硬老头| 伊人久久大香线蕉无码| 国产无遮挡又黄又爽高潮| 亚洲成av人片在线观看wv| 免费三级现频在线观看播放| 又硬又粗又大一区二区三区视频| 国产午夜精品一区二区三区四区| 日韩精品无码专区| 三级在线看中文字幕完整版| 色六月婷婷亚洲婷婷六月| 亚洲国产成人精品无码区二本| 中文字幕乱妇无码av在线| 国产精品国产精品国产专区不卡| 亚洲色大成网站在线| 久久高清超碰av热热久久| 97人妻免费公开在线视频|