2009-11-02 3 views
1

win32 API에서 툴바를 만드는 것에 대한 세부 사항을 숨기기위한 간단한 클래스를 만들었지 만, 생성하는 툴바가 마음에 들지 않습니다. (설명을위한 이미지를 참조하십시오. 난 그냥 링크를 게시, 그래서 나는 명성 포인트가없는)도구 모음을 캡슐화하기 위해 클래스를 만들려고하지만 배경이 검은 색이됩니다. C++ win32api

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

지금은 검은 배경 내 응용 프로그램으로 오는 아무 생각이 없습니다. 여기
여기

#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 
#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); 
} 

CToolBar.cpp 파일의 구현입니다 CToolBar.h 파일의 클래스 선언입니다
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; 

그게 전부입니다.

답변

1

시도 ILC_MASK뿐만 아니라

+0

네를 포함 ImageList_Create의 플래그 매개 변수를 수정! 그것은 모든 문제를 해결했습니다. 감사합니다 ... –

+0

원하는 경우 이미지보기 ... http://i33.tinypic.com/xwrv6.jpg –

+0

정확한 답을 표시 할 수 있습니까? –

1

투명도 채널로 비트 맵을 사용하는 것처럼 보입니다. GDI는 알파 채널을 지원하지 않습니다. 그것은 투명하게 될 특별한 색을 사용합니다. 32 비트 비트 맵을 지원하려면 이러한 비트 맵을 그리기 위해 GDI +를 사용할 수 있습니다. 또 다른 옵션은 이미 알파 투명성이있는 비트 맵을 지원하는 CAplhaToolbar을 사용하는 것입니다.

관련 문제