2017-08-18 17 views
1

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から継承します。次の文は、ツールバークラスのコンストラクタを呼び出して作成します。このコードでは、これは私はグラフィックス出力として得るものです:あなたがホバーで見ることができるように

enter image description here

、最後の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); 
} 
+0

'nActualButtons'はseparartorを数えません。したがって、 'toolbar'コンストラクタに渡す戻り値を使用している場合、コンストラクタのループは最後のアイテムを処理する前に終了します –

+0

@JimRhodes' nActualButtons'からの戻り値を 'ツールバーのコンストラクタです。私は配列のサイズを渡しています( 'sizeof tbb/sizeof * tbb')。実際には、コード内のどこにでも 'nActualButtons'を使用していません、idkなぜ私はそれを投稿しました –

+0

2つの区切り文字がある場合、最後の2つの画像は表示されませんか?上の関数を実際に呼び出すコードを追加できますか? – pingul

答えて

0

私はあなたの問題はこれでかもしれないと思う:

sep { }, 

あなたは、本質的に、このやっている:

sep {0, 0, 0, 0} 

をしたがって、区切り文字にはTBSTYLE_SEPが設定されません。おそらく、次のようにセパレータを初期化してください。

sep {0, 0, 0, TBSTYLE_SEP} 
+0

私のセパレータクラスは 'toolbarBtn'クラスを継承し、コンストラクタは' toolbar': 'sep():toolbarBtn(0、icon {}、TBSTATE_ENABLED、TBSTYLE_SEP){}'のコンストラクタを呼び出します。 –

関連する問題