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

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 2008-03-11 15:08 弱水一瓢 閱讀(186) 評論(0)  編輯 收藏 引用 所屬分類: MFC

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

文章分類

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲小视频在线| 欧美在线free| 欧美国产欧美亚洲国产日韩mv天天看完整| 午夜精品福利视频| 国产网站欧美日韩免费精品在线观看 | 亚洲国产精品成人精品 | 最新成人在线| 欧美精品一区二区三区在线播放| 99国产精品国产精品久久| 亚洲精品日韩综合观看成人91| 欧美精品一区二区三区在线播放| 中文在线资源观看视频网站免费不卡| 亚洲精品社区| 国产免费一区二区三区香蕉精| 久久久国产成人精品| 免费不卡在线观看| 亚洲一区二区av电影| 欧美一级在线播放| 91久久久亚洲精品| 99精品欧美一区二区三区| 国产精品一卡二| 欧美国产精品一区| 欧美视频在线观看一区| 先锋影音网一区二区| 久久久99精品免费观看不卡| 亚洲国产成人久久综合一区| 日韩视频一区二区在线观看| 国产日韩一区欧美| 亚洲国产精品一区二区www在线| 欧美亚州在线观看| 欧美jizzhd精品欧美喷水 | 欧美一区二区三区四区在线观看| 在线观看亚洲视频| 一本色道久久88精品综合| 狠狠久久亚洲欧美专区| 亚洲美女精品成人在线视频| 国内在线观看一区二区三区| 亚洲精品视频在线| 依依成人综合视频| 在线中文字幕日韩| 亚洲精品免费看| 欧美一区二区在线免费播放| 日韩午夜av| 麻豆久久久9性大片| 欧美影院久久久| 欧美人与性动交a欧美精品| 久久久久国产精品午夜一区| 欧美日韩一区二区三区| 欧美成人精品一区二区三区| 国产日韩一区二区三区在线播放 | 在线亚洲免费| 久久综合国产精品台湾中文娱乐网| 亚洲愉拍自拍另类高清精品| 美日韩精品视频| 蜜桃久久av| 国产中文一区| 欧美亚洲三区| 久久国产精彩视频| 国产精品美女在线| 在线亚洲一区观看| 亚洲一区二区免费视频| 欧美精品少妇一区二区三区| 亚洲丁香婷深爱综合| 亚洲高清视频在线观看| 久久一区二区视频| 欧美二区乱c少妇| 在线欧美亚洲| 久久综合九色综合欧美就去吻| 久久一区亚洲| 影音先锋在线一区| 免费一区视频| 亚洲国产成人久久| 日韩视频专区| 国产精品sss| 亚洲夜间福利| 久久国产免费| 狠狠爱综合网| 免费人成精品欧美精品| 91久久国产综合久久| 日韩写真在线| 欧美深夜影院| 午夜精品一区二区三区电影天堂| 午夜老司机精品| 国产综合精品| 欧美bbbxxxxx| 一本久久综合亚洲鲁鲁五月天| 亚洲免费一在线| 国产深夜精品| 免费观看日韩av| 99精品黄色片免费大全| 亚洲制服av| 国产日韩综合一区二区性色av| 久久精品国产久精国产一老狼| 欧美成人首页| 亚洲一本视频| 好看的亚洲午夜视频在线| 免费视频一区| 亚洲午夜激情| 欧美成年人视频网站欧美| 99热在这里有精品免费| 国产视频精品网| 欧美大片专区| 午夜精品福利在线观看| 欧美激情2020午夜免费观看| 亚洲线精品一区二区三区八戒| 国产日韩精品在线| 欧美老女人xx| 久久国产精彩视频| 日韩视频在线你懂得| 久久精品欧洲| 在线亚洲精品福利网址导航| 狠狠色狠狠色综合日日tαg| 欧美精品成人一区二区在线观看| 午夜伦理片一区| 亚洲九九爱视频| 免费久久99精品国产自在现线| 亚洲网友自拍| 亚洲三级电影全部在线观看高清| 国产精品久久夜| 欧美激情国产日韩精品一区18| 亚洲欧美在线免费观看| 亚洲精品欧洲精品| 欧美a级片网站| 久久久www成人免费精品| 亚洲视频一区二区免费在线观看| 在线日本成人| 国产亚洲网站| 国产精品久久久久一区| 欧美+日本+国产+在线a∨观看| 欧美一区二区精品| 在线亚洲欧美视频| 夜夜嗨av色综合久久久综合网 | 99国产精品私拍| 在线日韩中文字幕| 国产自产精品| 国产午夜精品全部视频在线播放| 欧美天堂在线观看| 美女免费视频一区| 久久日韩精品| 久久久久在线| 久久婷婷人人澡人人喊人人爽| 欧美亚洲免费电影| 亚洲欧美中文字幕| 午夜亚洲福利在线老司机| 在线亚洲成人| 亚洲午夜久久久久久尤物| 日韩天天综合| 一区二区久久久久| 欧美久久成人| 欧美日韩在线观看一区二区| 欧美日韩一区在线观看视频| 欧美日韩人人澡狠狠躁视频| 欧美日韩国产系列| 欧美日韩一级视频| 国产精品嫩草影院av蜜臀| 国产欧美日韩不卡| 狠狠入ady亚洲精品| 亚洲黄色小视频| 夜夜爽99久久国产综合精品女不卡| 日韩一二在线观看| 亚洲一区久久久| 欧美在线视频观看免费网站| 久久久久久综合网天天| 暖暖成人免费视频| 日韩视频免费在线| 先锋资源久久| 免费成人黄色| 国产精品久久久久久久久 | 久久精品国产77777蜜臀| 久久精品亚洲乱码伦伦中文| 久久最新视频| 欧美日韩国产综合新一区| 国产精品亚洲人在线观看| 黑人极品videos精品欧美裸| 亚洲国产日韩欧美在线99| 9色精品在线| 久久久久久久久久久一区 | 久久青青草原一区二区| 蜜桃av久久久亚洲精品| 日韩视频一区二区在线观看 | 欧美国产日本韩| 欧美午夜精品伦理| 在线欧美一区| 亚洲欧美影院| 欧美国产精品人人做人人爱| 在线一区观看| 裸体丰满少妇做受久久99精品| 欧美色图麻豆| 136国产福利精品导航网址| 亚洲网站视频福利| 狂野欧美激情性xxxx欧美| 99日韩精品| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩免费观看中文| 在线看国产一区| 欧美一区二区视频免费观看| 亚洲欧洲日韩综合二区| 久久不射网站| 国产精品―色哟哟| 99精品视频免费观看|