C++ 按钮的工具提示

C++ 按钮的工具提示,c++,winapi,C++,Winapi,我使用MSDN中的函数 然后在WndProcWM_CREATEI CREATE buttonbutton=CreateWindowEx中( 0, L“按钮”, L“我的按钮”, WS|u可见| WS|u儿童, 10, 10, 100, 24, hWnd, (Humanu)ID_工具提示, 欣斯特, 无效) 最终创建工具提示tooltip\u mess=CreateToolTip(ID\u tooltip,hInst,hWnd,(PTSTR)“工具提示消息”)但它不起作用,我看不到我的工具提示,

我使用MSDN中的函数

然后在
WndProc
WM_CREATE
I CREATE button
button=CreateWindowEx中(
0,
L“按钮”,
L“我的按钮”,
WS|u可见| WS|u儿童,
10, 10, 100, 24, 
hWnd,
(Humanu)ID_工具提示,
欣斯特,
无效)

最终创建工具提示
tooltip\u mess=CreateToolTip(ID\u tooltip,hInst,hWnd,(PTSTR)“工具提示消息”)
但它不起作用,我看不到我的工具提示,我哪里做错了?

试试这个:

HWND CreateToolTip(int toolID, HWND hDlg, HINSTANCE hInst, PTSTR pszText)
{
    if (!toolID || !hDlg || !pszText)
    {
        return NULL;
    }

    // Get the window of the tool.
    HWND hwndTool = GetDlgItem(hDlg, toolID);
    if (!hwndTool)
    {
        return NULL;
    }                              

    // Create the tooltip. g_hInst is the global instance handle.
    HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                              WS_POPUP |TTS_ALWAYSTIP | TTS_BALLOON,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              hDlg, NULL, 
                              hInst, NULL);

   if (!hwndTip)
   {
       return NULL;
   }                              

    // Associate the tooltip with the tool.
    TOOLINFO toolInfo = { 0 };
    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hDlg;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId = (UINT_PTR)hwndTool;
    toolInfo.lpszText = pszText;
    if (!SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo))
    {
        DestroyWindow(hwndTip);
        return NULL;
    }

    return hwndTip;
}


您是否通过发送
TTM\u ACTIVATE
message来激活工具提示?SendMessage(工具提示,TTM\u ACTIVATE,TRUE,0);但同样的结果不要将工具提示文本强制转换为PTSTR,而是使用文本宏(即文本(“工具提示消息”)。注意,如果愿意,也可以使用_t宏。有关详细信息,请参阅。您使用的代码与MSDN文章中显示的代码不完全相同。是否检查
CreateToolTip()
返回NULL?
TTM\u ADDTOOL
返回它是否成功,因此您应该更新
CreateToolTip()
以检查它,并让它销毁工具提示,如果
TTM\u ADDTOOL
失败,则返回NULL。
(PTSTR)“工具提示消息”
是错误的,考虑到您在
CreateWindowEx()上使用了L“按钮”)
,这意味着必须定义
UNICODE
,因此需要使用L“工具提示消息”(或
文本(“工具提示消息”)
)相反。您正在将
char*
键入
wchar\u t*
,这是错误的。如果使用文本宏解决问题,请在发送TTM\u ADDTOOL消息时检查返回值。您也在检查CreateToolTip的返回值吗?尝试了此代码,但写入了tooltip\u mess=CreateToolTip(ID\u tooltip,hInst,hWnd,L“工具提示消息”);没有hInst,if is right函数只接收3个参数。不幸的是,我看不到工具提示。哪里需要写“if”?我更新了我的答案。至于
if
语句,当你需要在按钮上显示/隐藏tooptip时,你可以将它们放在任何需要的地方。if(!SendMessage(hwndTip,TTM\u ADDTOOL,0,(LPARAM)&toolInfo)总是破坏窗口这是正常的吗?我想做一些类似于工具栏的事情,当鼠标在按钮->上显示工具提示时。我尝试在单击按钮时显示工具提示,但得到错误消息“变量'tooltip\u mess'正在使用而没有初始化。“
TTM\u ADDTOOL
如果成功则返回TRUE,否则返回FALSE,因此您的工具提示显然没有正确添加到按钮中。至于初始化错误,听起来好像您没有正确管理
tooltip\u mess
变量。请提供一个示例来演示您真正在做什么。
HWND CreateToolTip(int toolID, HWND hDlg, HINSTANCE hInst, PTSTR pszText)
{
    if (!toolID || !hDlg || !pszText)
    {
        return NULL;
    }

    // Get the window of the tool.
    HWND hwndTool = GetDlgItem(hDlg, toolID);
    if (!hwndTool)
    {
        return NULL;
    }                              

    // Create the tooltip. g_hInst is the global instance handle.
    HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                              WS_POPUP |TTS_ALWAYSTIP | TTS_BALLOON,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              hDlg, NULL, 
                              hInst, NULL);

   if (!hwndTip)
   {
       return NULL;
   }                              

    // Associate the tooltip with the tool.
    TOOLINFO toolInfo = { 0 };
    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hDlg;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId = (UINT_PTR)hwndTool;
    toolInfo.lpszText = pszText;
    if (!SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo))
    {
        DestroyWindow(hwndTip);
        return NULL;
    }

    return hwndTip;
}
case WM_CREATE:
{
    Button = CreateWindowEx( 0, L"BUTTON", L"My Button", WS_VISIBLE|WS_CHILD, 10, 10, 100, 24, hWnd, (HMENU)ID_TOOLTIP, hInst, NULL); 

    tooltip_mess = CreateToolTip(ID_TOOLTIP, hWnd, hInst, L"Tooltip message");

    break;
}
if (tooltip_mess)
    SendMessage(tooltip_mess, TTM_ACTIVATE, TRUE, 0);
if (tooltip_mess)
    SendMessage(tooltip_mess, TTM_ACTIVATE, FALSE, 0);