第四章:基本事件處理、映射模式和滾動視圖
1,消息映射:如在視窗中按下鼠標做鍵,會自動發送WM_LBUTTONDOWN消息,如果要對這消息有所反應的話,需
//{{AFX_MSG(CEx04aVIEw)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//頭文件聲明消息響應函數原型。
//}}AFX_MSG
DECLARE_MESSAGE_MAP()//頭文件
BEGIN_MESSAGE_MAP(CDrawView, CVIEw)//代碼文件
//{{AFX_MSG_MAP(CEx04aVIEw)
ON_WM_LBUTTONDOWN()//該消息映射宏將OnLButtonDown函數和應用程序框架聯系在一起
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CDrawVIEw::OnLButtonDown(UINT nFlags, CPoint point) //代碼文件
{
//event processing code here
}
說明:
為了方便ClassWizard,AppWizard生成了一些注釋行。它把消息映射函數原型放在兩個AFX_MSG“刮弧對”之間,在AFX_MSG_MAP“刮弧對”之間添加消息映射入口,並在代碼文件中給出完整的OnLButtonDown成員函數框架。
2,視圖中的OnDraw()是根據視圖當前狀態來繪制圖象的,用戶的操作可以改變這中狀態。在完整的MFC庫應用程序中,文檔的對象掌握在應用程序(視圖)的狀態。
3,如果用全程變量來保存視圖狀態,這將在多視圖情況下會遇到麻煩;(待體會)
4,CWnd::InvalidateRect函數能夠觸發WM_PAINT消息,該消息被窗口類如CVIEw映射後,引起對OnDraw函數調用,從而重繪無效矩形區域。
優化窗口的繪制過程:
1)設置的無效區域越小,重畫的速度就越快;
2)執行無效區域外的繪制純屬於浪費時間,OnDraw函數可以調用CDC的成員函數GetClipBox得到無效區域大小。
注意:
OnDraw函數不僅僅響應InValidate*之類的調用,它也會在窗口改變大小和窗口顯露時被調用。
5,本章重要介紹函數
PtInRect(..);//測試一個點是否落在某個矩形內。
PtInRegion(..);//判斷一個點是否落在橢圓(CRgn對象)內//A region is an elliptical or polygonal area within a window.
GetClIEntRect(..);//獲得客戶矩形坐標並保持在CRect對象中
SelectStockObject(..);//選擇the predefined stock pens, brushes, or fonts到DC中,函數返回先前的CGdiObject 對象指針。
6,在構造函數中對類數據成員初始化。
CEx04aView::CEx04aView() : m_rectEllipse(0, 0, 200, 200)//注意這種初試化方式,m_rectEllipse是CEx04aVIEw類數據成員CRect類對象
{
m_nColor = GRAY_BRUSH;
}
7,[致WIN32程序員]:
標准的基於WINDOWS應用程序會首先登記一個窗口類(不同於C++類[補:實際是個_WNDCLASS結構體]),同時在處理過程中,還需要對每個類指定窗口過程(WINDOWS PROCEDURE)。每次應用程序調用CreateWindow建立一個窗口時候,都要指定一個窗口類做為參數,這樣就把新建立的窗口和窗口過程函數連接起來了。每次Windows給窗口發送消息時候,這個函數就會被調用(補:消息循環中DispatchMessage(&msg)分派消息到窗口的回調函數處理,OS調用窗口回調函數進行處理),以檢查用參數傳送進來的消息碼,並執行適當的代碼來處理該消息。
MFC庫應用程序框架有一個適用於大多數窗口類型的簡單窗口類和窗口過程函數。該窗口過程函數會根據參數傳進來的窗口句柄,在MFC的句柄映射表(handle map)中查找,從而得到對應的C++窗口對象指針。然後,該窗口過程函數用MFC運行時類(runtime class)系統來決定窗口對象的C++類。下一步,它從由消息分發映射函數生成的靜態表中找到消息處理函數,最後用正確的窗口對象調用消息處理函數。
8,映射模式:
1)MM_TEXT映射模式:坐標被映射到象素,X值向右遞增,Y值向下遞增。可用它來表示[設備坐標]。
CDC::SetMapMode(..)//設置映射模式
CDC::GetMapMode(..)
CDC::SetVIEwportOrg(..)//設置視口原點
CDC::GetVIEwportOrg(..)
CDC::SetWindowOrg (..)//設置屏幕原點
CDC::GetWindowOrg(..)
2)固定比例映射模式(MM_HIENGLISH,MM_HIMETRIC ,MM_LOMETRIC ,MM_LOENGLISH,MM_TWIPS )
固定比例映射模式均X值向右遞增,Y值向下遞增,它們之間唯一差別是 實際的比例因子。如下:
MM_HIENGLISH Each logical unit is converted to 0.001 inch.
MM_HIMETRIC Each logical unit is converted to 0.01 millimeter.
MM_LOENGLISH Each logical unit is converted to 0.01 inch.
[1] [2] [3] 下一頁