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

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)中進行消息映射。
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與它的響應(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)源文件中進行消息響應(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)處理,在以上三處進行了修改。可在消息響應(yīng)函數(shù)里添加消息處理代碼完成對消息的響應(yīng)、處理。

2,消息響應(yīng)的方式:
1)在基類中針對每種消息做一個虛函數(shù),當(dāng)子類對消息響應(yīng)時候,只要在子類中重寫這個虛函數(shù)即可。缺點:MFC類派生層次很多,如果在基類對每個消息進行虛函數(shù)處理,那么從基類派生的每個子類都將背負一個龐大的虛表,這樣浪費內(nèi)存,故MFC沒有采取這中方式而采取消息映射方式。
2)消息映射方式:MFC在后臺維護了一個句柄和C++對象指針對照表,當(dāng)收到一個消息后,通過消息結(jié)構(gòu)里資源句柄(查對照表)就可找到與它對應(yīng)的一個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ā)的消息有沒有響應(yīng)函數(shù),具體方式是到相關(guān)的頭文件和源文件中尋找消息響應(yīng)函數(shù)聲明(從注釋宏//{{AFX_MSG(CDrawView)...//}}AFX_MSG之間尋找),消息映射(從宏BEGIN_MESSAGE_MAP(...)....END_MESSAGE_MAP()之間尋找),最終找到對應(yīng)的消息處理函數(shù)。當(dāng)然,如果子類中沒有對消息進行處理,則消息交由基類處理。
說明:
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 2008-03-11 15:08 弱水一瓢 閱讀(186) 評論(0)  編輯 收藏 引用 所屬分類: MFC

<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(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>
            亚洲色图综合久久| 亚洲黄色影院| 国产午夜亚洲精品羞羞网站| 狠狠色2019综合网| 一区二区三区回区在观看免费视频| 亚洲男人的天堂在线aⅴ视频| 久久综合色一综合色88| 亚洲看片一区| 久久久久国色av免费看影院| 欧美日韩国产精品一卡| 国产综合精品一区| 亚洲综合精品| 亚洲欧洲一区二区三区在线观看| 亚洲欧美激情一区| av成人激情| 欧美极品aⅴ影院| 在线观看欧美| 久久裸体艺术| 午夜精品福利电影| 国产精品久久久久久久7电影 | 91久久综合亚洲鲁鲁五月天| 欧美大片免费看| 亚洲国产老妈| 夜夜爽夜夜爽精品视频| 国产日韩欧美在线播放| 欧美.www| 免费观看久久久4p| 极品少妇一区二区三区| 欧美在线一二三区| 这里只有精品电影| 国产精品成人一区二区艾草| 久久嫩草精品久久久精品| 欧美高清在线视频| 夜夜爽99久久国产综合精品女不卡| 欧美freesex8一10精品| 国产精品99一区二区| 亚洲一区二区三区免费在线观看| 亚洲精品一区二区在线| 国产香蕉久久精品综合网| 亚洲福利精品| 欧美日韩成人综合| 玖玖精品视频| 国产精品一区二区三区久久久| 欧美一区二区视频在线观看| 性久久久久久久久| 狠狠色综合网站久久久久久久| 亚洲精品在线观看免费| 永久免费毛片在线播放不卡| 亚洲一区二区网站| 黄色一区二区三区四区| 一本一本大道香蕉久在线精品| 国产精品久久久亚洲一区| 久久精品国产69国产精品亚洲| 欧美在线影院在线视频| 亚洲国产小视频在线观看| 亚洲一区二区在线视频| 妖精视频成人观看www| 久久精品五月婷婷| 日韩亚洲欧美高清| 亚洲免费视频成人| 亚洲第一精品夜夜躁人人爽| 亚洲精品久久久久久下一站| 国产精品普通话对白| 久久亚洲综合网| 欧美日韩一区二区三区免费| 久久久999| 欧美日韩另类字幕中文| 亚洲激情视频在线| 最新国产乱人伦偷精品免费网站| 亚洲少妇中出一区| 亚洲嫩草精品久久| 国产精品视频一二三| 国产精品99久久久久久宅男 | 国产精品高潮久久| 一本久久综合| 亚洲欧美国产精品va在线观看 | 久久最新视频| 亚洲欧美日本视频在线观看| 国产精品videosex极品| 这里只有精品视频在线| 欧美一级久久久| 欧美日韩三级一区二区| 日韩午夜免费视频| 91久久久久久久久| 欧美激情视频一区二区三区在线播放 | 久久精品国产精品亚洲精品| 国产精品一区久久久久| 久久激情综合| 欧美制服丝袜第一页| 国产一区二区三区高清| 中文网丁香综合网| 欧美伊人久久大香线蕉综合69| 国产亚洲女人久久久久毛片| 久久五月天婷婷| 久久青草久久| 亚洲精品欧美专区| 免费成人av在线看| 久热re这里精品视频在线6| 在线视频国产日韩| 欧美日韩一区在线观看| 欧美一区二区在线观看| 午夜久久久久久| 欧美视频日韩视频在线观看| 亚洲国产欧美国产综合一区| 在线精品福利| 欧美色播在线播放| 久久午夜视频| 一区二区三区日韩欧美精品| 久久综合伊人77777蜜臀| 亚洲精品乱码久久久久久日本蜜臀 | 久久国产精品高清| 亚洲欧洲日本一区二区三区| 国产精品成人一区二区| 免费亚洲一区| 午夜精品视频| 99精品免费网| 亚洲高清二区| 久久理论片午夜琪琪电影网| 亚洲午夜羞羞片| 亚洲国产日韩欧美| 国产日本欧美在线观看| 午夜精品免费在线| 亚洲三级观看| 女同性一区二区三区人了人一| 亚洲一区在线免费观看| 亚洲精品在线观看免费| 欧美日韩三级一区二区| 久久综合影音| 欧美在线视频一区二区| 一本色道久久综合亚洲精品高清| 欧美激情一区二区三区四区| 亚洲最新色图| 亚洲国产人成综合网站| 黄色综合网站| 国内外成人免费激情在线视频 | 性色av一区二区三区在线观看| 亚洲东热激情| 欧美成人高清| 欧美国产综合视频| 另类图片综合电影| 久久久久久自在自线| 香港久久久电影| 欧美一区二区成人6969| 亚洲欧美在线看| 午夜精品福利一区二区三区av| 99精品国产99久久久久久福利| 亚洲黄色精品| 夜夜嗨av一区二区三区| 99精品欧美一区二区三区| 亚洲啪啪91| 在线亚洲一区| 亚洲一区二区在线免费观看视频| 亚洲一区二区免费看| 亚洲自拍都市欧美小说| 亚洲制服丝袜在线| 欧美一级大片在线免费观看| 欧美一区二区三区啪啪| 久久久无码精品亚洲日韩按摩| 久久免费国产| 女主播福利一区| 亚洲精品色图| 中国成人黄色视屏| 性做久久久久久| 久久久91精品国产| 麻豆久久久9性大片| 欧美精品日韩精品| 欧美午夜一区二区福利视频| 国产精品亚洲第一区在线暖暖韩国| 国产精品亚洲综合| 狠狠色伊人亚洲综合成人| 91久久精品网| 午夜精品久久久久| 老司机精品导航| 亚洲人成精品久久久久| 亚洲免费影视| 裸体女人亚洲精品一区| 欧美日韩18| 国模私拍视频一区| 亚洲精品欧美日韩专区| 欧美一区不卡| 91久久精品国产91性色| 中文一区二区| 美女啪啪无遮挡免费久久网站| 欧美三级电影一区| 国内一区二区三区在线视频| 亚洲另类视频| 久久精品国产清自在天天线 | 久久国产一区二区三区| 欧美大色视频| 老巨人导航500精品| 日韩一级二级三级| 久久精品国产第一区二区三区最新章节 | 国产日韩精品在线观看| 亚洲啪啪91| 久久久久久久久久久成人| 亚洲美女在线看| 女人色偷偷aa久久天堂| 国产精品一区久久久久| 正在播放欧美视频| 欧美成人影音|