Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用CTOLTIPCTRL定制控件的工具提示?(MFC)_C++_Mfc - Fatal编程技术网

C++ 使用CTOLTIPCTRL定制控件的工具提示?(MFC)

C++ 使用CTOLTIPCTRL定制控件的工具提示?(MFC),c++,mfc,C++,Mfc,我制作了一个来自CWnd(折线图)的自定义控件,我想知道是否可以使用CTOLTIPCTRL来显示图形上点的工具提示。如果是,我怎么做 顺便说一句,当我将鼠标移到点上时,包含关于点值信息的字符串的矩形应该会弹出。是的,这是有效的,实际上我也在折线图中做同样的事情,但是有一些缺点/备注。消息处理有点不稳定,一些消息没有按照文档发送,一些变通方法是保持控件自包含所必需的(不需要父级帮助来反映通知) 您要做的是在CWnd派生类中声明一个变量 CToolTipCtrl m_ToolTipCtrl; CSt

我制作了一个来自CWnd(折线图)的自定义控件,我想知道是否可以使用CTOLTIPCTRL来显示图形上点的工具提示。如果是,我怎么做


顺便说一句,当我将鼠标移到点上时,包含关于点值信息的字符串的矩形应该会弹出。

是的,这是有效的,实际上我也在折线图中做同样的事情,但是有一些缺点/备注。消息处理有点不稳定,一些消息没有按照文档发送,一些变通方法是保持控件自包含所必需的(不需要父级帮助来反映通知)

您要做的是在CWnd派生类中声明一个变量

CToolTipCtrl m_ToolTipCtrl;
CString m_ToolTipContent;
然后在OnCreate上执行此操作:

m_ToolTipCtrl.Create(this, TTS_ALWAYSTIP);
m_ToolTipCtrl.Activate(TRUE);
您还可以选择设置延迟时间:

m_ToolTipCtrl.SetDelayTime(TTDT_AUTOPOP, -1);
m_ToolTipCtrl.SetDelayTime(TTDT_INITIAL, 0);
m_ToolTipCtrl.SetDelayTime(TTDT_RESHOW, 0);
如果要显示工具提示(可能在OnMouseMove()中),请使用

但这只适用于UNICODE版本。因此,如果您仍然使用MBCS(像我一样),则只能在一定延迟后显示工具提示。 使用此选项设置工具提示文本(也在OnMouseMove中):


您必须对此进行一些修改,并阅读函数和消息的文档,以使其在您的项目中正常工作,但确实可以做到。

@Roel我在
m\u ToolTipCtrl.Create(this,TTS\u ALWAYSTIP)行中得到异常在MyCustomCtrl::OnCreate()中,除了此代码之外,还有什么我应该做的吗?很难找到任何关于自定义控件中包含的工具提示的主题。嗯,不确定。尝试将::IsWindow(m_hWnd)放在.Create()之前,应该可以,但可能有问题。是否在OnCreate()的开头调用CWnd::OnCreate?你得到了什么样的例外?调试器在哪里中断?是的,我在m\u ToolTipCtrl.Create(this)之前调用CWnd::Create(),它在
ttCtrl->Create(this,TTS\u ALWAYSTIP)上中断在TestApp.exe中的0x00418c29处显示消息
未处理的异常:0xC0000005:访问冲突读取位置0x00000000。
,因为它获取了要读取的空指针。如果我在
CWnd::Create
MyCustomCtrl::Create
之间交换调用顺序,我也会遇到同样的错误。如果您的ttCtrl是指针,而不是我在示例中使用的成员,并且您没有为它分配内存,那么它将无法工作。。。为什么你让ttCtrl成为一个指针而不是一个成员?我有一个指针。现在我把它改成了object。我有一个指针,因为文档中有一个使用指针的示例,我在CMyCustomCtrl类的构造函数中将它初始化为NULL,并在析构函数中释放内存。无论如何,即使我将对象CTOLTIPCTRL用作MyCustomCtrl类的成员,我也会遇到异常。因此,我的自定义控件是从CWnd派生的。在MyCustomCtrl::Create()中,我首先调用Cwnd::Create(),然后调用CTOLTIPCTRL::Create(),我不知道会出现什么问题,而且CallStack没有显示任何我可以依赖的有用调用,正在尝试调试。有什么帮助吗?
m_ToolTipCtrl.Pop();
// Not using CToolTipCtrl::AddTool() because
// it redirects the messages to the parent
TOOLINFO ti = {0};
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_IDISHWND;    // Indicate that uId is handle to a control
ti.uId = (UINT_PTR)m_hWnd;   // Handle to the control
ti.hwnd = m_hWnd;            // Handle to window
// to receive the tooltip-messages
ti.hinst = ::AfxGetInstanceHandle();
ti.lpszText = LPSTR_TEXTCALLBACK;
ti.rect = <rectangle where, when the mouse is over it, the tooltip should be shown>;
m_ToolTipCtrl.SendMessage(TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
m_ToolTipCtrl.Activate(TRUE);

m_ToolTipContent = "my tooltip content";
// The build-agnostic one doesn't work for some reason.
ON_NOTIFY_EX(TTN_NEEDTEXTA, 0, OnTTNNeedText)
ON_NOTIFY_EX(TTN_NEEDTEXTW, 0, OnTTNNeedText)

BOOL GraphCtrlOnTTNNeedText(UINT id, NMHDR* pTTTStruct,  LRESULT* pResult)
{
    TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pTTTStruct;
    //pTTT->lpszText = "some test text";
    //pTTT->lpszText = m_ToolTipContent;
    strncpy_s(pTTT->lpszText, 80, m_ToolTipContent, _TRUNCATE);

    return TRUE;
}