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

隨筆 - 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>
            玖玖玖国产精品| 欧美在线视频全部完| 亚洲视频欧洲视频| 亚洲午夜国产成人av电影男同| 99这里只有久久精品视频| 99精品国产高清一区二区| 亚洲精品免费在线观看| 欧美激情a∨在线视频播放| 亚洲国产va精品久久久不卡综合| 欧美11—12娇小xxxx| 亚洲国产日韩欧美在线99| 亚洲精品综合精品自拍| 亚洲欧美日韩精品在线| 免费成人美女女| 国产精品日日摸夜夜摸av| 在线看片一区| 亚洲先锋成人| 久久一区亚洲| 99热精品在线观看| 久久久久久欧美| 国产精品av一区二区| 亚洲福利视频专区| 先锋影音网一区二区| 亚洲国产精品久久久久| 亚洲免费在线| 欧美大片91| 国产一区三区三区| 亚洲网站啪啪| 欧美福利影院| 久久精品99国产精品| 欧美日韩在线观看一区二区三区| 国语自产精品视频在线看抢先版结局 | 亚洲福利视频二区| av成人天堂| 美女黄毛**国产精品啪啪| 国产精品美女久久久久久久| 99国产精品99久久久久久粉嫩 | 亚洲在线中文字幕| 免费久久精品视频| 午夜日韩电影| 国产精品永久免费观看| 一本色道久久综合亚洲精品小说| 久久综合中文| 性欧美videos另类喷潮| 国产精品婷婷午夜在线观看| 一本色道久久88精品综合| 欧美国产1区2区| 欧美在线中文字幕| 国产婷婷色一区二区三区四区| 亚洲午夜羞羞片| 亚洲精品一区二区三区在线观看| 美女主播视频一区| 亚洲福利视频专区| 欧美高清在线| 欧美韩日精品| 亚洲精品一二| 亚洲精品视频在线观看网站| 欧美成人情趣视频| 亚洲欧洲一区二区在线观看 | 亚洲欧美亚洲| 亚洲影院色无极综合| 国产精品久久久久久久一区探花| 在线一区二区三区四区五区| 日韩视频免费在线观看| 欧美日韩国产片| 亚洲天堂av在线免费观看| av成人黄色| 国产精品人成在线观看免费| 欧美一区二区三区视频免费| 午夜在线精品| 伊人精品成人久久综合软件| 欧美91大片| 欧美国产三区| 亚洲综合日韩在线| 欧美在线观看日本一区| 亚洲电影免费| 99这里只有精品| 国产美女精品视频免费观看| 米奇777超碰欧美日韩亚洲| 欧美成人一区二免费视频软件| 日韩一级黄色片| 亚洲一区国产| 亚洲成色精品| 99视频有精品| 激情91久久| 亚洲三级色网| 国产日韩欧美中文| 免费人成网站在线观看欧美高清| 欧美高清视频免费观看| 亚洲欧美日韩区| 久久人人97超碰国产公开结果| 亚洲巨乳在线| 午夜视频在线观看一区| 亚洲人成人一区二区在线观看| 亚洲毛片在线观看.| 久久国产欧美| 欧美高潮视频| 国产精品theporn| 男男成人高潮片免费网站| 欧美日韩国产在线播放| 久久三级视频| 国产精品久久久久一区二区| 免费在线成人av| 国产精品入口麻豆原神| 亚洲国产日本| 国产伊人精品| 一本久道久久久| 亚洲黄色视屏| 欧美韩日一区二区| 国产精品私拍pans大尺度在线| 亚洲高清久久| 韩国女主播一区| 亚洲一区二区三区影院| 亚洲精品资源| 狼人社综合社区| 久久久久高清| 国产精品亚洲аv天堂网 | 午夜一区不卡| 亚洲一区二区三区视频| 欧美freesex8一10精品| 久久中文久久字幕| 国产伦精品一区二区三区高清版 | 久久久久久国产精品一区| 午夜精品久久久久久| 欧美另类videos死尸| 欧美国产日韩一区二区在线观看| 国产私拍一区| 香蕉久久一区二区不卡无毒影院| 亚洲一区尤物| 欧美特黄a级高清免费大片a级| 亚洲国产精品成人| 亚洲激情影视| 欧美精品粉嫩高潮一区二区| 亚洲国产精品电影| 亚洲国产精品电影| 久久裸体视频| 美玉足脚交一区二区三区图片| 国产一区二区三区在线观看网站| 亚洲在线播放| 久久精品视频在线看| 国产亚洲欧美日韩日本| 亚洲自拍偷拍福利| 久久国产精品亚洲va麻豆| 国产欧美日韩高清| 亚洲欧美日本国产有色| 久久狠狠婷婷| 在线观看视频免费一区二区三区 | 久久夜色精品国产欧美乱极品| 国产区精品在线观看| 亚洲精品一区二区三区不| 亚洲五月婷婷| 国产精品免费福利| 欧美一区亚洲二区| 欧美超级免费视 在线| 美日韩免费视频| 日韩一级大片在线| 亚洲天堂第二页| 国产精品美女999| 欧美在线不卡视频| 亚洲电影第三页| 亚洲直播在线一区| 国产一区二区黄色| 久久资源在线| 99成人在线| 久久久久久穴| 亚洲三级观看| 国产精品女人久久久久久| 久久三级视频| 在线视频欧美精品| 你懂的国产精品永久在线| 日韩视频精品在线观看| 国产精品主播| 免费不卡欧美自拍视频| 亚洲午夜一区二区三区| 免费av成人在线| 亚洲欧美日韩在线高清直播| 一区二区三区在线免费视频| 欧美日韩99| 久久精品免费看| 在线视频日韩精品| 欧美激情第1页| 欧美在线看片a免费观看| 亚洲精品久久久一区二区三区| 国产精品日韩久久久| 欧美高清不卡在线| 欧美一级片一区| 中文一区二区| 亚洲国产成人精品久久| 久久精品国产亚洲aⅴ| 亚洲视频一二| 亚洲激情校园春色| 狠狠色综合网| 国产啪精品视频| 欧美午夜宅男影院在线观看| 免费欧美视频| 久久高清国产| 亚洲欧美日韩成人| 亚洲午夜性刺激影院| 日韩一级欧洲| 亚洲激情电影在线|