2010-04-08 63 views
1

我想让我的工具栏与ImageList一起工作。这些图像是单独的PNG,因此我将它们连续添加到ImageList中,但Bbt不起作用。下面是代码的Image添加到ImageList试图用ImageList创建一个工具栏,不工作

HIMAGELIST CreateToolBarImages(HINSTANCE hInst) 
{ 
    HIMAGELIST v_ImageList = NULL; 
    // IMAGE_LIST v_Img; 
    HICON hIcon; 
    HBITMAP hBit; 
    COLORMAP cMap; 
    COLORREF fromColor = RGB(0,0,0); 

    InitCommonControls(); 

    v_ImageList = ImageList_Create(32, 32, ILC_MASK, 1, 1); 

    cMap.from = fromColor; 
    cMap.to = ::GetSysColor(COLOR_BTNFACE); 
    hBit = CreateMappedBitmap(hInst, IDB_CONSOLE, 0, &cMap, 1); 

    // hBit = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CONSOLE)); 
    consoleImg = ImageList_Add(v_ImageList, hBit, 0); 
    if (consoleImg == -1) 
     return NULL; 

    DeleteObject(hBit); 

    // [edit Franci Penov] 
    return v_ImageList; 
} 

然后,我创建工具栏,但它在图像功能失效。

HWND CreateToolBarButton(HWND hWndParent) 
{ 
    const int ImageID = 0; 
    const int numB = 1; 
    COLORREF iColor; 

    HWND hToolBar = CreateWindowEx(0, 
     TOOLBARCLASSNAME, 
     NULL, 
     WS_CHILD |TBSTYLE_LIST |TBSTYLE_FLAT | WS_VISIBLE, 
     0,0,0,0, 
     hWndParent, 
     NULL, 
     g_hInst, 
     NULL); 

    if (hToolBar == NULL) 
     return NULL; 

    HIMAGELIST ImgList = CreateToolBarImages(g_hInst); 
    if (ImgList == NULL) 
     MessageBox(hWndParent, L"No Tool Images", L"BOB", MB_OK); 

    // [edit Franci Penov] 
    return hToolBar; 
} 

有什么我失踪或没有做?

回答

1

我对你的示例代码中的返回值做了一些修改,在此代码之上我标注了注释。

有关如何使用Win32 Toolbar控件的详细说明,请参阅this MSDN article

特别是,你的代码似乎缺少在发送TB_SETIMAGELIST消息给Toolbar控制加载ImageList刚创建:

// Set the image list. 
SendMessage(hToolBar, TB_SETIMAGELIST, 0, (LPARAM)ImgList); 

当然,也有可能是你缺少其他的事情那里,但这将是一个很好的起点。

你也有一些GDI对象在你做错误检查并提前退出函数的地方发生内存泄漏。您可能也想要清理这些。

3

什么“不工作”。 CreateMappedBitmap用于加载具有颜色表的图像 - 这意味着它们具有< = 256种颜色。

PNG意味着您正在使用带有alpha通道的32bpp图像,这意味着您无法使用* MappedBitmap函数。

0

嗨,谢谢你,我已经解决了我的问题, 克里斯你是正确的,在我张贴我做了这个观察以及,我需要使用GDI +为了使用PNG的,我选择了去使用相反,它现在完美的作品。 Franci,谢谢你,我已经清理了代码。

问候,