欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      MFC編程學習心得

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

      第一篇:MFC編程學習心得

      //

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

      LONG、DWORD(32位,4字節(jié))WPARAM、LPARAM(32位,4字節(jié))SHORT、WORD(16位,2字節(jié))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開發(fā)平臺。

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

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

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

      二、SendMessage和PostMessage函數的功能:

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

      三、SendMessage和PostMessage兩個函數的區(qū)別是:

      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)跨線程或者跨進程發(fā)送消息,推薦使用PostMessage函數。

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

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

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

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

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

      多數用于開發(fā)小規(guī)模軟件,例如:任務管理器。

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

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

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

      二、對話框初始化消息:

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

      窗口還未顯示出來,只有父窗口,子窗口還沒創(chuàng)建

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

      子窗口已經全部創(chuàng)建完成,可以調用和操作子窗口

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

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

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

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

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

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

      四、非模式對話框:

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

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

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

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

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

      1、DestroyWindow:摧毀窗口。

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

      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()創(chuàng)建黑色矩形條插入符,插入符寬度為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;

      //聲明靜態(tài)變量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程序框架

      (二)鼠標繪圖

      用鼠標繪制圖形,一般分三個環(huán)節(jié):

      (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,打開執(zhí)行文件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,打開執(zhí)行文件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,打開執(zhí)行文件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 對話框編程--總結

      一、創(chuàng)建對話框對象

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

      2.創(chuàng)建話話框對象

      模態(tài)對話框的創(chuàng)建:

      如:

      CTestDlgdlg;

      dlg.DoModal();

      非模態(tài)對話框創(chuàng)建:

      如:

      CTestDlgdlg;

      dlg.Create(IDD_DIALOG, this);

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

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

      對于模態(tài)對話框,當執(zhí)行到DoModal 函數以創(chuàng)建對話框時,程序會暫停執(zhí)行,直至模態(tài)對話框關閉。所以創(chuàng)建模態(tài)對話框可以采用局部對象。

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

      解決方法有兩個:

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

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

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

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

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

      CTestDlg*pDlg = new CTestDlg;

      pDlg->Create(IDD_DIALOG, this);

      pDlg->ShowWindow(SW_SHOW);

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

      二、動態(tài)創(chuàng)建按鈕

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

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

      要注意兩點:

      如果在調用CButton::Create創(chuàng)建按鈕時沒有指定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.創(chuàng)建一個基于對話框的MFC 程序,刪除原有的控件后,再添加兩個按鈕,更改兩按鈕名為”你能抓到我嗎?“

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

      3.打開資源視圖,分別為兩個按鈕創(chuàng)建兩個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.創(chuàng)建屬性頁

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

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

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

      2.創(chuàng)建屬性表單

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

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

      3.消息響應

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

      在此響應函數中創(chuàng)建屬性表單:

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

      propSheet.DoModal();

      4.向導的創(chuàng)建

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

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

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

      propSheet.SetWizardMode();

      5.屬性頁的完善操作

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

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

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

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

      當一個屬性頁被創(chuàng)建時,會調用其OnInitDialog函數。

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

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

      MFC編程實驗總結報告

      知識總結+個人心得

      2011年暑期MFC編程實驗報告

      / 6

      MFC編程實驗個人總結報告

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

      1、SetTimer(1, m_intLevel, NULL);在MFC程序中SetTimer被封裝在CWnd類中,調用就不用指定窗口句柄了于是SetTimer函數的原型變?yōu)椋?/p>

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

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

      例:

      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();//讓客戶區(qū)無效,即時重新繪制客戶區(qū)

      void Invalidate(BOOL bErase = TRUE);

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

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

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

      hdc:設備環(huán)境句柄。

      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。函數執(zhí)行成功時返回用戶選擇的按鈕編號(例如1、2、3等),發(fā)生錯誤時返回-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指向地址為起始地址的連續(xù)n個字節(jié)的數據復制到以destin指向地址為起始地址的空間內。eg: int a=5,b=9;memcpy(a,b,sizeof(a));//將b按位拷給a;說明:

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

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