默认情况下,ActiveX 控件不支持工具提示。下面的步骤,但是,演示如何修改生成使用 MFC ActiveX 控件向导来添加该支持基本的 ActiveX 控件:
- 通过使用 MFC ActiveX 控件模板来创建新的 Visual C++ 项目。将新控件命名为Basic
- 打开与该项目相关联的 Stdafx.h 文件并添加下面的行。
注意Visual C++.NET 中不执行此步骤。Afxcmn.h 的头文件包含用作包装到 Windows 公共控件包括 CToolTipCtrl 的 MFC 类的声明。
#include <afxcmn.h>
- 位于 BasicCtrl.h 的 CBasicCtrl COleControl 派生的类中添加以下行。
鼠标消息处理程序将用 RelayEvent 方法来将这些信息中继到工具提示控件。
CToolTipCtrl m_ttip; void RelayEvent(UINT message, WPARAM wParam, LPARAM lParam);
- 将 WM_CREATE 消息处理程序添加到 CBasicCtrl 消息映射中。若要执行此操作,请单击在类视图窗口中选择 CBasicCtrl。CBasicCtrl
节点处于选中状态,打开属性窗口,然后单击要选择的邮件。找到 WM_CREATE 的邮件,然后再添加一个 OnCreate 方法来处理该消息。它是此例程中将创建工具提示控件。将下面的代码添加到该处理程序。
if (!m_ttip.Create(this)) TRACE0("Unable to create tip window."); else if (!m_ttip.AddTool(this, LPCTSTR(m_ToolTipText))) TRACE0("Unable to add tip for the control window."); else m_ttip.Activate(m_ShowToolTip); - 为中继到该工具提示控件相应的消息,添加 WM_LBUTTONDOWN、 WM_LBUTTONUP,和 WM_MOUSEMOVE CBasicCtrl 消息映射到处理程序。这些处理程序的代码后面。
虽然这可能看起来合理调用 CWnd::GetCurrentMessage,而不是手动生成一条消息,则点,则返回的值是以屏幕坐标表示。当工具提示执行命中的测试,以确定是否任何相关的工具的客户端矩形的边界内中继的消息不断下降的点,则测试将失败,并且将不会显示工具提示。
void CBasicCtrl::OnLButtonDown(UINT nFlags, CPoint point) { RelayEvent(WM_LBUTTONDOWN, (WPARAM)nFlags, MAKELPARAM(LOWORD(point.x), LOWORD(point.y))); COleControl:: OnLButtonDown(nFlags, point); } void CBasicCtrl::OnLButtonUp(UINT nFlags, CPoint point) { RelayEvent(WM_LBUTTONUP, (WPARAM)nFlags, MAKELPARAM(LOWORD(point.x), LOWORD(point.y))); COleControl::OnLButtonUp(nFlags, point); } void CBasicCtrl::OnMouseMove(UINT nFlags, CPoint point) { RelayEvent(WM_MOUSEMOVE, (WPARAM)nFlags, MAKELPARAM(LOWORD(point.x), LOWORD(point.y))); COleControl::OnMouseMove(nFlags, point); } // implementation of the CBasicCtrl::RelayEvent method: void CBasicCtrl::RelayEvent(UINT message, WPARAM wParam, LPARAM lParam) { if (NULL != m_ttip.m_hWnd) { MSG msg; msg.hwnd= m_hWnd; msg.message= message; msg.wParam= wParam; msg.lParam= lParam; msg.time= 0; msg.pt.x= LOWORD (lParam); msg.pt.y= HIWORD (lParam); m_ttip.RelayEvent(&msg); } } - 通过添加代码以初始化的 m_ToolTipText 和 m_ShowToolTip 属性来修改 CBasicCtrl::DoPropExchange。
PX_Bool(pPX, _T("ShowToolTip"), (BOOL&)m_ShowToolTip, FALSE);//In order to view tooltip, this must be true. PX_String(pPX, _T("ToolTipText"), m_ToolTipText, _T("")); //And we need to add some text in _T(“ ...”)
- 若要允许该用户控件的某些控制工具提示功能,请向 CBasicCtrl 类中添加以下的自动化属性。为此,请在类视图窗口中选择 BasicLib (此节点将显示有关该项目的 IDL 文件的类视图信息)。打开此节点,然后用鼠标右键单击主接口节点
(_DBasic)。单击添加,然后单击添加属性。添加列出的参数具有以下两个属性:
ShowToolTip 将允许用户若要禁止显示的工具提示,并要将跟踪将用来显示工具提示时显示的文本。
Property Name: ShowToolTip ToolTipText Property Type: VARIANT_BOOL BSTR Variable name: m_ShowToolTip m_ToolTipText Notification function: OnShowToolTipChanged OnToolTipTextChanged
- 按以下方式修改这些属性的属性更改通知函数。
void CBasicCtrl::OnToolTipTextChanged() { if (m_ttip.m_hWnd && AmbientUserMode()) { m_ttip.UpdateTipText(LPCTSTR(m_ToolTipText), this); SetModifiedFlag(); } } void CBasicCtrl::OnShowToolTipChanged() { if (m_ttip.m_hWnd && AmbientUserMode()) { m_ttip.Activate(m_ShowToolTip); SetModifiedFlag(); } }
原链接:http://support.microsoft.com/kb/141871/zh-cn
本文介绍如何为不支持工具提示的ActiveX控件添加工具提示功能。具体步骤包括修改源代码、处理鼠标事件及实现自动化属性等。
513

被折叠的 条评论
为什么被折叠?



