MFC-为子窗体/子窗口的静态控件的特定位置/区域 增加提示/tips信息 使用自绘方法
1.前言
昨天晚上项目对方需要我改改程序的界面,当鼠标处于在温湿度控件的特定位置时,出现tips,提示当前温度湿度等一下信息,然后我就开始了工作
2.使用CToolTipCtrl类遭遇挫折
通过搜索,很快定位可以使用MFC内部集成的CToolTipCtrl类简单的来实现,参考了文章http://blog.csdn.net/magictong/article/details/3539086,问题没有解决,搜索相关静态控件上信息提示的文章,问题没有得到解决,继续参考了相关的文章,问题还是没有得到解决,继续参考CodeProject上的代码http://www.codeproject.com/Articles/36/Tooltips-in-modal-dialog-boxes,问题还是木有得到解决,我不清楚为什么会这样,于是新建了一个解决方案,按照CToolTipCtrl类的用法如法炮制,嗯,在新的项目里面确实是正确的,那为什么在我的项目中就不能使用了呢?
由于,我是要在子窗体的一个静态控件上实现tips,所以我把新项目的主对话框上放上一个子对话框,在子对话框上放上了一个Button控件,经过测试,效果完美无缺,但是,为什么在我的项目中就不能工作呢?我百思不得其解,把新项目中的子窗体的属性和我原有项目中子窗体的属性一个一个对照着看,发现木有任何问题,于是没有办法了。。。悲剧。。。到现在还不知道是什么原因 但我不能停留在这个上面,要继续做完它。。。一个新思路诞生了
3.使用DrawText自绘完成功能
由于要求鼠标处于某个特定区域内时,才出现提示,所以我重写了OnMouseMove函数:
1 void CThermoMeter::OnMouseMove(UINT nFlags, CPoint point) 2 { 3 // TODO: Add your message handler code here and/or call default 4 //CRect rect=m_rectCtrlUnit ;//为什么直接赋值会出错!!!! 5 CRect rect; 6 rect.left = m_rectCtrlUnit.left; 7 rect.right = m_rectCtrlUnit.right; 8 rect.top = m_rectCtrlUnit.top; 9 rect.bottom = m_rectCtrlUnit.bottom; 10 11 if(point.x> rect.left && point.x < rect.right 12 && point.y> rect.top && point.y <rect.bottom) 13 { 14 CString csTips; 15 csTips.Format("%.1f",m_dCurrentValue);//保留一位小数 16 CFont font; 17 font.CreatePointFont(100,_T("Arial"),NULL); 18 CDC * pdc=GetDC(); 19 CFont *oldfont=pdc->SelectObject(&font); 20 CBrush * pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); 21 CRect rc; 22 rc.top = rect.top-20; 23 rc.bottom=rect.top;//字高20像素 24 rc.left=rect.left; 25 rc.right=rc.left+50; 26 pdc->SetBkMode(TRANSPARENT); 27 pdc->DrawText(csTips,&rc,DT_LEFT); 28 pdc->SelectObject(&oldfont); 29 // Done with the font. Delete the font object. 30 font.DeleteObject(); 31 //WPARAM a=8;//随便怎么设置无所谓 32 //LPARAM b=9; 33 //GetParent()->SendMessage(WM_TIPS_EVENT,a,b); 34 } 35 else 36 { 37 Invalidate();//当鼠标移走的时候,将字删掉 38 } 39 CStatic::OnMouseMove(nFlags, point); 40 }
上面,m_rectCtrlUnit是要进行提示的区域,之所以上面注释部分还有个SendMessage,是因为受文章在MFC中手动添加消息处理函数PreTranslateMessage和自定义消息 影响,想把消息发送给父对话框来处理(即在父对对话中放一个CToolTipCtrl对象,当收到WM_TIPS_EVENT消息时,执行提示工作),但是实际中并没有起到作用,不知道怎么回事。
4.总结
尼玛,其实一开始的时候,我就想自绘的,但偷懒想用用自带的功能,导致花费了这么多时间。。。真是坑爹。。。关键是到现在还不知道CToolTipCtrl不工作的原因。。囧!!!!