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

MFC消息映射機(jī)制的剖析

MFC消息映射機(jī)制的剖析

一,消息映射機(jī)制

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   //注釋宏
說(shuō)明:
在注釋宏之間的聲明在VC中灰色顯示。afx_msg宏表示聲明的是一個(gè)消息響應(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()
說(shuō)明:
在宏BEGIN_MESSAGE_MAP()與END_MESSAGE_MAP()之間進(jìn)行消息映射。
宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN與它的響應(yīng)函數(shù)OnLButtonDown()相關(guān)聯(lián)。這樣一旦有消息的產(chǎn)生,就會(huì)自動(dòng)調(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中自動(dòng)生成OnLButtonDown函數(shù)輪廓,如下)
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
}
說(shuō)明:
可見(jiàn)當(dāng)增加一個(gè)消息響應(yīng)處理,在以上三處進(jìn)行了修改。可在消息響應(yīng)函數(shù)里添加消息處理代碼完成對(duì)消息的響應(yīng)、處理。

2,消息響應(yīng)的方式:
1)在基類中針對(duì)每種消息做一個(gè)虛函數(shù),當(dāng)子類對(duì)消息響應(yīng)時(shí)候,只要在子類中重寫(xiě)這個(gè)虛函數(shù)即可。缺點(diǎn):MFC類派生層次很多,如果在基類對(duì)每個(gè)消息進(jìn)行虛函數(shù)處理,那么從基類派生的每個(gè)子類都將背負(fù)一個(gè)龐大的虛表,這樣浪費(fèi)內(nèi)存,故MFC沒(méi)有采取這中方式而采取消息映射方式。
2)消息映射方式:MFC在后臺(tái)維護(hù)了一個(gè)句柄和C++對(duì)象指針對(duì)照表,當(dāng)收到一個(gè)消息后,通過(guò)消息結(jié)構(gòu)里資源句柄(查對(duì)照表)就可找到與它對(duì)應(yīng)的一個(gè)C++對(duì)象指針,然后把這個(gè)指針傳給基類,基類利用這個(gè)指針調(diào)用WindowProc()函數(shù)對(duì)消息進(jìn)行處理,WindowProc()函數(shù)中調(diào)用OnWndMsg()函數(shù),真正的消息路由及處理是由OnWndMsg()函數(shù)完成的。由于WindowProc()和OnWndMsg()都是虛函數(shù),而且是用派生類對(duì)象指針調(diào)用的,由多態(tài)性知最總終調(diào)用子類的。在OnWndMsg()函數(shù)處理的時(shí)候,根據(jù)消息種類去查找消息映射,判斷所發(fā)的消息有沒(méi)有響應(yīng)函數(shù),具體方式是到相關(guān)的頭文件和源文件中尋找消息響應(yīng)函數(shù)聲明(從注釋宏//{{AFX_MSG(CDrawView)...//}}AFX_MSG之間尋找),消息映射(從宏BEGIN_MESSAGE_MAP(...)....END_MESSAGE_MAP()之間尋找),最終找到對(duì)應(yīng)的消息處理函數(shù)。當(dāng)然,如果子類中沒(méi)有對(duì)消息進(jìn)行處理,則消息交由基類處理。
說(shuō)明:
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對(duì)象。(CClientDC類從CDC類派生來(lái)的)
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
說(shuō)明:
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對(duì)象。(CWindowDC類從CDC類派生來(lái)的)
CWindowDC dc(this);//
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
說(shuō)明:
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,利用畫(huà)筆改變線條顏色和類型:
CPen pen(PS_DOT,1,RGB(0,255,0));//構(gòu)造畫(huà)筆對(duì)象
CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);//將畫(huà)筆選入DC
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);//恢復(fù)先前的畫(huà)筆

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

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

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

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

posted on 2010-06-21 22:43 lhking 閱讀(283) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆檔案

搜索

最新評(píng)論

閱讀排行榜

評(pí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香蕉一区二区| 午夜精品久久久久久久久久久久久 | 欧美经典一区二区三区| 亚洲人体影院| 亚洲精品在线视频| 欧美日韩黄视频| 亚洲欧美久久| 欧美一区二区久久久| 激情视频一区| 亚洲精品1区| 欧美激情中文不卡| 新狼窝色av性久久久久久| 久久9热精品视频| 日韩视频在线一区二区| 亚洲视频在线观看免费| 国产麻豆视频精品| 亚洲第一成人在线| 国产精品嫩草99av在线| 麻豆av一区二区三区| 欧美激情一区二区久久久| 午夜精品久久久| 免费观看成人网| 亚洲摸下面视频| 久久蜜桃精品| 先锋影音久久| 欧美激情影院| 久久久免费精品| 欧美日韩在线播| 欧美插天视频在线播放| 国产精品久在线观看| 欧美激情精品久久久久久蜜臀| 欧美日韩国产成人在线观看| 久久精品国产免费| 欧美日本不卡高清| 噜噜噜在线观看免费视频日韩| 欧美日本乱大交xxxxx| 久久人人爽人人爽爽久久| 欧美日韩在线综合| 欧美激情一区二区三区在线视频观看 | 亚洲专区免费| 日韩视频在线一区二区| 久久九九精品99国产精品| 亚洲欧美国产va在线影院| 欧美freesex8一10精品| 久久精品女人的天堂av| 国产精品theporn| 亚洲缚视频在线观看| 红桃av永久久久| 欧美亚洲一区二区三区| 亚洲尤物视频网| 欧美日韩福利视频| 亚洲观看高清完整版在线观看| 一区二区亚洲欧洲国产日韩| 亚洲欧美另类国产| 亚洲自拍电影| 欧美三日本三级少妇三99 | 亚洲自拍三区| 欧美三级电影一区| 亚洲看片免费| 亚洲午夜电影在线观看| 欧美日韩性生活视频| 亚洲国产一区二区三区a毛片 | 欧美日韩国产va另类| 亚洲国产免费看| 亚洲片在线观看| 欧美大成色www永久网站婷| 欧美国产精品va在线观看| 韩国av一区二区三区四区| 欧美怡红院视频| 六月丁香综合| 亚洲人屁股眼子交8| 欧美久久婷婷综合色| 亚洲精品国产精品国自产观看| 99成人在线| 欧美日韩亚洲另类| 中文在线一区| 久久国产一区二区| 今天的高清视频免费播放成人 | 欧美区高清在线| 亚洲视屏在线播放| 久久av一区二区三区| 韩国三级电影一区二区| 久久久久一本一区二区青青蜜月| 裸体素人女欧美日韩| 亚洲片在线观看| 国产精品成人观看视频免费| 午夜国产精品视频| 毛片基地黄久久久久久天堂| 亚洲免费大片| 国产日韩欧美91| 久久亚洲国产精品一区二区| 亚洲区免费影片| 欧美一区二区私人影院日本| 韩国欧美国产1区| 欧美激情黄色片| 亚洲欧美国产不卡| 欧美成人精品福利| 亚洲欧美日本国产有色| 影音先锋久久资源网| 欧美久久一级| 久久精品成人一区二区三区蜜臀 | 亚洲剧情一区二区| 久久久精品欧美丰满| 亚洲精品影院在线观看| 国产农村妇女精品一二区| 欧美大尺度在线观看| 午夜久久久久久| 亚洲精品一二| 久久资源在线| 欧美一级专区免费大片| 亚洲区一区二| 好看的亚洲午夜视频在线| 欧美日韩在线播放一区| 久久男人资源视频| 亚洲欧美日韩区| 日韩视频免费大全中文字幕| 麻豆精品91| 久久成人18免费网站| 亚洲少妇中出一区| 亚洲国产一区二区三区青草影视| 国产精品日韩一区二区三区| 欧美二区视频| 久久亚洲美女| 久久精品九九| 久久精品成人一区二区三区| 亚洲特级片在线| 亚洲美女淫视频| 欧美激情性爽国产精品17p| 久久久久久久久久久成人| 亚洲一区在线免费| 一区二区黄色| 99国产精品久久久久老师| 91久久精品国产91久久性色| 国产一区二区三区久久精品| 国产模特精品视频久久久久| 欧美色网在线| 欧美视频一区二| 欧美日韩在线视频一区二区| 欧美日韩高清免费| 欧美啪啪一区| 欧美日韩一区三区| 国产精品国产a| 国产精品网站一区| 国产日韩精品一区二区三区| 国产女主播一区| 国产一区二区精品| 黄色小说综合网站| 在线观看一区欧美| 亚洲国产日韩欧美在线动漫| 1024成人网色www| 亚洲激情不卡| 在线一区二区三区做爰视频网站| 一区二区电影免费在线观看| 亚洲视频国产视频| 亚洲欧美区自拍先锋| 久久黄金**| 欧美刺激午夜性久久久久久久| 亚洲国产欧美国产综合一区| 亚洲黄色天堂| 一区二区日韩精品| 午夜综合激情| 欧美va亚洲va香蕉在线| 欧美日韩一区视频| 国产乱码精品一区二区三| 国模一区二区三区| 亚洲精品麻豆| 亚洲欧美在线aaa| 欧美aⅴ99久久黑人专区| 亚洲国产视频a| 亚洲专区欧美专区| 久久综合久久久久88| 欧美日本二区| 国产亚洲欧美一区二区| 亚洲欧洲日韩综合二区| 亚洲欧美久久久| 欧美a一区二区| 一本久久a久久免费精品不卡| 性欧美1819sex性高清| 免费成人在线观看视频| 国产精品国产三级欧美二区| 精品动漫一区| 亚洲一区二区三区四区五区午夜 | 久久久.com| 亚洲三级影片| 久久精品视频在线| 国产精品久久久久久久浪潮网站| 黑丝一区二区三区| 亚洲综合激情| 亚洲激情视频| 久久久精品一区二区三区| 欧美色综合网| 亚洲精品免费一二三区| 久久久久一区二区| 亚洲校园激情| 欧美久久久久中文字幕| 在线看一区二区| 久久精品国产第一区二区三区最新章节| 最新热久久免费视频| 久久国产精品亚洲va麻豆| 国产精品狼人久久影院观看方式|