第一篇: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 對話框編程--總結 一、創建對話框對象 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編程實驗總結報告 知識總結+個人心得 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人妻免费公开在线视频|
第三篇:MFC 對話框編程 -- 總結
第四篇:MFC編程實驗個人總結報告