青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

MFC消息映射機制的剖析

一,消息映射機制

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

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

 

二,有關繪圖

1,使用SDK獲取DC句柄:
HDC hdc;
hdc=::GetDc(m_hWnd);//獲取DC句柄
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);//釋放DC

2,利用CDC類指針和CWin類成員函數獲取DC。
CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);

3,利用CClientDC對象。(CClientDC類從CDC類派生來的)
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.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類派生來的)
CWindowDC dc(this);//
dc.MoveTo(m_ptOrigin);
dc.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,利用畫筆改變線條顏色和類型:
CPen pen(PS_DOT,1,RGB(0,255,0));//構造畫筆對象
CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);//將畫筆選入DC
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);//恢復先前的畫筆

7,使用畫刷(通常利用畫刷去填充矩形區域):
使用單色畫刷
CBrush brush(RGB(255,0,0));//構造畫刷對象
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的畫刷去填充矩形區域

使用位圖畫刷
CBitmap bitmap;//構造位圖對象(使用前需要初試化)
bitmap.LoadBitmap(IDB_BITMAP1);//初試化位圖對象
CBrush brush(&bitmap);//構造位圖畫刷
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的位圖畫刷去填充矩形區域

使用透明畫刷
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//獲取透明畫刷對象指針
CClientDC dc(this);
CBrush *pOldBrush=dc.SelectObject(pBrush);//將透明畫刷選入DC
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);//釋放透明畫刷
說明:
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是一個靜態方法,故可用CBrush::FromHandle()形式調用。
注意點:
1)靜態方法不屬于某一個具體對象,而屬于類本身,在類加載的時候就已經為類靜態方法分配了代碼去,故可用CBrush::FromHandle()形式調用。
2)靜態方法中,不能引用非靜態的數據成員和方法。
3)靜態數據成員需要在類外單獨做初始化,形式如: 變量類型 類名::變量名=初始值;

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

posted on 2008-03-11 15:08 弱水一瓢 閱讀(186) 評論(0)  編輯 收藏 引用 所屬分類: MFC

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

文章分類

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美视频在线视频| 国产精品亚洲激情| 亚洲黄色av一区| 欧美大片一区二区三区| 久久久久看片| 亚洲精品护士| 最新中文字幕一区二区三区| 女人色偷偷aa久久天堂| 亚洲人在线视频| 99综合视频| 国产伦一区二区三区色一情| 久久九九99视频| 老巨人导航500精品| 亚洲乱码精品一二三四区日韩在线| 亚洲精品小视频| 国产精品五月天| 久久综合色88| 欧美日韩伦理在线免费| 香蕉尹人综合在线观看| 久久久久国产成人精品亚洲午夜| 在线观看国产精品淫| 亚洲激情视频在线播放| 欧美亚洲成人网| 老司机午夜精品视频在线观看| 欧美成人综合在线| 亚洲制服少妇| 麻豆久久精品| 欧美一区二区在线免费播放| 麻豆精品国产91久久久久久| 宅男噜噜噜66一区二区| 欧美一级视频免费在线观看| 亚洲毛片一区二区| 欧美一级视频一区二区| 亚洲精品在线免费| 欧美一区二区三区久久精品| 亚洲免费观看高清在线观看| 欧美在线免费观看亚洲| 亚洲视频国产视频| 美女性感视频久久久| 欧美亚洲在线视频| 欧美大片在线观看一区二区| 久久久av毛片精品| 国产精品成人一区二区网站软件 | 在线成人亚洲| 一区二区三区视频在线| 亚洲日本欧美在线| 小黄鸭精品密入口导航| 中文在线一区| 久久手机免费观看| 久久精品日产第一区二区三区| 欧美日韩国产二区| 欧美国产亚洲视频| 国内成人精品2018免费看| 一区二区三区欧美在线| 亚洲精品国产无天堂网2021| 久久激情综合网| 欧美在线视频网站| 国产精品99免费看 | 欧美精品日韩| 欧美福利视频在线| 伊伊综合在线| 久久天堂成人| 欧美成人中文字幕| 在线观看日韩专区| 久久久精品动漫| 久久裸体艺术| 在线观看欧美亚洲| 老色批av在线精品| 欧美.www| 亚洲日本欧美| 欧美激情乱人伦| 亚洲精品中文在线| 一区二区精品在线| 欧美午夜电影网| 亚洲一区二区三区视频| 亚洲欧美一区二区激情| 国产精品日韩专区| 午夜亚洲激情| 久热国产精品| 亚洲黄色一区二区三区| 嫩模写真一区二区三区三州| 亚洲国产毛片完整版| 亚洲另类一区二区| 欧美日韩一区二区免费在线观看| 亚洲视频在线观看网站| 性欧美1819性猛交| 国产一区二区在线观看免费播放| 久久久久久久久综合| 美女啪啪无遮挡免费久久网站| 在线看片成人| 欧美日韩国产美| 亚洲欧美激情精品一区二区| 久久精品国产亚洲一区二区三区 | 欧美日韩精品免费在线观看视频| 日韩视频专区| 久久国产福利国产秒拍| 亚洲国产精选| 国产精品久久久久久久午夜片| 香蕉成人久久| 亚洲国产精品电影在线观看| 午夜精品久久久久久久| 在线观看成人网| 国产精品成人在线观看| 久久精品欧美日韩精品| 亚洲精品欧美| 午夜精品久久久久久久99樱桃| 激情校园亚洲| 欧美日一区二区在线观看| 欧美在线看片| 亚洲少妇在线| 欧美成人免费在线观看| 亚洲欧美欧美一区二区三区| 亚洲高清不卡在线观看| 国产精品视频大全| 免费的成人av| 久久精品观看| 亚洲在线不卡| 亚洲精品免费看| 免费永久网站黄欧美| 亚洲免费视频网站| 亚洲精品美女久久久久| 国产午夜精品在线观看| 欧美日韩国产综合网| 久久美女性网| 久久aⅴ国产欧美74aaa| 99国产精品| 欧美高清不卡在线| 久久久久久久久久久久久女国产乱 | 一本色道**综合亚洲精品蜜桃冫| 韩日成人在线| 国产精品一香蕉国产线看观看 | 久久久人成影片一区二区三区观看 | 久久久久久久波多野高潮日日 | 亚洲精品一区二区三区樱花 | 亚洲国产高清高潮精品美女| 久久久久久999| 久久成人一区| 久久国产精品一区二区三区四区 | 国产真实乱偷精品视频免| 欧美系列精品| 国产精品vvv| 欧美日韩一区高清| 欧美日韩伦理在线| 欧美日韩国产页| 欧美激情综合色| 欧美日韩不卡在线| 欧美精品1区2区| 欧美日本韩国一区| 欧美日韩国产不卡| 欧美日韩国产二区| 欧美日韩精品一区二区天天拍小说 | 久久狠狠婷婷| 久久人体大胆视频| 美女黄毛**国产精品啪啪| 久久夜色精品国产欧美乱极品| 久久琪琪电影院| 欧美成人小视频| 欧美日韩国产影院| 欧美日韩中字| 国产精品亚洲人在线观看| 国产午夜精品一区二区三区视频| 国产亚洲免费的视频看| 亚洲第一综合天堂另类专| 亚洲国产小视频在线观看| 日韩亚洲欧美高清| 亚洲永久视频| 裸体女人亚洲精品一区| 亚洲电影在线播放| 99精品热视频| 久久国产主播精品| 欧美精品国产| 国产精品久久久一区麻豆最新章节 | 午夜精品一区二区三区在线视| 久久久久久亚洲精品杨幂换脸 | 精东粉嫩av免费一区二区三区| 精品成人一区二区三区四区| 在线观看亚洲视频| 一本大道久久a久久精品综合| 欧美一级专区| 亚洲高清不卡| 性欧美videos另类喷潮| 欧美jizzhd精品欧美喷水| 欧美日韩亚洲系列| 国产在线欧美日韩| 宅男精品视频| 欧美成人精品在线视频| 99国产精品久久久久久久久久| 久久国产福利国产秒拍| 欧美日韩精品在线观看| 狠狠综合久久| 欧美一进一出视频| 亚洲激情国产精品| 久久国产婷婷国产香蕉| 欧美日韩在线电影| 在线观看亚洲视频啊啊啊啊| 小嫩嫩精品导航| 亚洲精品欧美日韩| 久久亚洲春色中文字幕| 国产模特精品视频久久久久 | 国产色综合网|