建立一個名為Draw的工程
CDrawView類始終是覆蓋在CMainFrame類之上的,我們在窗口上所做的操作由於受到CxxView的遮擋,只能被CxxVIEw類捕獲。
在CDrawVIEw.h文件中:
//{{AFX_MSG(CDrawVIEw)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
這裡的//{{AFX_MSG(CDrawVIEw)和//}}AFX_MSG是一對注釋宏,在這對注釋宏中間,是一些聲明消息響應函數的宏
在CDrawVIEw.cpp文件中:
BEGIN_MESSAGE_MAP(CDrawView, CVIEw)
//{{AFX_MSG_MAP(CDrawVIEw)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}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()
這裡的ON_WM_LBUTTONDOWN() , ON_WM_LBUTTONUP() , ON_WM_MOUSEMOVE() 等宏將消息和消息響應函數關聯起來。一旦有消息產生,就會去調用消息響應函數
MFC中處理消息是采用消息映射的方法。
消息映射機制的基本原理:
消息的產生都是和句柄相關的,在每個MFC程序中維護著一個句柄和C++類指針之間的映射表,當消息產生時,就可以從映射表中找到與句柄相對應的C++類的指針,然後將這個指針傳遞給基類,調用基類中的windowProc函數,windowProc再調用OnMessage函數,在這個OnMessage中來判斷消息的類型,查找與之有關的消息映射(頭文件和源文件),若找到消息響應函數,調用這個響應函數來處理消息。
CDC是由CObject派生而來的,表示設備環境(Device-Context 或者叫設備上下文)的類,按照微軟的叫法:Graphical Drawing Classes,用於繪制圖形、文本等。由CDC派生出來的CClIEntDC、CPaintDC、CWindowDC、CMetaFileDC都各有用途。
HDC hdc;
hdc=::GetDC(m_hWnd); // m_hWnd是一個全局變量,是指向當前應用程序實例的句柄
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);// 釋放DC,因為Windows對設備環境的使用數量做了限制
CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC); // 使用CDC也需要手動釋放DC,但使用CClIEntDC、CPaintDC、CWindowDC、CMetaFileDC不需要手動釋放DC,它們的釋放是自動,由析構函數完成。
CClIEntDC dc(this);
CClIEntDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CWindowDC dc(this);
//CWindowDC dc(GetParent());
//CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);