c++ - 我正在尝试创建类来封装工具栏,但背景变黑了。由 C++ win32api

标签 c++ api winapi toolbars

我创建了一个简单的类来隐藏在 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;

就是这样。

最佳答案

尝试修改 ImageList_Create 的标志参数以包含 ILC_MASK

关于c++ - 我正在尝试创建类来封装工具栏,但背景变黑了。由 C++ win32api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1659547/

相关文章:

c++ - 将 qsort 与比较器功能一起使用

c++ - Qt - 当值发生变化时,QSpinBox 上的每个失去焦点是否都有信号?

c++ - 命名空间.GetItemFromId 异常

python - 如何以编程方式在 Photoshop 中添加填充层

php - 使用 Bing.com 和 Bing Search API 的不同结果

c++ - 如何同步一个弹出窗口总是在另一个弹出窗口之上?

无法从 LPT1 获取端口句柄

C++/Qt 从 qt//Edited 中的另一个类访问 ui 的正确方法

javascript - onBlur触发的多个表单字段如何使用JS fetch api系统替换jQuery AJAX系统?

c++ - 将 SetSysColor 限制为一个应用程序