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

MFC消息映射機制的剖析

MFC消息映射機制的剖析

一,消息映射機制

1,消息響應(yīng)函數(shù):(例:在CDrawView類響應(yīng)鼠標(biāo)左鍵按下消息)
1)在頭文件(DrawView.h)中聲明消息響應(yīng)函數(shù)原型。
//{{AFX_MSG(CDrawView)   //注釋宏
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG   //注釋宏
說明:
在注釋宏之間的聲明在VC中灰色顯示。afx_msg宏表示聲明的是一個消息響應(yīng)函數(shù)。
2)在源文件(DrawView.cpp)中進(jìn)行消息映射。
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()之間進(jìn)行消息映射。
宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN與它的響應(yīng)函數(shù)OnLButtonDown()相關(guān)聯(lián)。這樣一旦有消息的產(chǎn)生,就會自動調(diào)用相關(guān)聯(lián)的消息響應(yīng)函數(shù)去處理。
宏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)源文件中進(jìn)行消息響應(yīng)函數(shù)處理。(DrawView.cpp中自動生成OnLButtonDown函數(shù)輪廓,如下)
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
}
說明:
可見當(dāng)增加一個消息響應(yīng)處理,在以上三處進(jìn)行了修改??稍谙㈨憫?yīng)函數(shù)里添加消息處理代碼完成對消息的響應(yīng)、處理。

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

 

二,有關(guān)繪圖

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類成員函數(shù)獲取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));//構(gòu)造畫筆對象
CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);//將畫筆選入DC
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);//恢復(fù)先前的畫筆

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

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

使用透明畫刷
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是一個靜態(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 2010-06-21 22:43 lhking 閱讀(281) 評論(0)  編輯 收藏 引用

導(dǎo)航

<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統(tǒng)計

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品在线观看免费| 久久本道综合色狠狠五月| 亚洲日本视频| 欧美高清hd18日本| 国产精品99久久久久久人| 亚洲欧美在线观看| 久久精品国语| 亚洲国产一区二区三区高清| 一区二区三区日韩欧美| 国产精品看片资源| 蜜臀久久久99精品久久久久久| 久久久久久久久蜜桃| 日韩午夜激情电影| 韩国福利一区| 国产精品丝袜久久久久久app| 欧美一区二区女人| 久久精品夜色噜噜亚洲aⅴ| 韩国av一区二区三区| 亚洲日本成人| 久久婷婷丁香| 久久一区二区三区av| 欧美在线视频在线播放完整版免费观看| 亚洲精品一级| 亚洲午夜av电影| 亚洲日本在线视频观看| 亚洲国产小视频| 亚洲美女一区| 99精品热视频只有精品10| 亚洲视频在线观看网站| 在线亚洲激情| 欧美激情无毛| 久久久综合网站| 亚洲国产欧美一区二区三区丁香婷| 中国成人黄色视屏| 久久人人爽人人爽爽久久| 亚洲精品在线观看免费| 亚洲大胆人体在线| 亚洲欧美一级二级三级| 久久久久久久一区| 亚洲卡通欧美制服中文| 在线精品亚洲| 你懂的成人av| 亚洲国产三级| 亚洲第一页中文字幕| 久热精品在线视频| 91久久综合| 亚洲人成7777| 在线观看国产成人av片| 欧美成人免费在线视频| 欧美视频在线观看视频极品| 国产欧美韩国高清| 夜夜嗨av一区二区三区网站四季av | 亚洲人成在线播放| 久久久久久久久综合| 亚洲摸下面视频| 亚洲天堂免费观看| 亚洲一区二区在线播放| 亚洲精品国产精品久久清纯直播| 欧美韩日高清| 欧美精品一区二区三区一线天视频| 欧美一级黄色录像| 欧美aaa级| 欧美丝袜一区二区| 午夜伦欧美伦电影理论片| 在线观看亚洲a| 91久久综合亚洲鲁鲁五月天| 亚洲日本成人女熟在线观看| 亚洲第一久久影院| 亚洲日本无吗高清不卡| 一本色道久久综合亚洲91| 怡红院av一区二区三区| 国产午夜精品全部视频在线播放| 激情婷婷亚洲| 久久亚洲综合色| 欧美成人一品| 午夜免费在线观看精品视频| 亚洲第一狼人社区| 国产欧美日韩综合| 一区二区精品国产| 亚洲大片免费看| 久久综合伊人77777麻豆| 欧美日本不卡高清| 黑人操亚洲美女惩罚| 亚洲一区二区三区高清| 欧美电影免费观看高清| 你懂的国产精品| 一区二区三区日韩欧美精品| 欧美激情视频一区二区三区不卡| 亚洲性视频h| 国产欧美日本在线| 久久综合中文色婷婷| 久久久午夜精品| 亚洲国产午夜| 一区二区欧美在线| 国产欧美日韩一区二区三区在线观看 | 99精品视频免费观看视频| 欧美精品色综合| 欧美专区福利在线| 午夜免费在线观看精品视频| 日韩视频在线免费观看| 亚洲欧美综合网| 亚洲精品一区二区三| 亚洲欧美资源在线| 99精品视频免费观看视频| 久久狠狠亚洲综合| 中国日韩欧美久久久久久久久| 免费看精品久久片| 新67194成人永久网站| 欧美激情五月| 亚洲伦伦在线| 一区二区精品| 国产精品激情电影| 亚洲一区免费网站| 亚洲男人的天堂在线观看 | 激情成人亚洲| 欧美日韩1区2区3区| 亚洲永久字幕| 亚洲精选成人| 老司机一区二区| 亚洲欧美视频在线观看| 一区二区三区四区精品| 亚洲日本欧美天堂| 亚洲国产精品第一区二区| 国产精品永久| 国产情人综合久久777777| 亚洲精品一级| 国产视频久久久久| 久久精品成人一区二区三区| 欧美jizzhd精品欧美巨大免费| 国内精品久久久久影院优| 欧美+日本+国产+在线a∨观看| 欧美freesex8一10精品| 99视频精品| 国产一区激情| 国产精品爽爽爽| 欧美日韩高清一区| 久久国产精品一区二区三区| 亚洲第一毛片| 亚洲综合国产| 亚洲欧美在线一区| 亚洲视频一区二区| 亚洲精品视频免费| 在线不卡中文字幕| 一区二区三区在线观看国产| 国产精品久久久久久超碰| 免费观看在线综合色| 久久久最新网址| 久久国产免费看| 久久久999精品视频| 午夜天堂精品久久久久| 久久久久国产精品午夜一区| 久久久久.com| 欧美色图麻豆| 亚洲电影自拍| 亚洲手机视频| 可以免费看不卡的av网站| 欧美本精品男人aⅴ天堂| 久久一区二区三区超碰国产精品| 亚洲午夜在线观看视频在线| 在线亚洲伦理| 一区二区三区视频在线播放| 亚洲图片欧美一区| 欧美一区二区三区四区高清| 久久精品中文字幕一区| 免费亚洲电影在线| 一个色综合av| 欧美激情视频网站| 亚洲免费视频在线观看| 日韩天天综合| 久久嫩草精品久久久精品一| 欧美久久影院| 黄页网站一区| 久久久久一区二区三区| 亚洲午夜免费福利视频| 老司机午夜免费精品视频| 国产亚洲精品美女| 亚洲精品国产精品久久清纯直播| 久久婷婷久久| 亚洲日本一区二区三区| 欧美成人免费在线| 狠狠色综合网站久久久久久久| 午夜精品久久一牛影视| 日韩午夜av电影| 久久精品女人天堂| 亚洲国产欧美一区| 欧美一区二区三区在线观看视频| 亚洲永久在线观看| 欧美日韩在线播放三区四区| 亚洲天堂免费观看| 香港成人在线视频| 狠狠色狠狠色综合日日tαg| 久久综合亚洲社区| 久久精品女人| 亚洲精品综合精品自拍| 亚洲一二三四久久| 国产一区二区三区av电影| 欧美顶级艳妇交换群宴| 欧美激情国产日韩| 亚洲无限av看| 久久爱另类一区二区小说|