11.5.1 功能控制模块的界面设计及实现(2)
(3)由于窗体没有标题栏,因此无法用鼠标拖动窗体移动。为了解决这个问题需要重载窗体的OnLButtonDown()函数,该函数即鼠标单击的处理函数。在该函数中,判断鼠标单击的位置,当鼠标单击位置位于对话框左侧的一段空白区域内时,则向窗体发送鼠标单击标题栏的消息。如此便可实现在对话框左侧拖动对话框的功能。
- 01 void CScreenShotsDlg::OnLButtonDown(UINT nFlags, CPoint point)
- 02 {
- 03 if (point.x < 40)
- 04 { //这个区域内可拖动窗体
- 05 PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,
- 06 MAKELPARAM(point.x,point.y));
- 07 }
- 08 CDialog::OnLButtonDown(nFlags, point);
- 09 }
(4)为工程载入鼠标光标资源IDC_NOMAL,如图11.23所示;鼠标光标资源IDC_RIGHT,如图11.24所示。
|
| 图11.23 伸开的手型光标 |
|
| 图11.24 握拳的手型光标 |
为了界面的美化,也为了用户操作简单。当鼠标移动到拖动区域时,鼠标光标变为伸开的手型。这需要重载鼠标移动处理函数,在处理函数中判断鼠标位置,当鼠标位于拖放区域时,改变鼠标光标。
- 01 void CScreenShotsDlg::OnMouseMove(UINT nFlags, CPoint point)
- 02 {
- 03 if (point.x < 40)
- 04 SetCursor(AfxGetApp()->LoadCursor(IDC_NORMAL)); //载入光标
- 05 CDialog::OnMouseMove(nFlags, point);
- 06 }
当用户在拖动区域按下鼠标左键时,鼠标光标变为握拳型,此时便可移动鼠标,拖动窗体,直到鼠标左键抬起为止。- 01 void CScreenShotsDlg::OnLButtonDown(UINT nFlags, CPoint point)
- 02 {
- 03 if (point.x < 40)
- 04 { //将鼠标事件转换为标题栏鼠标事件,并更换光标
- 05 PostMessage(WM_NCLBUTTONDOWN,HTCAPTION
- 06 ,MAKELPARAM(point.x,point.y));
- 07 SetCursor(AfxGetApp()->LoadCursor(IDC_RIGHT));
- 08 }
- 09 CDialog::OnLButtonDown(nFlags, point);
- 10 }