为ActiveX窗口上的自定义控件添加ToolTip
2016-04-14 19:59
239 查看
为自定义控件添加ToolTip时,一般做法是在PreTranslateMessage中添加如下代码:
if (NULL != m_pToolTipCtrl)
m_pToolTipCtrl->RelayEvent(pMsg);
希望CToolTipCtrl能够捕获鼠标移动等消息,但是结果PreTranslateMessage方法在ActiveX程序中不会执行(经验证在ProjectName+Ctrl(即整个ActiveX获得输入焦点)时PreTranslateMessage方法会执行)。
解决办法是为控件添加OnMouseMove消息响应,在OnMouseMove(UINT
nFlags, CPoint point)方法中添加代码:
//构造一个MSG
MSG msg;
msg.hwnd = m_hWnd;
msg.message = WM_MOUSEMOVE;
msg.wParam = LOWORD(point.x);
msg.lParam = LOWORD(point.y);
msg.time = 0;
msg.pt.x = LOWORD(point.y);
msg.pt.y = HIWORD(point.y);
m_ToolTip.RelayEvent(&msg);
这样才会使鼠标在控件上移动时显示ToolTip,但是要求要先点选过该控件才行。如果想要更进一步去掉这个先点选控件的限制,则需要在自定义控件的父窗口中响应OnMouseMove消息,并构造MSG关联到ToolTip。此时需要注意point的坐标转换。
完整的相关代码(PTZControlWnd和BitmapSlider)如下:
父窗口PTZControlWnd:
//成员变量声明
CBitmapSlider m_bsSpeedOrStepsize;
voidPTZControlWnd::OnMouseMove(UINTnFlags, CPointpoint)
{
(void)nFlags;
UpdateToolTipText();//更新ToolTip文字
m_bsSpeedOrStepsize->RelayToolTipEventFromParent(point);//此处的point的坐标是相对PTZControlWnd的
VAEBaseWnd::OnMouseMove(nFlags,
point);
}
控件CBitmapSlider
//成员变量声明
CToolTipCtrl m_ToolTip;
voidCBitmapSlider::RelayToolTipEventFromParent(CPoint
&point)
{
//将相对父窗口的坐标转换成屏幕坐标
GetParent()->ClientToScreen(&point);
//从屏幕坐标转换成相对控件自身CBitmapSlider的坐标
ScreenToClient(&point);
//因为在CBitmapSlider::OnMouseMove中也要用到,所以提取成函数
RelayToolTipEvent(point);
}
voidCBitmapSlider::RelayToolTipEvent(constCPoint &point )
{
if (m_ToolTip.m_hWnd
!= NULL)
{
//构造一个MSG
MSGmsg;
msg.hwnd =
m_hWnd;
msg.message =
WM_MOUSEMOVE;
msg.wParam =
LOWORD(point.x);
msg.lParam =
LOWORD(point.y);
msg.time = 0;
msg.pt.x
= LOWORD(point.y);
msg.pt.y
= HIWORD(point.y);
m_ToolTip.RelayEvent(&msg);
}
}
为整个ActiveX添加ToolTip的方法可以参考MSDN,同样没有使用PreTranslateMessage方法
http://support.microsoft.com/kb/141871/zh-cn
if (NULL != m_pToolTipCtrl)
m_pToolTipCtrl->RelayEvent(pMsg);
希望CToolTipCtrl能够捕获鼠标移动等消息,但是结果PreTranslateMessage方法在ActiveX程序中不会执行(经验证在ProjectName+Ctrl(即整个ActiveX获得输入焦点)时PreTranslateMessage方法会执行)。
解决办法是为控件添加OnMouseMove消息响应,在OnMouseMove(UINT
nFlags, CPoint point)方法中添加代码:
//构造一个MSG
MSG msg;
msg.hwnd = m_hWnd;
msg.message = WM_MOUSEMOVE;
msg.wParam = LOWORD(point.x);
msg.lParam = LOWORD(point.y);
msg.time = 0;
msg.pt.x = LOWORD(point.y);
msg.pt.y = HIWORD(point.y);
m_ToolTip.RelayEvent(&msg);
这样才会使鼠标在控件上移动时显示ToolTip,但是要求要先点选过该控件才行。如果想要更进一步去掉这个先点选控件的限制,则需要在自定义控件的父窗口中响应OnMouseMove消息,并构造MSG关联到ToolTip。此时需要注意point的坐标转换。
完整的相关代码(PTZControlWnd和BitmapSlider)如下:
父窗口PTZControlWnd:
//成员变量声明
CBitmapSlider m_bsSpeedOrStepsize;
voidPTZControlWnd::OnMouseMove(UINTnFlags, CPointpoint)
{
(void)nFlags;
UpdateToolTipText();//更新ToolTip文字
m_bsSpeedOrStepsize->RelayToolTipEventFromParent(point);//此处的point的坐标是相对PTZControlWnd的
VAEBaseWnd::OnMouseMove(nFlags,
point);
}
控件CBitmapSlider
//成员变量声明
CToolTipCtrl m_ToolTip;
voidCBitmapSlider::RelayToolTipEventFromParent(CPoint
&point)
{
//将相对父窗口的坐标转换成屏幕坐标
GetParent()->ClientToScreen(&point);
//从屏幕坐标转换成相对控件自身CBitmapSlider的坐标
ScreenToClient(&point);
//因为在CBitmapSlider::OnMouseMove中也要用到,所以提取成函数
RelayToolTipEvent(point);
}
voidCBitmapSlider::RelayToolTipEvent(constCPoint &point )
{
if (m_ToolTip.m_hWnd
!= NULL)
{
//构造一个MSG
MSGmsg;
msg.hwnd =
m_hWnd;
msg.message =
WM_MOUSEMOVE;
msg.wParam =
LOWORD(point.x);
msg.lParam =
LOWORD(point.y);
msg.time = 0;
msg.pt.x
= LOWORD(point.y);
msg.pt.y
= HIWORD(point.y);
m_ToolTip.RelayEvent(&msg);
}
}
为整个ActiveX添加ToolTip的方法可以参考MSDN,同样没有使用PreTranslateMessage方法
http://support.microsoft.com/kb/141871/zh-cn
相关文章推荐
- OCX打包成CAB包以及签名发布
- web下载的ActiveX控件自动更新
- activex 控件制作成cab包的问题
- JScript中调用ActiveX获取访客网卡MAC地址实现代码
- WinForm ToolTip使用方法小结
- 给ActiveX签名的实现方法详解
- DevExpress实现自定义TreeListNode的Tooltip的方法
- JavaScript监测ActiveX控件是否已经安装过的代码
- 使用VS2010创建MFC ActiveX工程项目
- 使用css实现全兼容tooltip提示框
- 使用VS2010 C#开发ActiveX控件(下),完整代码打包下载
- 使用VS2010 C#开发ActiveX控件(上)
- 用svg制作富有动态的tooltip
- requirejs 学习笔记 0 3ff8
- Packaging ActiveX Controls
- LoadLibrary "xxxx" 找不到指定的模块-------解决方法
- 发布MFC ActiveX控件并实现自动更新
- 发布MFC ActiveX控件并实现自动更新
- 制作临时证书为ActiveX控件签名
- 解决ActiveX被IE浏览器拦截的问题