1

win32 API でツールバーを作成する詳細を非表示にする単純なクラスを作成しましたが、生成されるツールバーが気に入りません。(明確にするために画像を参照してください。私は評判ポイントを持っていないので、リンクを投稿しました)

http://i35.tinypic.com/1zmfeip.jpg

黒い背景がアプリケーションに入ってきていることはわかりません。
ファイル CToolBar.h のクラス宣言は次のとおりです。

#ifndef _CTOOLBAR_H
#define _CTOOLBAR_H

#include<windows.h>
#include<commctrl.h>

class CToolBar
{
public:
       CToolBar();//constructor
       ~CToolBar();//destructor

       void AddButton(int iconID, int command);//add Both a button, its icon and its command ID
       void Show();//display the toolbar
       void Initialise(HINSTANCE hInst, HWND hParent);
protected:
          HINSTANCE m_hInst;
          HWND m_hParent;
          HWND m_hToolBar;
          HIMAGELIST m_hImageList;
          TBBUTTON m_Tbb[4];  //toolbar buttons
          int m_numberButtons;     
};
#endif

ファイル CToolBar.cpp の実装は次のとおりです。

//CToolBar.cpp
#include "CToolBar.h"
#include<windows.h>
#include<commctrl.h>

CToolBar::CToolBar()//the constructor
{
    m_hImageList=ImageList_Create(32, 32, ILC_COLOR32, 0, 15);//returns NULL if the function fails
   //finish other initialisations
   InitCommonControls();//initialise commctrl.dll whatever.. or else your toolbar wont appear
  }

void CToolBar::Initialise(HINSTANCE hInst, HWND hParent)
{
  m_hInst=hInst;
  m_hParent=hParent; 

  m_hToolBar=CreateWindowEx(
                WS_EX_PALETTEWINDOW ,
                TOOLBARCLASSNAME,
                "",
                WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |WS_VISIBLE|TBSTYLE_BUTTON | TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE | CCS_TOP ,
                0, 0,
                0, 0,
                m_hParent,
       NULL,
                m_hInst,
                0);
}

CToolBar::~CToolBar()//destructor
{
 ImageList_Destroy(m_hImageList);
}

void CToolBar::AddButton(int iconID, int command)
{
     HICON hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(iconID));
     ImageList_AddIcon(m_hImageList, hIcon);
     DeleteObject(hIcon); 

if(iconID!= -1)//-1 means the separator. The rest are mere buttons
{     
     m_Tbb[m_numberButtons].iBitmap =m_numberButtons;
     m_Tbb[m_numberButtons].idCommand = command;
     m_Tbb[m_numberButtons].fsState = TBSTATE_ENABLED;
     m_Tbb[m_numberButtons].fsStyle = TBSTYLE_BUTTON; 
     m_Tbb[m_numberButtons].dwData = 0; 
     m_Tbb[m_numberButtons].iString = 0;
}
else//ie if (iconID== -1) ; then display the separator. the command value is ignored
{
     m_Tbb[m_numberButtons].iBitmap =-1;
     m_Tbb[m_numberButtons].idCommand = 0;
     m_Tbb[m_numberButtons].fsState = TBSTATE_ENABLED;
     m_Tbb[m_numberButtons].fsStyle = TBSTYLE_SEP; 
     m_Tbb[m_numberButtons].dwData = 0; 
     m_Tbb[m_numberButtons].iString = 0;

}     

     m_numberButtons++;

}

void CToolBar::Show()
{  
SendMessage(m_hToolBar, TB_SETIMAGELIST , (WPARAM)0, (LPARAM)m_hImageList);
SendMessage(m_hToolBar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);//message for backward 
//compatibility
SendMessage(m_hToolBar, TB_ADDBUTTONS, m_numberButtons, (LPARAM)m_Tbb);   
SendMessage(m_hToolBar,WM_SIZE,0,0);

ShowWindow(m_hToolBar, SW_SHOW);
}

main.cpp でクラスをどのように使用したか、クラスのグローバル インスタンスを作成しました。

CToolBar myToolBar; 

WM_CREATE の下のコールバック プロシージャで、いくつかのメンバー関数を使用しました。

case WM_CREATE:
     myToolBar.Initialise(g_hInst,hwnd);
     myToolBar.AddButton(IDI_OPEN, ID_OPEN);
     myToolBar.AddButton(IDI_MAIN,ID_OPEN);//Separator button
     myToolBar.AddButton(IDI_CLOSE, ID_CLOSE);
     myToolBar.AddButton(IDI_CLOSEALL, ID_CLOSE);
     myToolBar.Show();
     break;

それはそれについてです。

4

2 に答える 2

1

透明度チャネルでビットマップを使用しているようです。GDI はアルファ チャネルをサポートしていません。透明になる特殊な色を使用しています。32 ビット ビットマップをサポートする場合は、GDI+ を使用してそのようなビットマップを描画できます。もう 1 つのオプションは、アルファ透過性を備えたビットマップを既にサポートしているCAplhaToolbarを使用することです。

于 2009-11-02T05:37:47.550 に答える
1

の flags パラメータも変更しImageList_Createて含めILC_MASKてみてください

于 2009-11-02T05:47:57.297 に答える