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

隨筆 - 47, 文章 - 10, 評論 - 8, 引用 - 0
數據加載中……

孫鑫VC++講座筆記-(4)MFC消息映射機制的剖析

1,消息響應函數:(例:在CDrawView類響應鼠標左鍵按下消息)
?1)在頭文件(DrawView.h)中聲明消息響應函數原型。
1//{{AFX_MSG(CDrawView)???//注釋宏
2afx_msg?void?OnLButtonDown(UINT?nFlags,?CPoint?point);
3//}}AFX_MSG???//注釋宏
說明:
在注釋宏之間的聲明在VC中灰色顯示。afx_msg宏表示聲明的是一個消息響應函數。
?2)在源文件(DrawView.cpp)中進行消息映射。
1BEGIN_MESSAGE_MAP(CDrawView,?CView)
2?//{{AFX_MSG_MAP(CDrawView)
3?ON_WM_LBUTTONDOWN()
4?//}}AFX_MSG_MAP
5?//?Standard?printing?commands
6?ON_COMMAND(ID_FILE_PRINT,?CView::OnFilePrint)
7?ON_COMMAND(ID_FILE_PRINT_DIRECT,?CView::OnFilePrint)
8?ON_COMMAND(ID_FILE_PRINT_PREVIEW,?CView::OnFilePrintPreview)
9END_MESSAGE_MAP()
說明:
在宏BEGIN_MESSAGE_MAP()與END_MESSAGE_MAP()之間進行消息映射。
宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN與它的響應函數OnLButtonDown()相關聯。這樣一旦有消息的產生,就會自動調用相關聯的消息響應函數去處理。
宏ON_WM_LBUTTONDOWN()定義如下:
1#define?ON_WM_LBUTTONDOWN()?\
2?{?WM_LBUTTONDOWN,?0,?0,?0,?AfxSig_vwp,?\
3??(AFX_PMSG)(AFX_PMSGW)(void?(AFX_MSG_CALL?CWnd::*)(UINT,?CPoint))&OnLButtonDown?}
,
4?3)源文件中進行消息響應函數處理。(DrawView.cpp中自動生成OnLButtonDown函數輪廓,如下)
5void?CDrawView::OnLButtonDown(UINT?nFlags,?CPoint?point)?
6{
7?//?TODO:?Add?your?message?handler?code?here?and/or?call?default
8?CView::OnLButtonDown(nFlags,?point);
9}
說明:
可見當增加一個消息響應處理,在以上三處進行了修改。可在消息響應函數里添加消息處理代碼完成對消息的響應、處理。

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()之間尋找),最終找到對應的消息處理函數。當然,如果子類中沒有對消息進行處理,則消息交由基類處理。
說明:

1virtual?LRESULT?WindowProc(UINT?message,?WPARAM?wParam,?LPARAM?lParam);
2virtual?BOOL?OnWndMsg(UINT?message,?WPARAM?wParam,?LPARAM?lParam,?LRESULT*?pResult);

二,有關繪圖

1,使用SDK獲取DC句柄:

1HDC?hdc;
2hdc=::GetDc(m_hWnd);//獲取DC句柄
3MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
4LineTo(hdc,point.x,point.y);
5::ReleaseDC(m_hWnd,hdc);//釋放DC

2,利用CDC類指針和CWin類成員函數獲取DC。
1CDC?*pDC=GetDC();
2pDC->MoveTo(m_ptOrigin);
3pDC->LineTo(point);
4ReleaseDC(pDC);
3,利用CClientDC對象。(CClientDC類從CDC類派生來的)
1CClientDC?dc(this);
2dc.MoveTo(m_ptOrigin);
3dc.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類派生來的)
1CWindowDC?dc(this);//
2dc.MoveTo(m_ptOrigin);
3dc.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,利用畫筆改變線條顏色和類型:

1CPen?pen(PS_DOT,1,RGB(0,255,0));//構造畫筆對象
2CClientDC?dc(this);CPen?*pOldPen=dc.SelectObject(&pen);//將畫筆選入DC
3dc.MoveTo(m_ptOrigin);
4dc.LineTo(point);
5dc.SelectObject(pOldPen);//恢復先前的畫筆

7,使用畫刷(通常利用畫刷去填充矩形區域):
?1//使用單色畫刷
?2CBrush?brush(RGB(255,0,0));//構造畫刷對象
?3CClientDC?dc(this);
?4dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的畫刷去填充矩形區域
?5
?6//使用位圖畫刷
?7CBitmap?bitmap;//構造位圖對象(使用前需要初試化)
?8bitmap.LoadBitmap(IDB_BITMAP1);//初試化位圖對象
?9CBrush?brush(&bitmap);//構造位圖畫刷
10CClientDC?dc(this);
11dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的位圖畫刷去填充矩形區域
12
13//使用透明畫刷
14CBrush?*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//獲取透明畫刷對象指針
15CClientDC?dc(this);
16CBrush?*pOldBrush=dc.SelectObject(pBrush);//將透明畫刷選入DC
17dc.Rectangle(CRect(m_ptOrigin,point));
18dc.SelectObject(pOldBrush);//釋放透明畫刷
19
20

說明:
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 2006-04-04 11:08 編程之道 閱讀(194) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久婷婷一区| 久久精品首页| 国产日韩精品一区二区三区在线| 欧美精品成人91久久久久久久| 久久香蕉国产线看观看av| 欧美一级久久久久久久大片| 久久国产福利| 久久夜色撩人精品| 欧美激情一区二区三区全黄| 欧美日韩999| 国产精品视频1区| 国模吧视频一区| 亚洲国产精品成人综合| 一卡二卡3卡四卡高清精品视频| 亚洲性线免费观看视频成熟| 久久精品综合网| 亚洲国产精品免费| 亚洲片国产一区一级在线观看| 在线视频欧美日韩| 欧美一区二区视频观看视频| 欧美成人精品一区| 国产精品综合网站| 亚洲日本理论电影| 欧美一级片在线播放| 欧美成人精品福利| 午夜精品久久久久久久99樱桃| 久久综合九色综合欧美狠狠| 欧美午夜在线| 一区二区国产精品| 亚洲综合色噜噜狠狠| 久久噜噜噜精品国产亚洲综合| 欧美激情中文字幕一区二区| 亚洲免费在线观看| 欧美日韩国产精品一区| 国内精品久久久| 亚洲一区二区伦理| 欧美激情视频免费观看| 欧美一区=区| 国产精品久久久久久亚洲毛片| 91久久久久久| 免费中文字幕日韩欧美| 先锋a资源在线看亚洲| 欧美日韩直播| 日韩午夜激情av| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲欧美精品在线| 欧美精品一区二区三区在线看午夜| 国产欧美日韩一区| 亚洲视频在线观看网站| 欧美韩日视频| 六月婷婷久久| 亚洲电影免费观看高清完整版在线观看 | 欧美激情综合色| 亚洲电影下载| 麻豆精品一区二区av白丝在线| 亚洲午夜91| 国产精品a级| 亚洲一区亚洲| 亚洲网站啪啪| 国产精品揄拍一区二区| 欧美一区二区三区在线观看视频| 一本色道久久加勒比88综合| 欧美另类综合| 亚洲午夜精品久久| 一区二区三区四区精品| 欧美三区美女| 亚洲午夜视频在线观看| 一区二区三区免费在线观看| 国产精品爱久久久久久久| 亚洲在线电影| 欧美一级久久久久久久大片| 国内不卡一区二区三区| 免费观看久久久4p| 欧美成年人网站| 一本色道久久88综合亚洲精品ⅰ| 日韩午夜av| 国产欧美在线观看| 久久精品在线播放| 精品99一区二区三区| 久久亚洲综合色| 久热精品在线视频| 一本久久a久久免费精品不卡| 亚洲精品乱码久久久久久日本蜜臀| 欧美激情第三页| 亚洲欧美日韩在线一区| 欧美在线一级视频| 亚洲片在线资源| 一本色道久久99精品综合| 国产农村妇女精品一区二区| 美女久久一区| 欧美日韩第一页| 欧美在线观看网站| 免费欧美电影| 亚洲欧美日韩电影| 久久久午夜电影| 在线视频精品| 欧美一区二区三区在线免费观看| 最新日韩在线| 午夜精品999| 亚洲精品乱码久久久久| 亚洲伊人久久综合| 91久久久久| 久久激情五月激情| 亚洲午夜精品久久| 欧美a级片网| 久久精品人人做人人爽| 欧美精品成人91久久久久久久| 久久激情中文| 国产精品www网站| 欧美成人网在线| 国产精品网站在线观看| 亚洲国产精品一区二区www在线| 国产精品一区二区欧美| 亚洲区第一页| 91久久香蕉国产日韩欧美9色| 午夜精品久久久久久久久久久久| 日韩写真在线| 美国成人直播| 浪潮色综合久久天堂| 国产精品久久毛片a| 亚洲激情视频网| 亚洲丁香婷深爱综合| 午夜精品久久久久久久久久久久久 | 欧美呦呦网站| 欧美视频一区二区在线观看| 亚洲大胆美女视频| 一色屋精品视频在线观看网站| 亚洲一区精品电影| 中日韩午夜理伦电影免费| 免费成人黄色片| 欧美99在线视频观看| 激情亚洲一区二区三区四区| 销魂美女一区二区三区视频在线| 亚洲综合丁香| 国产精品av一区二区| 亚洲天天影视| 欧美一区二区高清| 一区二区三区免费在线观看| 日韩一级片网址| 亚洲精品婷婷| 欧美激情视频一区二区三区在线播放| 鲁大师成人一区二区三区| 国产综合视频在线观看| 欧美在线首页| 久久综合国产精品台湾中文娱乐网 | 亚洲欧美日韩视频一区| 亚洲欧美在线x视频| 国产精品美女www爽爽爽视频| 夜夜嗨av一区二区三区| 亚洲深爱激情| 国产精品网站在线| 欧美一区激情| 欧美a级片网| 亚洲人www| 欧美日韩mp4| 亚洲视屏一区| 久久久99久久精品女同性| 一区二区亚洲欧洲国产日韩| 久久婷婷丁香| 最新中文字幕一区二区三区| 在线亚洲成人| 国产欧美一区在线| 嫩草成人www欧美| 9人人澡人人爽人人精品| 午夜精品久久久久久久99热浪潮 | 国产毛片一区| 久久性色av| 日韩亚洲精品电影| 久久精品一二三区| 亚洲日本在线观看| 国产精品毛片a∨一区二区三区|国| 久久精品2019中文字幕| 亚洲日韩欧美视频| 久久精品毛片| 一区二区三区视频在线播放| 国产欧美一区二区精品婷婷| 米奇777在线欧美播放| 亚洲少妇一区| 欧美国产三级| 欧美呦呦网站| 一区二区三区精品视频| 狠狠干成人综合网| 欧美私人啪啪vps| 久久亚洲图片| 亚洲一级影院| 亚洲人成艺术| 欧美91视频| 久久精品一区二区三区不卡牛牛 | 欧美激情 亚洲a∨综合| 小黄鸭精品aⅴ导航网站入口 | 亚洲欧美国产精品专区久久| 欧美激情视频一区二区三区不卡| 午夜在线不卡| 一区二区三区视频在线观看| 亚洲国产91| 加勒比av一区二区| 国产日韩精品视频一区| 欧美日韩中文字幕在线| 欧美福利一区| 亚洲欧洲中文日韩久久av乱码|