• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 47, 文章 - 10, 評論 - 8, 引用 - 0
            數(shù)據(jù)加載中……

            孫鑫VC++講座筆記-(4)MFC消息映射機制的剖析

            1,消息響應函數(shù):(例:在CDrawView類響應鼠標左鍵按下消息)
            ?1)在頭文件(DrawView.h)中聲明消息響應函數(shù)原型。
            1//{{AFX_MSG(CDrawView)???//注釋宏
            2afx_msg?void?OnLButtonDown(UINT?nFlags,?CPoint?point);
            3//}}AFX_MSG???//注釋宏
            說明:
            在注釋宏之間的聲明在VC中灰色顯示。afx_msg宏表示聲明的是一個消息響應函數(shù)。
            ?2)在源文件(DrawView.cpp)中進行消息映射。
            1BEGIN_MESSAGE_MAP(CDrawView,?CView)
            2?//{{AFX_MSG_MAP(CDrawView)
            3?ON_WM_LBUTTONDOWN()
            4?//}}AFX_MSG_MAP
            5?//?Standard?printing?commands
            6?ON_COMMAND(ID_FILE_PRINT,?CView::OnFilePrint)
            7?ON_COMMAND(ID_FILE_PRINT_DIRECT,?CView::OnFilePrint)
            8?ON_COMMAND(ID_FILE_PRINT_PREVIEW,?CView::OnFilePrintPreview)
            9END_MESSAGE_MAP()
            說明:
            在宏BEGIN_MESSAGE_MAP()與END_MESSAGE_MAP()之間進行消息映射。
            宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN與它的響應函數(shù)OnLButtonDown()相關(guān)聯(lián)。這樣一旦有消息的產(chǎn)生,就會自動調(diào)用相關(guān)聯(lián)的消息響應函數(shù)去處理。
            宏ON_WM_LBUTTONDOWN()定義如下:
            1#define?ON_WM_LBUTTONDOWN()?\
            2?{?WM_LBUTTONDOWN,?0,?0,?0,?AfxSig_vwp,?\
            3??(AFX_PMSG)(AFX_PMSGW)(void?(AFX_MSG_CALL?CWnd::*)(UINT,?CPoint))&OnLButtonDown?}
            ,
            4?3)源文件中進行消息響應函數(shù)處理。(DrawView.cpp中自動生成OnLButtonDown函數(shù)輪廓,如下)
            5void?CDrawView::OnLButtonDown(UINT?nFlags,?CPoint?point)?
            6{
            7?//?TODO:?Add?your?message?handler?code?here?and/or?call?default
            8?CView::OnLButtonDown(nFlags,?point);
            9}
            說明:
            可見當增加一個消息響應處理,在以上三處進行了修改。可在消息響應函數(shù)里添加消息處理代碼完成對消息的響應、處理。

            2,消息響應的方式:
            1)在基類中針對每種消息做一個虛函數(shù),當子類對消息響應時候,只要在子類中重寫這個虛函數(shù)即可。缺點:MFC類派生層次很多,如果在基類對每個消息進行虛函數(shù)處理,那么從基類派生的每個子類都將背負一個龐大的虛表,這樣浪費內(nèi)存,故MFC沒有采取這中方式而采取消息映射方式。
            2)消息映射方式:MFC在后臺維護了一個句柄和C++對象指針對照表,當收到一個消息后,通過消息結(jié)構(gòu)里資源句柄(查對照表)就可找到與它對應的一個C++對象指針,然后把這個指針傳給基類,基類利用這個指針調(diào)用WindowProc()函數(shù)對消息進行處理,WindowProc()函數(shù)中調(diào)用OnWndMsg()函數(shù),真正的消息路由及處理是由OnWndMsg()函數(shù)完成的。由于WindowProc()和OnWndMsg()都是虛函數(shù),而且是用派生類對象指針調(diào)用的,由多態(tài)性知最總終調(diào)用子類的。在OnWndMsg()函數(shù)處理的時候,根據(jù)消息種類去查找消息映射,判斷所發(fā)的消息有沒有響應函數(shù),具體方式是到相關(guān)的頭文件和源文件中尋找消息響應函數(shù)聲明(從注釋宏//{{AFX_MSG(CDrawView)...//}}AFX_MSG之間尋找),消息映射(從宏BEGIN_MESSAGE_MAP(...)....END_MESSAGE_MAP()之間尋找),最終找到對應的消息處理函數(shù)。當然,如果子類中沒有對消息進行處理,則消息交由基類處理。
            說明:

            1virtual?LRESULT?WindowProc(UINT?message,?WPARAM?wParam,?LPARAM?lParam);
            2virtual?BOOL?OnWndMsg(UINT?message,?WPARAM?wParam,?LPARAM?lParam,?LRESULT*?pResult);

            二,有關(guān)繪圖

            1,使用SDK獲取DC句柄:

            1HDC?hdc;
            2hdc=::GetDc(m_hWnd);//獲取DC句柄
            3MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
            4LineTo(hdc,point.x,point.y);
            5::ReleaseDC(m_hWnd,hdc);//釋放DC

            2,利用CDC類指針和CWin類成員函數(shù)獲取DC。
            1CDC?*pDC=GetDC();
            2pDC->MoveTo(m_ptOrigin);
            3pDC->LineTo(point);
            4ReleaseDC(pDC);
            3,利用CClientDC對象。(CClientDC類從CDC類派生來的)
            1CClientDC?dc(this);
            2dc.MoveTo(m_ptOrigin);
            3dc.LineTo(point);
            說明:
            The CClientDC class is derived from CDC and takes care of calling the Windows functions GetDC at construction time and ReleaseDC at destruction time. This means that the device context associated with a CClientDC object is the client area of a window.
            4,利用CWindowDC對象。(CWindowDC類從CDC類派生來的)
            1CWindowDC?dc(this);//
            2dc.MoveTo(m_ptOrigin);
            3dc.LineTo(point);
            說明:
            The CWindowDC class is derived from CDC. It calls the Windows functionsGetWindowDC at construction time andReleaseDC at destruction time. This means that a CWindowDC object accesses the entire screen area of a CWnd (both client and nonclient areas).

            5,GetParent()得到父窗口指針;GetDesktopWindow()得到屏幕窗口指針。

            6,利用畫筆改變線條顏色和類型:

            1CPen?pen(PS_DOT,1,RGB(0,255,0));//構(gòu)造畫筆對象
            2CClientDC?dc(this);CPen?*pOldPen=dc.SelectObject(&pen);//將畫筆選入DC
            3dc.MoveTo(m_ptOrigin);
            4dc.LineTo(point);
            5dc.SelectObject(pOldPen);//恢復先前的畫筆

            7,使用畫刷(通常利用畫刷去填充矩形區(qū)域):
            ?1//使用單色畫刷
            ?2CBrush?brush(RGB(255,0,0));//構(gòu)造畫刷對象
            ?3CClientDC?dc(this);
            ?4dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的畫刷去填充矩形區(qū)域
            ?5
            ?6//使用位圖畫刷
            ?7CBitmap?bitmap;//構(gòu)造位圖對象(使用前需要初試化)
            ?8bitmap.LoadBitmap(IDB_BITMAP1);//初試化位圖對象
            ?9CBrush?brush(&bitmap);//構(gòu)造位圖畫刷
            10CClientDC?dc(this);
            11dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的位圖畫刷去填充矩形區(qū)域
            12
            13//使用透明畫刷
            14CBrush?*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//獲取透明畫刷對象指針
            15CClientDC?dc(this);
            16CBrush?*pOldBrush=dc.SelectObject(pBrush);//將透明畫刷選入DC
            17dc.Rectangle(CRect(m_ptOrigin,point));
            18dc.SelectObject(pOldBrush);//釋放透明畫刷
            19
            20

            說明:
            The GetStockObject function retrieves a handle to one of the predefined stock pens, brushes, fonts, or palettes.
            HGDIOBJ GetStockObject(
            ? int fnObject?? // type of stock object
            );

            Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.
            static CBrush* PASCAL FromHandle( HBRUSH hBrush );//FromHandle是一個靜態(tài)方法,故可用CBrush::FromHandle()形式調(diào)用。
            注意點:
            1)靜態(tài)方法不屬于某一個具體對象,而屬于類本身,在類加載的時候就已經(jīng)為類靜態(tài)方法分配了代碼去,故可用CBrush::FromHandle()形式調(diào)用。
            2)靜態(tài)方法中,不能引用非靜態(tài)的數(shù)據(jù)成員和方法。
            3)靜態(tài)數(shù)據(jù)成員需要在類外單獨做初始化,形式如: 變量類型 類名::變量名=初始值;

            8,CDC::SetROP2方法:
            int SetROP2( int nDrawMode );
            Sets the current drawing mode.

            posted on 2006-04-04 11:08 編程之道 閱讀(183) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            2021久久国自产拍精品| 精品久久久久久无码国产| 久久99精品久久久久久不卡 | 久久综合狠狠综合久久| 99久久国产综合精品五月天喷水 | 女人香蕉久久**毛片精品| 狼狼综合久久久久综合网| 亚洲AV无码成人网站久久精品大| 午夜精品久久久久| 久久久国产精华液| 久久人人爽爽爽人久久久| 久久国产欧美日韩精品| 久久免费线看线看| 激情久久久久久久久久| 久久久久久国产精品免费免费 | 青青国产成人久久91网| 91亚洲国产成人久久精品| 伊人久久大香线蕉精品| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产一区二区精品久久凹凸 | 久久精品亚洲一区二区三区浴池 | 久久综合九色综合欧美就去吻| 久久久久久A亚洲欧洲AV冫 | 国产女人aaa级久久久级| 久久久网中文字幕| 综合人妻久久一区二区精品| 久久精品中文騷妇女内射| 精品久久久久久久久久久久久久久 | 精品欧美一区二区三区久久久 | 精品久久久久久国产| 国产一区二区精品久久岳| 性做久久久久久久久浪潮| 国产精品99精品久久免费| 精品无码久久久久久久动漫| 国产69精品久久久久9999APGF| 狠狠色丁香婷婷久久综合不卡| 欧美与黑人午夜性猛交久久久| 欧美熟妇另类久久久久久不卡| 97精品国产97久久久久久免费| 亚洲国产精品久久久天堂| 国产精品一区二区久久精品无码 |