- ベストアンサー
最後のボタンだけツールチップが表示されない
VC++2005でツールバーにボタンを8個つくり、そこにツールチップを表示させたのですが、最後のボタンだけ文字列でなく『0/?』と表示されてしまいます。 順番を入れ変えれば、普通に表示されるのですが、8番目のボタンは、やはり『0/?』と表示されてしまいます。 ストリングテーブルか、TBBUTTON構造体の、サイズが足りないのかと思い、色々試したのですがうまく行きません。 参考にしているのは、『猫でも…66章』で、ストリングテーブルは、BCC developerで作ってます。 詳しい方、アドバイスをお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★気になったことを1つ。 ・MyCreateToolWnd() 関数の最後の部分にある >for(id = 0; id <= 8; id++){ ↑ この行。 これは 0 ~ 8 の 9回ループしますよ。⇒9個分 もし 8 個分なら (1)for(id = 0; id < 8; id++){ (2)for(id = 1; id <= 8; id++){ のどちらかにします。 TBBUTTON 構造体の tbb[] 配列を tbb[id] と参照しているので(1)が正しい記述でしょう。 ・回答No.1の >配列と同じように 0 番から指定しますので。 ↑ これの意味に気づいて欲しかった。 for文の条件式にある <= と < に注意しましょう。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★ソースコードを見ないと分かりません。 ・とりあえず TBBUTTON 構造体を9個にして再コンパイルして下さい。 これで8番目が正常に表示されれば指定方法が間違っていることになります。 配列と同じように 0 番から指定しますので。
お礼
//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { //int id; static HWND hToolWnd; // INITCOMMONCONTROLSEX cc; switch (msg){ case WM_CREATE: hToolWnd = MyCreateToolWnd(hWnd); break; case WM_SIZE: //ツールバーのサイズ変更 SendMessage(hToolWnd, WM_SIZE, wp, lp); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //ツールバーを作る HWND MyCreateToolWnd(HWND hWnd) { HWND hTool; HWND hToolTip; static TOOLINFO ti; static int id; static int stdid; //TBADDBITMAP tbab; InitCommonControls(); hTool = CreateToolbarEx( hWnd, WS_CHILD | WS_VISIBLE, ID_MYTOOLBAR, 9, (HINSTANCE)HINST_COMMCTRL, IDB_STD_LARGE_COLOR, (LPCTBBUTTON)tbb, 9, 0, 0, 0, 0, sizeof(TBBUTTON)); //ツールチップを作る hToolTip = CreateWindowEx( 0, TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL); ti.cbSize = sizeof(TOOLINFO); ti.hwnd = hTool; ti.hinst = hInst; ti.uFlags = TTF_SUBCLASS; for(id = 0; id <= 8; id++){ SendMessage(hTool, TB_GETITEMRECT, id, (LPARAM)&ti.rect); ti.uId = tbb[id]. idCommand; ti.lpszText = (LPTSTR)tbb[id].idCommand; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti); } SendMessage(hTool, TB_SETTOOLTIPS, (WPARAM)hToolTip, 0); return hTool; } これから、もう一度 8個に戻してテストしてみます。
補足
いつもアドバイスしていただき有難うございます。 ご指摘のように、TBBUTTON構造体を9個にしてコンパイルしたら、9個すべてにツールチップが表示されました。(HELPを追加しました) 不思議です。 以下がソースコードです、気が付いた点がありました、らお手数でもご指摘をお願いします。 //#define STRICT; #define ID_MYTOOLBAR 1000 #include <windows.h> #include <commctrl.h> #include "Restoolbar.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); HWND MyCreateToolWnd(HWND); HINSTANCE hInst; TCHAR szClassName[] = TEXT("toolbar02"); TBBUTTON tbb[] = { {STD_PASTE, IDS_PASTE, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_FILENEW, IDS_NEW, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_FILEOPEN, IDS_OPEN, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_FILESAVE, IDS_SAVE, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_DELETE, IDS_DELETE, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_REDOW, IDS_REDOW, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_CUT, IDS_CUT, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_COPY, IDS_COPY, TBSTATE_ENABLED, BTNS_BUTTON}, {STD_HELP, IDS_HELP, TBSTATE_ENABLED, BTNS_BUTTON} }; int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; if(!hPrevInst){ if(!InitApp(hCurInst)) return FALSE; } hInst = hCurInst; if(!InitInstance(hCurInst, nCmdShow)){ return FALSE; } while (GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = NULL; wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = (LPCTSTR)szClassName; //(LPCSTR) wc.hIconSm = NULL; return (RegisterClassEx(&wc)); } BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName,TEXT("TOOLBAR"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
お礼
ご指摘有難うございます。 前回の補足の後で、もう一度8個にしてコンパイルしてみました。 結果は駄目でしたが、その後に >配列と同じように 0 番から指定しますので。 の意味が分かり、for(id = 0; id <= 7; id++) として、コンパイルしてみました。 結果は、成功しました。でも今回のアドバイスにあるように、 >(1)for(id = 0; id < 8; id++){ のように記述するのが正しいですね。 適切なアドバイス、有難うございます。 (まだまだ勉強不足ですね)