第五章如何設計鼠標事件
鼠標的每一個動作都是一個事件,應用程序可以捕獲這個事件,並對它作出相應的處理,當然也可以不予理睬。鼠標事件有(左鍵)單擊,雙擊,右鍵單擊,左鍵按下,鼠標移動等,本章通過用鼠標畫圖的例程來介紹如何設計鼠標事件。
本章要點
1 爲鼠標事件添加消息映射
2 爲鼠標事件函數添加代碼
3 在面版上畫圖-畫直線的方法
5.1 Draw.exe的界面和功能
程序的上方是文字提示,下面有兩個按鈕。按下鼠標時移動就可以畫出任意圖形,用[清除]按鈕可靠以抹掉圖形。
5.2 Draw程序的界面設計
先創建工程文件,在“D:\myVC\CHO5\”建立Draw程序;MFC標準的對話框模式;用靜態DLL支持。
設計工程的界面,參考下列屬性表設計如圖chap05-01的界面。
控件和標題 | ID | Styles | Extended Styles |
按鈕[測試] | IDC_CLEAR_BUTTON | 默認 |
Client edge Static edge Modal Form |
按鈕[退出] | IDOK | ||
靜態文本[畫圖...] | IDC_STATIC | 對齊方式:居中 | |
對話框 Draw程序 | IDD_DRAW_DIALOG | Title, sysytem menu |
對話框設置字體大爲12。編譯和運行。
5.3 編寫代碼
畫一條任意曲線實際上是由很短的直線段構成的,這需要從前一點向當前點即鼠標的現在位置畫直線。所以需要定義兩個變量來存放前一點的座標。在鼠標移動時不斷地畫直線,這需要引進一個消息映射WM_MOUSEMOVE。另外,在面版上畫圖需要定義一個屏幕設備對象CClientDC dc(this)。
1 在頭文件DrawDlg.h中定義變量:
int m_PrevX, m_PrevY;
2 在對話框CDrawDlg中消息映射WM_MOUSEMOVE。在類嚮導中選中對話框DrawDlg,再在消息列表框中尋找WM_MOUSEMOVE,選中後點擊Add Function,就生成函數OnMouseMove(),點Add code立即輸入代碼。
3 函數OnMouseMove()的代碼
void CDrawDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags & MK_LBUTTON == MK_LBUTTON)
{
//定義屏幕設備對象
CClientDC dc(this);
dc.MoveTo(m_PrevX, m_PrevY);
dc.LineTo(point.x, point.y);
m_PrevX = point.x;
m_PrevY = point.y;
}
CDialog::OnMouseMove(nFlags, point);
}
MoveTo()定位畫筆到前一點,畫完直線後把點point儲存到m_Prev中。
4 給“鼠標按下”寫代碼
添加消息映射WM_MOUSEDOWN,函數OnLButtonDown的功能是保存鼠標點擊的當前點,代碼爲:
m_PrevX = point.x;
m_PrevY = point.y;
5 給清除按鈕寫代碼
Invalidate();
該函數的功能是調用Panit函數重畫對話框。
編譯和運行。
—END—