いつもお世話になっています。よろしくお願いします。
色々調べて、自分なりに改良したのですが、原因がつかめません。
アドバイス、ヒントをお願いします。
ツールバーの『windows標準のボタン』に、『文字を付ける』部分で躓いています。
//ツールバー作成関数
HWND MyCreateToolbar(HWND hWnd)
{
HINSTANCE hInst;
HWND hTool;
TBADDBITMAP tb;
int stdid;
hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
hTool = CreateToolbarEx(
hWnd,
WS_CHILD | WS_VISIBLE,
ID_TOOLBAR, // コントロールID
0,
hInst,
NULL,
tbb,
0,
0,
0,
0,
0,
sizeof(TBBUTTON));
tb.hInst = HINST_COMMCTRL;
tb.nID = IDB_STD_SMALL_COLOR;
stdid = SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb);
tbb[0].iBitmap += stdid;
tbb[1].iBitmap += stdid;
tbb[2].iBitmap += stdid;
SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb[0]);
tb.hInst = HINST_COMMCTRL;
tb.nID = IDB_VIEW_SMALL_COLOR;
stdid = SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb);
tbb[3].iBitmap += stdid;
SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)1, (LPARAM)&tbb[3]);
}
//ここでくくると、『ボタンに文字を付ける関数』が機能しない
//『}』 を、『ボタンに文字を付ける関数』の最後につけると、文字が表示されるが、エラーが出る。
//エラー E2108 c:\ツールバー\toolbar\toolbar.cpp 201: typedef 'HWND' の使い方が間違っている(関数 MyCreateToolbar(HWND__ *) )
エラー E2379 c:\ツールバー\toolbar\toolbar.cpp 201: ステートメントにセミコロン(;)がない(関数 MyCreateToolbar(HWND__ *) )
*** 2 errors in Compile ***
/ボタンに文字を付ける関数
HWND MyCreateToolbar(HWND hWnd);
//;セミコロンをつけないと
//HWNDの使い方が間違っている ステートメントにセミコロンが無い の エラー
{
HINSTANCE hInst;
HWND hTool;
TCHAR szBuf[16];
int iNEW;
int iOPEN;
int iPARENT;
int iDELETE;
TBADDBITMAP tbab;
InitCommonControls();
hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
hTool = CreateWindow(TOOLBARCLASSNAME,
NULL, WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hWnd,
(HMENU)ID_TOOLBAR, hInst, NULL);
SendMessage(hTool, TB_BUTTONSTRUCTSIZE,
(WPARAM)sizeof(TBBUTTON), 0);
tbab.hInst = HINST_COMMCTRL; //既成はCOMMCTRL 自作ビットマップはNULL
tbab.nID = IDB_STD_SMALL_COLOR; ID_TOOLBAR;
SendMessage(hTool, TB_ADDBITMAP, (WPARAM)0, (LPARAM)&tbab);
LoadString (hInst, IDS_NEW, szBuf, (TCHAR)sizeof(szBuf));
iNEW = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf);
tbb[0].iString = iNEW;
LoadString (hInst, IDS_OPEN, szBuf, (TCHAR)sizeof(szBuf));
iOPEN = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf);
tbb[1].iString = iOPEN;
LoadString (hInst, IDS_DELETE, szBuf, (TCHAR)sizeof(szBuf));
iDELETE = SendMessage(hTool, TB_ADDSTRING,0, (LPARAM)szBuf);
tbb[2].iString = iDELETE;
LoadString (hInst, IDS_PARENT, szBuf, (TCHAR)sizeof(szBuf));
iDELETE = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf);
tbb[3].iString = iPARENT;
SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)3,
(LPARAM)(LPTBBUTTON)&tbb[0]);
return hTool;
}
}
ツールバー作成関数を 『}』で閉じると 文字を付ける関数が機能せず、標準のボタンが4つ表示されます。
『}』 を『文字を付けるをつける関数』の最後に付けると文字が表示されるが、『ツールバー作成関数』の所で閉じていないので、エラーが出ます。
『}』 を『文字を付けるをつける関数』の最後に付けると
ボタン二つ分の大きさの『文字だけのボタンが最初に表示されたボタン4つを隠して3種類だけ表示されます。(新規作成、開く、削除)
このとき、新規作成などの文字の上の部分をクリックすると、隠れていたボタンが出てきます。
その出てきたボタンもクリックできます。文字をクリックすると、ボタンは、隠れてしまいます。
VC++で『文字を付けるをつける関数』は、エラー、警告が出て作れません。
お礼
アドバイス有難うございます。 御礼が遅れてすみません。 ご指摘のとおり、 >「2番目のは、MyCreateToolbarのプロトタイプ宣言」の形を不思議に思っていました。 >「最初の方」だけが機能する。つまり「ボタンに文字を付ける関数」が機能しない。 も感じてはいたのですが、どのように処理をして良いのかわかりませんでした、(経験不足ですね。)でも、 >「完全に同じ名前の関数を2つ定義している」 の指摘で、間違いに気づきました。(一つに纏めれば良い) 今は、『ボタンも4つ表示され、その下に文字も表示されるようになりました』 ただ、『文字が全て、一種類』なのが残念ですが、これは、何とかなりそうです。