TTN_GETDISPINFO not send

Started by czerny, April 29, 2013, 03:17:47 PM

Previous topic - Next topic

czerny

Hallo,

this is a problem I am searching the error for hours now. It would be nice, if anyone could help!

I have a simple toolbar, composed of the standard bitmap (IDB_STD_LARGE_COLOR) with 15 Buttons and an own bitmap with 5 Buttons (120x24). I use 5 Buttons from the former bitmap, 3 separators and my 5 Buttons.

The toolbar is working ok. There is only one error: the tooltip from the very first button is not working. There is no TTN_GETDISPINFO notification send for this Button. All other Buttons have their tooltips.

A strange observation: If I use one more button as defined (and with luck the program is not crashing) all works ok????
Maybe this could be a hint .

#include "windows.h"
#include "res.h"

#define NUMBUTTONS 13

HWND CreateMyToolbar(HWND hparent)
{
int i;

TBBUTTON tbb[NUMBUTTONS] = {0};
        TBADDBITMAP tbab;

HWND hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS, 0, 0, 0, 0,
        hparent, (HMENU)IDC_MAIN_TOOL, GetModuleHandle(NULL), NULL);

SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

tbab.hInst = HINST_COMMCTRL;
    tbab.nID = IDB_STD_LARGE_COLOR;
    SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);

tbab.hInst = NULL;
    tbab.nID = (UINT_PTR)LoadImage(GetModuleHandle(NULL),
                                MAKEINTRESOURCE(ID_BMPOWN),
                                IMAGE_BITMAP, 0, 0,
                                LR_DEFAULTSIZE | LR_DEFAULTCOLOR | LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
    int own = SendMessage(hTool, TB_ADDBITMAP, 5, (LPARAM)&tbab);

  i=0;
tbb[i].iBitmap = STD_FILENEW; // 0
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_FILE_NEW;

i++;
    tbb[i].iBitmap = STD_FILEOPEN; // 1
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_FILE_OPEN;

i++;
    tbb[i].iBitmap = STD_FILESAVE; // 2
    tbb[i].fsState = 0; //TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_FILE_SAVE;
   
i++;
tbb[i].fsState = TBSTATE_ENABLED; // 3
    tbb[i].fsStyle = TBSTYLE_SEP;

i++;
    tbb[i].iBitmap = own; // 4
    tbb[i].fsState = 0; //TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_METHODE_RUN;

i++;
    tbb[i].iBitmap = own + 1; // 5
    tbb[i].fsState = 0; //TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_METHODE_STOP;

i++;
tbb[i].fsState = TBSTATE_ENABLED; // 6
    tbb[i].fsStyle = TBSTYLE_SEP;

i++;
    tbb[i].iBitmap = own + 2; // 7
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_DATEN_FILTER;

i++;
    tbb[i].iBitmap = own + 3; // 8
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_DATEN_FILTERRAD;

i++;
    tbb[i].iBitmap = own + 4; // 9
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_DATEN_FILTERSEQ;

i++;
tbb[i].fsState = TBSTATE_ENABLED; // 10
    tbb[i].fsStyle = TBSTYLE_SEP;

i++;
    tbb[i].iBitmap = STD_PROPERTIES; // 11
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_FILE_NEW;

i++;
    tbb[i].iBitmap = STD_HELP; // 12
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_HELP_LUMINA;
/*
i++;
    tbb[i].iBitmap = STD_HELP; // 13 (an illegal 14. button)
    tbb[i].fsState = TBSTATE_ENABLED;
    tbb[i].fsStyle = TBSTYLE_BUTTON;
    tbb[i].idCommand = IDM_HELP_LUMINA;
*/
    SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
   
return hTool;
}


I must have done a silly mistake.

czerny

jj2007


TimoVJL

May the source be with you

jj2007

It has nothing to do with your IDs. Tooltips don't send the ANSI notification, that's all.
Try something along these lines... and yes, I know it's assembler and this is a C forum.

  .if uMsg==WM_NOTIFY
      .if [ecx.NMHDR.code]==TTN_GETDISPINFOW
            lea edi, lvh
            invoke GetCursorPos, edi
            invoke ScreenToClient, hList, edi
            movi [edi.LV_HITTESTINFO.flags], LVHT_ONITEM
            invoke SendMessage, hList, LVM_HITTEST, 0, edi

czerny

Quote from: timovjl on April 29, 2013, 06:15:58 PM
Dublicated id IDM_FILE_NEW ?
Timovjl, you are my hero!!!

The most stupid errors take the most time. :'(

Thank you jj2007, for your time.

jj2007

Quote from: czerny on April 29, 2013, 09:00:40 PM
Thank you jj2007, for your time.

Some time ago I wasted a lot of time chasing a problem with TTN_GETDISPINFO, and it turned out the control sent the Unicode version, but here I was obviously on the wrong track.

czerny

#6
Quote from: jj2007 on April 30, 2013, 01:20:23 PM
Some time ago I wasted a lot of time chasing a problem with TTN_GETDISPINFO, and it turned out the control sent the Unicode version, but here I was obviously on the wrong track.
My tooltips are string resources. I have tried to save the resource file as unicode file. There are non-ascii chars in the strings. But all is working with TTN_GETDISPINFO, ansi or unicode. Have you provided the strings directly?
What are your experiences? Are there at all drawbacks to save the rc file in unicode?

jj2007

Quote from: czerny on April 30, 2013, 02:40:06 PMHave you provided the strings directly?
What are your experiences? Are there at all drawbacks to save the rc file in unicode?

No drawbacks met so far. Attached is a sample app, the exe shows tooltips in several languages. Open the *.asc in Wordpad and scroll to the end to see how the rc file is structured. Search for SetLanguage and/or ToolTips to see relevant code.

TimoVJL

#8
Another example to use multilanguage menu/tooltips from resource with this function:
void SetLang(HWND hwnd, LANGID lid)
{
typedef LANGID (WINAPI *fnSetThreadUILanguage) (LANGID wReserved);
HMENU hMenu;
if ((GetVersion() & 0x00FF) > 5) // Vista =>
{
fnSetThreadUILanguage fnPtr = (fnSetThreadUILanguage)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetThreadUILanguage");
if (fnPtr)
(*fnPtr) (lid);
} else
SetThreadLocale(MAKELCID(lid, SORT_DEFAULT));
hMenu = GetMenu(hwnd);
SetMenu(hwnd, NULL);
DestroyMenu(hMenu);
hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(2001));
SetMenu(hwnd, hMenu);
}
EDIT: Fix for WinXP and Win8 ???
May the source be with you

czerny

Quote from: jj2007 on April 30, 2013, 04:27:06 PM
No drawbacks met so far. Attached is a sample app, the exe shows tooltips in several languages. Open the *.asc in Wordpad and scroll to the end to see how the rc file is structured. Search for SetLanguage and/or ToolTips to see relevant code.
The tooltips are working in english, russian and arabic, not in chinese (but thats a missing font). The label and editbox texts are only working in english.

czerny

Quote from: timovjl on April 30, 2013, 06:56:57 PM
Another example to use multilanguage menu/tooltips from resource with this function:
Are there any non ascii characters in suomi?

jj2007

Quote from: timovjl on April 30, 2013, 06:56:57 PM
Another example...

Seems not to work, I see English only, and "Finnish" gets never checked. Win XP SP3...

jj2007

Quote from: czerny on April 30, 2013, 08:18:24 PMThe label and editbox texts are only working in english.
Clicking "Pushme" or "Sayhi" shows something in the editbox. The rest is not implemented.

czerny

Quote from: jj2007 on April 30, 2013, 10:58:50 PM
Quote from: timovjl on April 30, 2013, 06:56:57 PM
Another example...
Seems not to work, I see English only, and "Finnish" gets never checked. Win XP SP3...
No problem with good old win2k! ;D

czerny

#14
Quote from: jj2007 on May 01, 2013, 06:01:13 AM
Quote from: czerny on April 30, 2013, 08:18:24 PMThe label and editbox texts are only working in english.
Clicking "Pushme" or "Sayhi" shows something in the editbox. The rest is not implemented.
Yes, but what it shows are black lines in all languages but english. See picture for russian.

I have installed simsun.ttf and wordpad shows now the chinese chars while your application shows still strings of undef chars.