Здравствуйте! Я не могу понять, как наладить взаимодействие tooltip и combobo-а, а именно, выводить пояснения tooltip над строками из списка combabox-а. Не знаю, как внутри toolbar-а это дело реализовано, если установлен стиль TBSTYLE_TOOLTIPS, но хочется что-то подобное реализовать и для строк combabox-а. Пока получается вывести пояснение только для combobox и то, только, если явно задать строку при регистрации элемента для tooltip-а. Но как для строк это делать, не ясно. Процедуру combabox-а я подменил, как рекомендуют, для отслеживания сообщений мыши. И что дальше происходит, после того как combobox получил сообщение от мыши, если я правильно понимаю, отправляем его в tooltip, а tooltip отправляет родителю сообщение TTN_NEEDTEXT или не так? Короче говоря лучше покажу, как я предоставляю информацию tooltip-у... Код (C++): hTtip = CreateWindowEx(0L, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hwnd, (HMENU)NULL, hInstance, NULL); //Для окна самого combobox-а //hwnd - в данном случае дескриптор окна на котором я расположил //combobox(решил, возможно, так будет легче разобраться и создал cobobox на основном окне, пока //не на tool bar-е). TTTOOLINFO ti = {0}; ti.cbSize = sizeof(TTTOOLINFO); ti.uFlags = TTF_CENTERTIP | TTF_IDISHWND | TTF_SUBCLASS; ti.hwnd = hwnd; ti.uId = hCombo; // ti.hInst = hInstance; //Здесь установил NULL ti.lpszText = LPSTR_TEXTCALLBACK; //Здесь задал явно строку, а иначе никак не получалось хоть что-то внятное отобразить. SendMessage(hTtip, TTM_ADDTOOL, 0, (LPARAM)&ti); //Далее делаю тоже самое, но для редактора combobox-а. HWND hEdit = GetWindow(hCombo, GW_CHILD); ZeroMemory(&ti, sizeof(TTTOOLINFO)); ti.cbSize = sizeof(TTTOOLINFO); ti.uFlags = TTF_CENTERTIP | TTF_IDISHWND | TTF_SUBCLASS; ti.hwnd = hwnd; ti.uId = hEdit; ti.hInst = hInstance; ti.lpszText = LPSTR_TEXTCALLBACK; SendMessage(hTtip, TTM_ADDTOOL, 0, (LPARAM)&ti); //Строки расположены в редакторе combobox-а и вот тут возникает вопрос, а как tooltip //настроить на них на строки... Есть хоть какие-нибудь идеи на этот счёт? Может быть, нужно вычислить координаты для каждой строки combobox-а и настраивать tooltip для каждой строки как-то так: Код (C++): ZeroMemory(&ti, sizeof(TTTOOLINFO)); ti.cbSize = sizeof(TTTOOLINFO); ti.uFlags = TTF_CENTERTIP | TTF_SUBCLASS; ti.hwnd = hwnd; ti.uId = IDT_STRING1; ti.hInst = hInstance; ti.lpszText = LPSTR_TEXTCALLBACK; //тогда здесь нужно задать явно строку или нет. ti.cRect = rcRectForString1; //Каким-то образом вычисленные координаты для строки. //..... SendMessage(hTtip, TTM_ADDTOOL, 0, (LPARAM)&ti);
Я делаю так Код (C): HWND CreateToolTip(HWND hDlg, int nIDButton, int nIDText, PTCH pszText) { int cchBuffer = 0; cchBuffer = LoadString(g_hInstance, nIDText, pszText, 0); LoadString(g_hInstance, nIDText, pszText, cchBuffer + 1); HWND hWndTool = nullptr, hWndTip = nullptr; hWndTool = GetDlgItem(hDlg, nIDButton); TOOLINFO ToolInfo = { sizeof(TOOLINFO) }; ToolInfo.hwnd = hDlg; ToolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS; ToolInfo.uId = (SIZE_T)hWndTool; ToolInfo.lpszText = pszText; hWndTip = CreateWindow(TOOLTIPS_CLASS, 0, WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hDlg, 0, g_hInstance, 0); SendMessage(hWndTip, TTM_ADDTOOL, 0, (LPARAM)&ToolInfo); SendMessage(hWndTip, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX); // SHRT_MAX UCHAR_MAX SendMessage(hWndTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, SHRT_MAX); SendMessage(hWndTip, TTM_SETDELAYTIME, TTDT_INITIAL, 200); SendMessage(hWndTip, TTM_SETDELAYTIME, TTDT_RESHOW, 200); return hWndTip; } Затем в коде передаю в эту функцию дескриптор окна (диалога), идентификатор привязанного к этому окну контрола, и номер строки из ресурсов Код (C): TCHAR strBuffer[MAX_PATH] = { 0 }; CreateToolTip(hDlg, 4024, 10039, strBuffer);
Ничего что я спрашивал не про кнопку, а про строки в combobox-е, строки, которые находятся в выпадающем списке combobox-а, а это несколько другая последовательность действий.
Нет. На киберфоруме я был с 2011 года, потом возник конфликт с несколькими новенькими пользователями (предполагаю это был один и тот же человек, который ранее периодически производил на меня нападки (в силу своей тупости и зависти), но был заблокирован). Администрация форума встала на их сторону. После этого я там больше не появляюсь.