设为首页
联系站长
加入收藏

您的位置: 首页>>IT业界>>互联网>>正文
 怎样为任何控件和区域添加提示信息:用自己封装的CTip类
 日期:2005-11-13 10:19:53  来源:100down.com
MFC中有一个CToolTipCtrl类,想必大家都知道,近来我在一个项目中需要在ActiveX Control上为特定的控件或区域添加提示.开始使用CToolTipCtrl,但发现它根本就不工作.无奈,只好自己写了一个类来实现它.
该类为CTip(包含CTip.c和CTip.h)
你只需在你的工程中加入它,就可以使用.
使用步骤:
        1.在初始化时Create(CWnd* pParentWnd).
        2.在MoseMove(CPoint point)中调用SetText(const CString& rsText)来设置要显示的文本.
        3.在MoseMove(CPoint point)中调用Show(CPoint point)显示该提示.
使用说明:
        1.Create中所作的是用CreateEX来创建一个窗口,这个窗口的大小为0,显示标题为空,风格为WS_POPUP¦WS_CHILD¦WS_CLIPSIBLINGS
        2.这里有一个技巧,你必须知道当你的鼠标位于哪个范围时,该提示应当出现.因此你可以有两种选择:之一,你直接指定该范围(设置一个CRect)或是添加一个成员变量来动态记录该范围;之二,你可以调用如下: 
          CRect rect;
          CWnd* pwnd = GetDlgItem(ID_xxx);
          pwnd->GetWindowRect(&rect);
          ScreenToClient(&rect);
          这样也可以得到当前的rect.然后你可以调用如下:
          if(rect.PtInRect(point))
          {
              m_tip.SetText(m_varname);
              m_tip.Show(point);
          }
          else
          {       
              m_tip.Close();
          }
        3.show和close用来显示和隐藏提示,在show中主要是利用CDC来进行绘制提示.
几个主要函数的具体代码:
BOOL CToolTip2::Create(CWnd* pParentWnd)
{
ASSERT(this != NULL );
ASSERT(pParentWnd != NULL);

m_pParentWnd = pParentWnd;
//  Create font
CRect rectInitialSize(0,0,0,0);//Initial Window size. Will be dynamically
return CreateEx(NULL, NULL, NULL,WS_POPUP ¦  WS_CHILD ¦ WS_CLIPSIBLINGS,
  rectInitialSize,pParentWnd, NULL, NULL);
}

BOOL CToolTip2::Show(const CPoint& rCurrentPoint)
{
ASSERT(this != NULL );
ASSERT(m_hWnd != NULL );
//  Is text empty or tool tip already displayed?
if ( m_szText.IsEmpty() ¦¦ m_bShowStatus)
  return FALSE;
m_ptCurrent = rCurrentPoint;
m_bShowStatus = TRUE;
//  show tool tip
DisplayToolTip(rCurrentPoint);
return TRUE;
}

void CToolTip2::DisplayToolTip(const CPoint& rCurrentPoint)
{
CDC* pDC = GetDC();
CBrush  *pOldBrush;
CFont *pOldFont;

pOldFont = pDC->SelectObject(&m_font);
CSize size = pDC->GetTextExtent(m_szText);
pDC->LPtoDP(&size);
//  form tooltip rectangle
CRect rectToolTip(rCurrentPoint.x, rCurrentPoint.y,
rCurrentPoint.x+size.cx+7, rCurrentPoint.y+size.cy+2);
//  draw Tooltip Rect and Text
pDC->SetBkMode(TRANSPARENT);
CBrush brushToolTip(GetSysColor(COLOR_INFOBK));
pOldBrush = pDC->SelectObject(&brushToolTip);
//  Create and select thick black pen
CPen penBlack(PS_SOLID, 0, COLORREF(RGB(0, 0, 0)));
CPen* pOldPen = pDC->SelectObject(&penBlack);
//  draw rectangle filled with COLOR_INFOBK
pDC->Rectangle(0,0,rectToolTip.Width(),rectToolTip.Height());
//  draw tooltip text
    pDC->SetTextColor( GetSysColor(COLOR_INFOTEXT) );//Tool Tip color set in
//  control panel settings
pDC->SetTextAlign(TA_LEFT);
pDC->TextOut(3,1, m_szText);
CRect rectWnd = rectToolTip;
m_pParentWnd->ClientToScreen(rectWnd); //  Convert from client to screen
CPoint ptToolTipLeft = rectWnd.TopLeft();
//  now display tooltip
SetWindowPos(&wndTop,ptToolTipLeft.x+1, ptToolTipLeft.y+1, rectWnd.Width(),
rectWnd.Height(),SWP_SHOWWINDOW¦SWP_NOOWNERZORDER¦SWP_NOACTIVATE);
// put back old objects
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldFont);
ReleaseDC(pDC);
}
相关文章

·Win2000中用户自定义IP头的实现及
·虚拟设备驱动程序结构(Vxd教程3)
·虚拟机管理器VMM(Vxd教程2)
·虚拟设备驱动程序初步(VxD教程一
·用 GDB 调试程序
·对象标准COM和CORBA论长道短
·VxD例程:消息框(Vxd教程5)
·VC:VxD技术及其在实时反病毒中的
·Microsoft Agent的COM接口编程
·单独使用CRecordSet


阅读排行

·Win 2000不能访问Win XP的原因及
·解析Windows中的帐户和权限功能
·如何共享Windows XP操作系统
·Windows XP Service Pack 1
·通过 Windows XP 注册表自定义您
·Windows 2000 TCP/IP协议概述
·Windows 2000 Server TCP/IP协议
·dos常用命令使用说明
·Windows变慢原因分析及解决方法(
·Windows变慢原因分析及解决方法(
·WINXP下强行关闭“杀”不了的进程
·Windows XP系统注册表的恢复

最新文档

·创业激情需冷静 网络代理选择应理
·域名交易平台亟需规范 预防域名买
·Travel旅游域名即将引发抢注潮 
·从原理深处分析如何预防arp攻击
·突破建站弊端 企业网络营销大有可
·如何区分进程和病毒?
·java的基础知识,如何学好java
·微机原理与接口技术基础知识
·如何解决青少年沉迷网络的问题,
·全面分析主板BIOS报警信号

请您注意:
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·您在本站发表的作品,本站有权在网站内转载或引用
·其他网站如果需要转载 本站文章请在贵站著名来源,谢谢合作