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

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>
            亚洲国产美国国产综合一区二区| 久久亚洲精品中文字幕冲田杏梨| 欧美精品性视频| 欧美一二三视频| 亚洲深夜av| 亚洲愉拍自拍另类高清精品| 亚洲狼人综合| 中文久久精品| 亚洲一区二区欧美| 午夜亚洲一区| 久久一本综合频道| 亚洲欧美日韩国产综合在线| 在线视频欧美一区| 午夜精品久久久久久久99水蜜桃| 午夜精品福利一区二区蜜股av| 亚洲一级特黄| 美女国产精品| 亚洲精品一区二区三区99| 亚洲精品美女在线| 最新日韩av| 欧美一级淫片aaaaaaa视频| 久久成人这里只有精品| 欧美精品性视频| 国产综合自拍| 亚洲一区免费| 亚洲国产婷婷| 欧美一区二区精品| 欧美一区二区三区久久精品茉莉花| 久久久噜噜噜久久久| 一区二区高清视频在线观看| 久久久欧美精品sm网站| 国产视频一区在线观看| 亚洲视频观看| 欧美亚洲免费| 男女视频一区二区| 99亚洲精品| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲国产成人精品视频| 亚洲欧美日韩第一区| 最新日韩欧美| 欧美激情一二三区| 国产精品一二一区| 亚洲全部视频| 制服丝袜激情欧洲亚洲| 国产精品国产福利国产秒拍 | 亚洲日本一区二区| 久久亚洲综合色| 欧美激情视频在线免费观看 欧美视频免费一 | 99国产精品久久久久久久| 国产精品jizz在线观看美国 | 老牛影视一区二区三区| 亚洲伊人伊色伊影伊综合网| 免费亚洲一区| 国产精品www| 欧美高清视频一二三区| 欧美日韩国产欧| 久久久久网址| 欧美三级特黄| 亚洲国产美女精品久久久久∴| 欧美日韩免费| 亚洲精品美女91| 日韩天堂在线视频| 国产精品免费一区豆花| 久久国产精品色婷婷| 欧美精品七区| 亚洲日本在线观看| 亚洲精品欧美日韩| 欧美大色视频| 欧美黄色免费| 亚洲福利国产| 久久久久久夜精品精品免费| 先锋影音国产精品| 国产一区在线播放| 欧美在线视频一区二区三区| 久久丁香综合五月国产三级网站| 欧美高清视频一区二区三区在线观看 | 麻豆精品传媒视频| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩小视频| 最新日韩av| 午夜久久美女| 国产模特精品视频久久久久 | 精品1区2区3区4区| 久久精品成人一区二区三区| 久久国内精品视频| 国内激情久久| 亚洲第一精品影视| 一本色道久久88综合亚洲精品ⅰ| 亚洲日本久久| 国产精品国产三级国产专播品爱网| 99视频精品在线| 久久国产精品72免费观看| 在线精品视频一区二区| 欧美日韩在线三级| 久久久久久久久一区二区| 亚洲国产网站| 久久人人爽人人| 亚洲女同同性videoxma| 亚洲经典视频在线观看| 国产日韩av在线播放| 欧美精品一区二| 久久午夜av| 欧美一二区视频| 欧美亚洲在线观看| 午夜精品视频| 篠田优中文在线播放第一区| 亚洲一区日本| 亚洲人成在线播放| 在线观看视频一区| 国产精品美女久久久久aⅴ国产馆| 欧美大片va欧美在线播放| 久久精品国产久精国产爱| 午夜亚洲福利| 亚洲天堂久久| 亚洲在线免费观看| 性做久久久久久免费观看欧美| 亚洲午夜久久久久久久久电影院| 亚洲精品日韩在线观看| 亚洲激情精品| 午夜在线一区二区| 免费亚洲网站| 欧美午夜不卡影院在线观看完整版免费| 欧美精品亚洲精品| 国产精品网站视频| 国内精品久久久久伊人av| 在线色欧美三级视频| 亚洲香蕉伊综合在人在线视看| 亚洲性视频h| 欧美成人免费小视频| aa级大片欧美| 免费永久网站黄欧美| 欧美日韩国产精品成人| 国产亚洲成av人片在线观看桃| 在线精品国产欧美| 亚洲一区激情| 亚洲人成网站精品片在线观看| 亚洲系列中文字幕| 久久嫩草精品久久久久| 亚洲精品影院在线观看| 久久全国免费视频| 国产欧美91| 午夜视频久久久| 一本色道久久综合亚洲精品婷婷 | 一区二区欧美日韩视频| 久久久美女艺术照精彩视频福利播放 | 亚洲欧洲精品一区二区精品久久久| 亚洲无吗在线| 国产精品捆绑调教| 亚洲欧美日韩国产一区| 亚洲人精品午夜| 欧美精品一区二区三| 91久久综合亚洲鲁鲁五月天| 鲁大师影院一区二区三区| 欧美伊人影院| 亚洲国产成人在线| 亚洲欧洲综合| 国产精品久久久久久久久久ktv| 亚洲日本成人女熟在线观看| 老司机精品久久| 欧美日本亚洲| 欧美伊人久久久久久久久影院 | 欧美欧美在线| 亚洲欧美卡通另类91av| 亚洲中字在线| 亚洲二区在线视频| av成人毛片| 国产一区自拍视频| 亚洲黄色尤物视频| 国产精品视频网址| 亚洲久久一区二区| 国内一区二区三区在线视频| 久久天天躁夜夜躁狠狠躁2022| 欧美成人小视频| 久久精品亚洲| 国产伦精品一区二区三区在线观看| 久久精品最新地址| 国产精品成人一区二区三区吃奶| 欧美在线观看视频在线| 欧美深夜影院| 亚洲激情自拍| 亚洲激情视频在线播放| 欧美一级视频| 亚洲一区视频| 欧美三级视频| 欧美午夜a级限制福利片| 亚洲第一天堂无码专区| 中文av一区特黄| 亚洲国产综合在线看不卡| 亚洲你懂的在线视频| 亚洲综合大片69999| 欧美麻豆久久久久久中文| 免费亚洲电影| 亚洲巨乳在线| 欧美日韩精品免费看 | 在线播放国产一区中文字幕剧情欧美 | 欧美午夜电影在线| 999亚洲国产精| 欧美一区二区三区视频免费播放| 欧美日韩福利视频| 一区二区三区视频免费在线观看|