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

隨筆 - 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>
            亚洲欧洲一区二区在线播放| 欧美一区二区三区视频在线 | 9l国产精品久久久久麻豆| 麻豆av一区二区三区| 欧美在线视频观看| 久久免费偷拍视频| 欧美激情小视频| 亚洲美女精品成人在线视频| 黄色成人91| 欧美在线免费| 噜噜噜久久亚洲精品国产品小说| 老鸭窝亚洲一区二区三区| 久久视频国产精品免费视频在线| 欧美xx69| 国产精品入口福利| 在线国产亚洲欧美| 在线视频精品一区| 久久久www成人免费无遮挡大片| 久久人体大胆视频| 亚洲精品中文在线| 久久久国产精品一区二区三区| 欧美肥婆在线| 国产欧美综合在线| 日韩亚洲在线| 久久久久久亚洲综合影院红桃| 亚洲福利视频三区| 亚洲一区中文| 欧美激情片在线观看| 国产日韩欧美三区| 亚洲深夜av| 欧美国产综合视频| 性做久久久久久久免费看| 欧美人与禽猛交乱配视频| 国产亚洲毛片在线| 亚洲午夜精品一区二区三区他趣| 蜜臀99久久精品久久久久久软件| 一区二区三区色| 欧美韩国日本一区| 亚洲第一色在线| 久久久噜噜噜久久久| 亚洲视频电影在线| 欧美日韩免费区域视频在线观看| 亚洲大胆女人| 久久性色av| 香蕉久久精品日日躁夜夜躁| 欧美体内she精视频| 亚洲精品一区二区在线| 老司机67194精品线观看| 午夜精品一区二区三区在线| 国产精品大片| 亚洲尤物在线| 在线视频精品一| 欧美日韩一区二区在线播放| 日韩视频三区| 亚洲欧洲精品一区二区三区 | 一区二区三区欧美亚洲| 欧美激情乱人伦| 亚洲欧洲一区| 亚洲精品1234| 欧美国产欧美综合 | 国产啪精品视频| 久久国产精品久久w女人spa| 亚洲专区免费| 亚洲自拍偷拍福利| 亚洲欧美国产精品桃花| 国产精品美女久久久久久免费 | 久久精品av麻豆的观看方式 | 欧美日韩国产精品一卡| 亚洲美女免费精品视频在线观看| 亚洲国产一区二区三区a毛片| 欧美成人精品影院| 一区二区三区精密机械公司 | 免费欧美网站| 日韩性生活视频| 亚洲精品在线观| 国产精品国产一区二区| 欧美一级播放| 久久久久久国产精品一区| 尤物九九久久国产精品的分类| 欧美成黄导航| 欧美日韩免费高清| 欧美在线中文字幕| 久久精品中文字幕一区| 亚洲国产你懂的| 亚洲精品国产精品久久清纯直播| 欧美日韩国产精品一区| 久久av最新网址| 老司机亚洲精品| 亚洲图片欧美一区| 欧美在线二区| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品亚洲成人| 久久精品综合| 欧美激情第三页| 欧美一区免费| 欧美~级网站不卡| 亚洲欧美中日韩| 美女露胸一区二区三区| 亚洲在线一区| 免费毛片一区二区三区久久久| 亚洲欧美中文日韩在线| 久久一区视频| 性做久久久久久久免费看| 久久婷婷色综合| 性欧美1819sex性高清| 免费在线一区二区| 久久久久久久999| 欧美性感一类影片在线播放| 欧美成人dvd在线视频| 国产日韩精品视频一区二区三区| 亚洲激情影院| 亚洲国产精品v| 午夜精品久久久久久久久久久久| 亚洲精品激情| 久久久久久久成人| 久久精品日韩| 国产精品视区| 日韩视频―中文字幕| 亚洲国产成人精品视频| 美女视频网站黄色亚洲| 欧美一区免费视频| 亚洲午夜精品17c| 欧美精品黄色| 亚洲国产精品久久| 最新中文字幕亚洲| 久久亚洲图片| 久久中文字幕一区| 国内成+人亚洲| 午夜日本精品| 欧美一区二区三区日韩视频| 欧美先锋影音| 亚洲视频一区| 一区二区三区欧美视频| 欧美电影免费观看高清| 欧美第一黄网免费网站| 亚洲国产高潮在线观看| 久久久青草青青国产亚洲免观| 久久久久久久性| 国产综合在线视频| 久久精品视频va| 蜜臀99久久精品久久久久久软件| 狠狠色2019综合网| 久久一区激情| 亚洲精品国产欧美| 在线亚洲欧美视频| 国产精品久久久久免费a∨大胸| 亚洲乱码久久| 亚洲欧美日韩另类精品一区二区三区| 欧美日韩综合视频| 亚洲在线一区二区三区| 久久精品国产999大香线蕉| 国产欧美一区二区三区沐欲 | 欧美二区在线播放| 亚洲片在线资源| 欧美精品日本| 正在播放日韩| 久久久国产精彩视频美女艺术照福利| 国内精品久久久| 欧美高清视频在线播放| 一区二区三区色| 久久免费国产精品| 日韩午夜激情电影| 国产精品中文在线| 老色鬼精品视频在线观看播放| 日韩一区二区久久| 久久精品视频在线免费观看| 91久久国产综合久久91精品网站| 欧美剧在线观看| 欧美一级淫片aaaaaaa视频| 欧美黄色片免费观看| 亚洲伊人色欲综合网| 国产主播精品| 欧美天天视频| 老色鬼久久亚洲一区二区| 99日韩精品| 免费久久99精品国产自| 亚洲一区精品在线| 91久久精品国产91性色tv| 国产精品欧美日韩| 欧美 日韩 国产 一区| 亚洲欧美日韩综合国产aⅴ| 亚洲国产成人久久综合一区| 亚洲一区国产一区| 欧美日韩视频一区二区| 久久久久久夜| 亚洲制服欧美中文字幕中文字幕| 欧美激情成人在线视频| 久久高清免费观看| 中文国产一区| 亚洲一区日本| 欧美高清日韩| 久久国产成人| 亚洲性xxxx| 亚洲精品美女在线观看| 国产一区二区三区视频在线观看| 欧美理论电影在线播放| 久久婷婷色综合| 欧美一区在线直播| 亚洲欧美激情视频| 亚洲视频免费在线|