|
|
怎样为任何控件和区域添加提示信息:用自己封装的CTip类 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
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); }
|
|
相关文章:相关软件: |
|