11.6.1 信息提示框的设计与实现(1)
截屏模块的信息提示框是初始时位于截屏窗体左上角的一个编辑框。它有自己的背景图像,可以根据用户的动作提示用户当前的信息,以及对下步动作进行说明提示。截屏窗体上的鼠标永远不能移到这个窗体上,当用户需要截取消息框下的图片时,消息框可以切换到屏幕的右上角,躲开用户的鼠标。
(1)为信息框设计并载入一个背景位图,如图11.25所示。
|
| 图11.25 消息框的背景图像 |
(2)由于一般的编辑框无法实现本实例所需的功能,因此需要重载一个编辑框,以实现更多的功能。
- 01 class CMyEdit : public CEdit
- 02 {
- 03 public:
- 04 CMyEdit(); //构造函数
- 05 virtual ~CMyEdit(); //析构函数
- 06 public:
- 07 BOOL m_bMove; //是否移动标识
- 08 public:
- 09 protected:
- 10 //{{AFX_MSG(CMyEdit)
- 11 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
- //鼠标移动事件处理函数
- 12 afx_msg void OnSetFocus(CWnd* pOldWnd); //获取焦点事件处理函数
- 13 afx_msg BOOL OnEraseBkgnd(CDC* pDC); //背景绘制事件处理函数
- 14 afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
- 15 //}}AFX_MSG
- 16 DECLARE_MESSAGE_MAP()
- 17 };
【代码解析】
类中定义的变量、函数的功能及实现如下:
第7行的m_bMove标识当前信息框的位置,为真时信息框位于屏幕的右上角,为假时信息框位于屏幕的左上角。
第11行的鼠标移动处理函数,主要实现躲避鼠标的功能,实现如下:
- 01 void CMyEdit::OnMouseMove(UINT nFlags, CPoint point)
- 02 {
- 03 CRect rect;
- 04 GetWindowRect(&rect); //获取窗体大小
- 05 int xScreen = GetSystemMetrics(SM_CXSCREEN); //获取屏幕宽度
- 06 if(m_bMove)
- 07 {
- 08 MoveWindow(10,10,rect.Width(),rect.Height()); //移动到左上角
- 09 m_bMove=FALSE;
- 10 }
- 11 else
- 12 {
- 13 MoveWindow(xScreen-180,10,rect.Width(),rect.Height());
- //移动到右上角
- 14 m_bMove=TRUE;
- 15 }
- 16 CEdit::OnMouseMove(nFlags, point);
- 17 }
上述代码首先获取当前信息提示框的大小。然后获取屏幕的宽度。最后判断当前信息提示框的位置,如果信息框当前位于屏幕的右上角,则在第13行将其移到屏幕的右上角。如果信息框当前位于屏幕的左上角,则在第8行将其移到屏幕的左上角。
第12行定义的OnSetFocus()函数实现了,隐藏鼠标移入消息框时的光标。实现 如下:
- 01 void CMyEdit::OnSetFocus(CWnd* pOldWnd)
- 02 {
- 03 CEdit::OnSetFocus(pOldWnd);
- 04 HideCaret(this->m_hWnd); //隐藏光标提示符
- 05 }