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

MFC消息映射機制的剖析

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 2010-06-21 22:43 lhking 閱讀(283) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

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

統計

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99精品视频免费观看| 国产一区999| 国产一区二区三区电影在线观看| 国产午夜亚洲精品不卡| 亚洲另类视频| 亚洲精品乱码久久久久久按摩观| 99成人在线| 亚洲精品美女免费| 欧美精品一级| 日韩亚洲精品视频| 一区二区三区久久| 国产精品视频一区二区三区| 亚欧成人精品| 久久国产精品久久w女人spa| 亚洲第一视频| 最新国产乱人伦偷精品免费网站| 欧美日韩视频在线一区二区观看视频| 亚洲一区二区黄色| 欧美主播一区二区三区| 亚洲国产精品成人精品| 亚洲人成在线观看| 国产视频亚洲精品| 欧美激情一区二区三区在线| 欧美日韩一区高清| 美女网站久久| 欧美日韩在线播放| 久久欧美中文字幕| 欧美伦理在线观看| 久久九九99视频| 欧美精品久久久久久| 久久精品一区二区三区中文字幕| 久久一区二区三区四区五区| 正在播放欧美一区| 欧美在线观看你懂的| 亚洲高清二区| 日韩一区二区精品视频| 国产精品有限公司| 免费一级欧美片在线播放| 久久久人成影片一区二区三区| 在线精品在线| 一本色道久久加勒比88综合| 国产日韩欧美夫妻视频在线观看| 老司机成人网| 欧美日韩精品一区二区三区| 欧美一区二区精美| 欧美一区二区三区婷婷月色| 国产精品三区www17con| 久久亚洲国产精品日日av夜夜| 欧美久久久久久久| 欧美一区二区三区的| 久久国产精品久久久久久电车| 亚洲国语精品自产拍在线观看| 妖精成人www高清在线观看| 欧美紧缚bdsm在线视频| 久久久夜精品| 欧美日韩午夜| 美女图片一区二区| 国产精品入口| 亚洲人妖在线| 亚洲电影免费观看高清完整版| 夜夜嗨av一区二区三区中文字幕 | 精品99视频| 亚洲精品日韩精品| 黄色av成人| 最新国产乱人伦偷精品免费网站| 国产一区二区三区免费观看| 日韩视频第一页| 亚洲成色www久久网站| 亚洲天堂网在线观看| 亚洲三级毛片| 久久成人免费电影| 欧美一区免费| 欧美日韩精品免费观看视频| 免费高清在线一区| 国产欧美日本| 亚洲视频精选| 亚洲尤物在线| 欧美激情第五页| 奶水喷射视频一区| 一区二区三区在线视频播放| 亚洲欧美清纯在线制服| 亚洲综合欧美| 国产精品黄色在线观看| 亚洲欧洲综合| 欧美伊人精品成人久久综合97| 亚洲性av在线| 欧美视频手机在线| 猛男gaygay欧美视频| 亚洲国产精品久久久久| 狼人社综合社区| 免费观看久久久4p| 亚洲第一区在线| 老司机免费视频一区二区三区 | 欧美黄色片免费观看| 久久亚洲电影| 国产一区二区三区免费观看| 欧美在线播放一区| 蜜臀91精品一区二区三区| 精品成人在线| 免费观看成人| 亚洲美女av黄| 亚洲一区一卡| 国产精品婷婷午夜在线观看| 午夜精品久久久久久久男人的天堂 | 欧美黄色视屏| 亚洲国产日韩欧美一区二区三区| 美女诱惑一区| 亚洲人成网站在线播| 亚洲乱码国产乱码精品精天堂 | 久久av一区二区三区亚洲| 国产啪精品视频| 久久国产66| 亚洲国产精品久久91精品| 一区二区三区福利| 国产欧美一区二区三区另类精品| 欧美一级视频精品观看| 欧美成人精品1314www| 亚洲免费av片| 国产午夜精品福利| 欧美成人免费在线视频| 这里只有精品视频在线| 久久疯狂做爰流白浆xx| 国内偷自视频区视频综合| 欧美精品乱人伦久久久久久| 小处雏高清一区二区三区| 欧美69wwwcom| 亚洲欧美成人在线| 在线观看亚洲精品视频| 欧美亚洲不卡| 久久久久国产成人精品亚洲午夜| 最近中文字幕mv在线一区二区三区四区| 亚洲一区二区三区在线视频| 一区二区在线不卡| 国产精品久久二区二区| 久久伊人一区二区| 亚洲一区二区三区在线观看视频| 男同欧美伦乱| 性欧美在线看片a免费观看| 亚洲娇小video精品| 国产精品伊人日日| 欧美片网站免费| 午夜精品久久久久久99热软件| 欧美激情国产高清| 一本色道久久综合精品竹菊| 国产日韩av高清| 欧美日韩国产一区精品一区| 久久久欧美一区二区| 中文国产亚洲喷潮| 亚洲国产日韩欧美在线动漫| 久久午夜色播影院免费高清| 亚洲欧美日本伦理| 中国成人黄色视屏| 亚洲毛片播放| 亚洲国产欧美一区二区三区久久| 国产一区视频在线看| 国产精品专区第二| 欧美另类极品videosbest最新版本 | 亚洲国产导航| 国内精品视频在线播放| 国产精品亚洲精品| 欧美日韩综合在线| 欧美日韩第一区| 欧美激情bt| 欧美国产日韩亚洲一区| 美女网站在线免费欧美精品| 久久久国产成人精品| 欧美一区二区视频在线观看2020| 欧美肥婆在线| 久久久久青草大香线综合精品| 亚洲视频免费观看| 夜夜嗨av一区二区三区| 午夜欧美精品| 欧美一级一区| 久久久久se| 久久露脸国产精品| 猛男gaygay欧美视频| 久久一区二区三区av| 麻豆国产精品va在线观看不卡| 久久嫩草精品久久久精品| 麻豆精品视频在线| 亚洲成色777777在线观看影院| 亚洲电影免费观看高清| 亚洲免费大片| 亚洲在线播放| 亚洲综合色视频| 免费国产自线拍一欧美视频| 欧美区亚洲区| 国产麻豆精品视频| 精品成人一区二区三区四区| 亚洲经典三级| 亚洲欧美日韩一区| 久久久久久久久久久久久女国产乱 | 亚洲尤物在线视频观看| 欧美一区二区三区四区在线观看地址 | 欧美一区1区三区3区公司| 久久视频这里只有精品| 欧美激情亚洲精品| 欧美视频在线观看免费| 国产色爱av资源综合区| 亚洲黄色免费电影|