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

隨筆 - 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>
            一本色道久久综合狠狠躁的推荐| 亚洲精品欧美日韩专区| 国产一区二区三区不卡在线观看| 欧美va天堂在线| 国产精品二区二区三区| 久久精品亚洲精品国产欧美kt∨| 亚洲三级视频| 免费日韩av电影| 香蕉久久精品日日躁夜夜躁| 亚洲电影在线看| 国产一区二区观看| 午夜综合激情| 国产伦精品一区二区三区| 欧美激情1区2区3区| 麻豆成人精品| 欧美性天天影院| 亚洲欧美日韩久久精品| 亚洲精品国产精品国产自| 久久av二区| 欧美日韩一区视频| 亚洲欧美日韩久久精品| 欧美久久一级| 欧美激情第二页| 亚洲精品在线免费观看视频| 中文亚洲欧美| 久久午夜羞羞影院免费观看| 欧美激情成人在线视频| 国产精品国色综合久久| 国产日韩欧美在线视频观看| 亚洲国产成人91精品| 亚洲少妇自拍| 免费日本视频一区| 亚洲综合不卡| 欧美精品免费在线| 99re热精品| 久久精品欧美| 在线视频亚洲| 久久性色av| 亚洲三级电影全部在线观看高清| 亚洲性夜色噜噜噜7777| 久久久久成人精品免费播放动漫| 亚洲欧美区自拍先锋| 国产视频精品免费播放| 欧美激情一区二区三区在线| 久久性天堂网| 国产婷婷色一区二区三区四区| 国产精品综合av一区二区国产馆| 亚洲精美视频| 久久久91精品国产| 亚洲自拍偷拍麻豆| 欧美日韩视频专区在线播放 | 久久一区激情| 国产欧美日韩三级| 亚洲视频一区| 久久伊人免费视频| 亚洲视频在线免费观看| 久久夜色精品| 欧美 亚欧 日韩视频在线| 亚洲图片激情小说| 免播放器亚洲一区| 久久国产视频网| 国产日本欧美一区二区三区| 亚洲婷婷在线| 亚洲人体影院| 欧美成人自拍| 亚洲影院在线| 国产精品久久久久久久久久ktv| 亚洲区一区二区三区| 久热精品视频在线| 久久久久国产精品麻豆ai换脸 | 欧美日韩一区二区三区在线视频| 欧美伊久线香蕉线新在线| 国产精品久久久久久久久借妻| 亚洲欧洲中文日韩久久av乱码| 欧美激情在线有限公司| 美国成人毛片| 亚洲精品女av网站| 亚洲国产一区二区在线| 男女激情视频一区| 亚洲级视频在线观看免费1级| 欧美高清不卡| 欧美日韩免费高清| 午夜精品国产更新| 久久久国产一区二区三区| 精品成人在线| 欧美黄网免费在线观看| 欧美日韩国产精品成人| 亚洲一区在线视频| 久久久夜色精品亚洲| 美腿丝袜亚洲色图| 欧美wwwwww| 亚洲午夜久久久久久尤物| 夜夜嗨一区二区| 国产乱码精品一区二区三区不卡 | 国产农村妇女精品一二区| 午夜精品久久久久久久久久久 | 欧美日韩1234| 亚洲尤物在线| 久久久精品tv| 一区二区免费在线播放| 午夜精品国产更新| 日韩一区二区高清| 久热爱精品视频线路一| 国产亚洲一区二区三区在线播放| 久久另类ts人妖一区二区| 欧美国产一区视频在线观看| 欧美一区二视频| 欧美精品九九| 美女尤物久久精品| 国产精品视频一二| 亚洲欧洲视频| 国内视频一区| 亚洲午夜精品17c| 亚洲人成在线观看一区二区| 午夜精品久久久久| 99re6热在线精品视频播放速度| 午夜精品剧场| 亚洲欧美国产va在线影院| 欧美成人性生活| 久久夜色精品国产亚洲aⅴ| 欧美三区免费完整视频在线观看| 久久频这里精品99香蕉| 国产精品家教| 一本色道精品久久一区二区三区 | 亚洲综合电影一区二区三区| 麻豆成人在线| 欧美+日本+国产+在线a∨观看| 国产美女搞久久| 亚洲影音先锋| 性欧美办公室18xxxxhd| 欧美网站大全在线观看| 亚洲精品欧美| 国产精品99久久久久久久久久久久| 久久久蜜桃一区二区人| 久久婷婷国产麻豆91天堂| 国产日韩欧美精品一区| 亚洲视频视频在线| 午夜精品久久| 国产日韩精品在线| 欧美影院在线播放| 久久婷婷激情| 黄色成人av网站| 久久久久青草大香线综合精品| 久久综合九色综合久99| 在线高清一区| 欧美二区在线| 亚洲免费精彩视频| 亚洲男人的天堂在线观看| 国产精品高潮久久| 亚洲女同精品视频| 久久久噜噜噜久久久| 影音先锋亚洲电影| 欧美国产日韩精品| 宅男在线国产精品| 久久gogo国模裸体人体| 狠色狠色综合久久| 欧美成人午夜激情视频| 99re热精品| 欧美在线一二三区| 在线日韩av片| 欧美精品一区二| 亚洲一区欧美一区| 久久免费观看视频| 99精品久久免费看蜜臀剧情介绍| 欧美无砖砖区免费| 久久久久久91香蕉国产| 亚洲国产精品v| 香港成人在线视频| 亚洲国产精品高清久久久| 欧美激情中文字幕乱码免费| 国产欧美日韩在线| 一区二区三区我不卡| 午夜一区二区三区在线观看| 欧美激情中文字幕乱码免费| 亚洲视频中文字幕| 玖玖玖国产精品| 国产日产亚洲精品| 亚洲欧美成人在线| 亚洲一级网站| 国产一区二区av| 久久精品成人| 亚洲国产精品尤物yw在线观看| 欧美精品久久99久久在免费线| 亚洲一区二区黄色| 欧美不卡在线视频| 欧美亚洲视频在线观看| 亚洲精品日本| 国内精品久久久久久久影视蜜臀| 欧美黄色一区| 久久久噜噜噜久久中文字幕色伊伊 | 久久精品72免费观看| av成人激情| 欧美99久久| 久久精品国产亚洲精品| 99精品欧美一区二区三区| 国内揄拍国内精品少妇国语| 欧美日韩色综合| 欧美大片专区| 老鸭窝91久久精品色噜噜导演| 亚洲欧美一区二区激情|