Win32ツールバーをラッピングしています。ラッパークラスのユーザーが区切り記号を追加するたびに、最後のツールバーアイテムのアイコンが表示されないことを除いて、すべてが機能します。ツールバーの最終的なアイコンが表示されない
は、このクライアントコードを考えてみましょう:
toolbarBtn tbb[] = { toolbarBtn { ID_FILE_NEW, IDI_NEW },
toolbarBtn { ID_FILE_OPEN, IDI_OPEN },
sep { },
toolbarBtn { ID_FILE_SAVEAS, IDI_SAVE },
toolbarBtn { ID_FILE_PRINT, IDI_PRINT },
sep { },
toolbarBtn { ID_EDIT_UNDO, IDI_UNDO },
toolbarBtn { ID_EDIT_REDO, IDI_REDO } };
this->tb = toolbar { *this, tbb, sizeof tbb/sizeof *tbb };
toolbarBtn
オブジェクトは、ツールバーのボタンを表します。 sep
オブジェクトはセパレータであり、クラスtoolbarBtn
から継承します。次の文は、ツールバークラスのコンストラクタを呼び出して作成します。このコードでは、これは私はグラフィックス出力として得るものです:あなたがホバーで見ることができるように
、最後の2つのボタンが存在します!しかし、理由アイコンは表示されず、アイコンの順序も変更されます。 「新規」、「開く」、「セパレーター」、「保存」、「印刷」、「セパレーター」、「取り消し」、および「やり直し」でなければなりません。しかし、 "名前を付けて保存"と "やり直し"は表示されません。私はtoolbarBtn
のシーケンスを入れることができるので、アイコン自体は問題ではないことを知っていますが、sep
オブジェクトがある限り、最後のアイコンは決して表示されません。ここで
は、関連する関数/メソッドの実装です:
toolbarBtn::toolbarBtn(int id, icon ico, BYTE state, BYTE style)
{
ZeroMemory(this, sizeof *this);
this->ico = ico;
this->tbb.idCommand = id;
this->tbb.fsState = state;
this->tbb.fsStyle = style;
this->tbb.iBitmap = 0; // field will be changed by toolbar c'tor
}
// count # of buttons; no separators counted
size_t nActualButtons(const toolbarBtn btns[], size_t n)
{
size_t n1 = n;
for (size_t i = 0; i < n; ++i)
if (btns[i].getTBB().fsStyle & TBSTYLE_SEP)
--n1;
return n1;
}
toolbar::toolbar(overlappedwindow parent, const toolbarBtn btns[], size_t n,
int id)
{
this->hwnd = CreateWindow(TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT, 0, 0, 0, 0,
parent.gethwnd(), (HMENU) id, GetModuleHandle(NULL), NULL);
if (this->hwnd == NULL)
message(L"%s: %s", __FUNCTIONW__, geterror());
// Send the TB_BUTTONSTRUCTSIZE message, which is required for
// backward compatibility.
SendMessage(this->hwnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
HIMAGELIST imglist = ImageList_Create(16, 16, ILC_COLOR32, n, 0);
if (!imglist)
message(L"%s: %s", __FUNCTIONW__, geterror());
for (size_t i = 0; i < n; ++i) {
if (btns[i].getTBB().fsStyle & TBSTYLE_SEP)
continue; // dont add separators to image list
if (ImageList_AddIcon(imglist, btns[i].getIcon().gethandle()) == -1)
message(L"%s: %s", __FUNCTIONW__, geterror());
}
SendMessage(this->hwnd, TB_SETIMAGELIST, (WPARAM) 0, (LPARAM) imglist);
TBBUTTON *tbb = (TBBUTTON *) calloc(n, sizeof (TBBUTTON));
for (size_t i = 0; i < n; ++i) {
tbb[i] = btns[i].getTBB();
tbb[i].iBitmap = (tbb[i].fsStyle & TBSTYLE_SEP) ? 0 : i;
if (tbb[i].fsStyle & TBSTYLE_SEP)
tbb[i].idCommand = 0;
}
SendMessage(this->hwnd, TB_ADDBUTTONS, n, (LPARAM) tbb);
free(tbb);
}
'nActualButtons'はseparartorを数えません。したがって、 'toolbar'コンストラクタに渡す戻り値を使用している場合、コンストラクタのループは最後のアイテムを処理する前に終了します –
@JimRhodes' nActualButtons'からの戻り値を 'ツールバーのコンストラクタです。私は配列のサイズを渡しています( 'sizeof tbb/sizeof * tbb')。実際には、コード内のどこにでも 'nActualButtons'を使用していません、idkなぜ私はそれを投稿しました –
2つの区切り文字がある場合、最後の2つの画像は表示されませんか?上の関数を実際に呼び出すコードを追加できますか? – pingul