2015-06-24 3 views
-2

Я пробовал использовать всплывающую подсказку в winapi, но это не сработало! Это мой код, моя подсказка не показывает! Можете ли вы сказать мне, почему это не работает? Я использую Visual Studio 2010.Как использовать подсказку в winapi?

#include <windows.h> 
#include <commctrl.h> 

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM); 
void CreateMyTooltip(HWND); 
HWND CreateToolTip(HWND hDlg, int tooID); 
void AddToolTip(int toolID, PTSTR pszText, HWND hDlg); 
HINSTANCE hinst; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg ;  
    WNDCLASS wc = {0}; 
    wc.lpszClassName = L"Tooltip" ; 
    wc.hInstance  = hInstance ; 
    wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); 
    wc.lpfnWndProc = WndProc2 ; 
    wc.hCursor  = LoadCursor(0, IDC_ARROW); 

    RegisterClass(&wc); 
    CreateWindow(wc.lpszClassName, L"Tooltip", 
     WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
     100, 100, 200, 150, 0, 0, hInstance, 0); 
    hinst - hInstance; 
    while(GetMessage(&msg, NULL, 0, 0)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return (int) msg.wParam; 
} 

LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
    case WM_CREATE: 
     CreateMyTooltip(hwnd); 
     break; 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    } 
    return DefWindowProc(hwnd, msg, wParam, lParam); 
} 

void CreateMyTooltip (HWND hwnd) 
{ 

    INITCOMMONCONTROLSEX iccex; 
    HWND hwndTT;     

    TOOLINFO ti; 
    wchar_t tooltip[30] = L"A main window"; 
    RECT rect;     

    iccex.dwICC = ICC_WIN95_CLASSES; 
    iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    InitCommonControlsEx(&iccex); 

    hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, 
     WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,   
     0, 0, 0, 0, hwnd, NULL, hinst, NULL); 

    SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, 
     SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 

    GetClientRect (hwnd, &rect); 

    ti.cbSize = sizeof(TOOLINFO); 
    ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND; 
    ti.hwnd = hwnd; 
    ti.hinst = NULL; 
    ti.uId = 0; 
    ti.lpszText = tooltip; 
    ti.rect.left = rect.left;  
    ti.rect.top = rect.top; 
    ti.rect.right = rect.right; 
    ti.rect.bottom = rect.bottom; 

    SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); 
    SendMessage(hwndTT, TTM_ACTIVATE, true, NULL); 
    SendMessage(hwndTT, TTM_POPUP, 0, 0); 
}  
+0

Добавьте ошибку проверки и повторите попытку. –

+0

Программа не компилируется. –

+0

Я все еще собираю успех! а не ошибка, просто подсказка не появляется! –

ответ

0

Update:

Там, кажется, ошибка с манифестом. Если вы используете Visual Studio, перейдите к проекту свойства:

Project -> Свойства -> Linker -> Manifest -> Создать файл манифеста: Да

После того, как вы правильно манифеста, вы можете вызвать функцию нормально :

void CreateMyTooltip(HWND hparent) 
{ 
    HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, 
     WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 0, 0, 0, 0, hparent, NULL, 0, NULL); 

    TTTOOLINFO ti = { 0 }; 
    ti.cbSize = sizeof(TTTOOLINFO); 
    ti.uFlags = TTF_SUBCLASS; 
    ti.hwnd = hparent; 
    ti.lpszText = TEXT("Tooltip string"); 
    GetClientRect(hparent, &ti.rect); 

    if (!SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM)&ti)) 
     MessageBox(0,TEXT("Failed: TTM_ADDTOOL"),0,0); 
} 

Вы должны убедиться, что манифест верен. Если это не так, вы можете столкнуться с проблемой здесь и во многих других местах.


Это старый ответ: (! Не рекомендуется)

Если проявляется не так, вы должны дать установить правильное значение TTOOLINFO::sbSize в моем случае случается TTTOOLINFOW_V2_SIZE

#include <windows.h> 
#include <commctrl.h> 

#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 
#pragma comment(lib, "comctl32.lib") 

HINSTANCE g_hinst; 

void CreateMyTooltip(HWND hparent) 
{ 
    HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, 
     WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 0, 0, 0, 0, hparent, NULL, g_hinst, NULL); 

    TTTOOLINFO ti = { 0 }; 

    //ti.cbSize = sizeof(TTTOOLINFO); 
    //********************************************************* 
    // Specific settings for specific compiler options (Unicode/VC2013) 
    //********************************************************* 
    ti.cbSize = TTTOOLINFOW_V2_SIZE; 

    ti.uFlags = TTF_SUBCLASS; 
    ti.hwnd = hparent; 
    ti.lpszText = TEXT("Tooltip string"); 
    GetClientRect(hparent, &ti.rect); 

    if (!SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM)&ti)) 
     MessageBox(0,TEXT("Failed: TTM_ADDTOOL"),0,0); 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_CREATE: 
     CreateMyTooltip(hwnd); 
     break; 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

    default: 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    g_hinst = hInstance; 

    WNDCLASS wc = { 0 }; 
    wc.lpszClassName = TEXT("TooltipTest"); 
    wc.hInstance = hInstance; 
    wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); 
    wc.lpfnWndProc = WndProc; 
    wc.hCursor = LoadCursor(0, IDC_ARROW); 
    RegisterClass(&wc); 

    CreateWindow(wc.lpszClassName, TEXT("Tooltip"), WS_OVERLAPPEDWINDOW|WS_VISIBLE, 
     100, 100, 200, 150, 0, 0, g_hinst, 0); 

    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return (int)msg.wParam; 
} 
+0

Hi Shemirani, у меня есть вопрос: могу ли я контролировать появление и возможность всплывающей подсказки? –

+0

@trantuan Я обновил свой ответ. Попробуйте исправить свой манифест, а затем повторите попытку с помощью только 'ti.cbSize = sizeof (TTTOOLINFO); верный путь. Забудьте о более раннем ответе, который я дал, невозможно отслеживать эти вещи вручную. Если он исправляет вашу проблему, пожалуйста, примите ответ, нажмите галочку, чтобы закрыть, довести это до конца. Затем вы можете задать новый вопрос. –

+0

спасибо Shemirani! –

Смежные вопросы