CMFCToolBar 中的 HBitmap 问题

问题描述 投票:0回答:0

我尝试在

CMFCToolBar
中添加一个位图,它成功地插入到工具栏中,如下图所示。但它插入的是黑色背景。我尝试用不同的位图插入它,问题是一样的。当我将相同的位图添加到
CButton
(见下图)、CTreeCtrl 和许多其他地方时,它完美显示,没有任何黑色背景。

我认为

CMFCToolBar
有问题,我无法弄清楚这个问题(见图1)。如果我使用 CImageList 将位图添加到 CMFCToolBar 中,它就可以工作(参见图 2)。我不明白为什么。请参阅下面的代码。

使用 NanoSVG 将 SVG 转换为 Hbitmap 的函数

HBITMAP SvgToHbitmap(const char* filename) {    
NSVGimage* image = nsvgParseFromFile(filename, "px", 96);

int OriginalWidth = (int)image->width;
int OriginalHeight = (int)image->height;

int TargetWidth = 16;
int TargetHeight = 16;

BITMAPINFO bmpinfo = { 0 };
bmpinfo.bmiHeader.biSize = sizeof(bmpinfo.bmiHeader);
bmpinfo.bmiHeader.biWidth = static_cast<LONG>(TargetWidth);
bmpinfo.bmiHeader.biHeight = -static_cast<LONG>(TargetHeight);
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = 32;
bmpinfo.bmiHeader.biCompression = BI_RGB;


void* bits = nullptr;   
HBITMAP hbitmap = CreateDIBSection(NULL, &bmpinfo, DIB_RGB_COLORS, &bits, nullptr, 0);

NSVGrasterizer* rast = nsvgCreateRasterizer();

float a = (2 * (TargetWidth + TargetHeight));
float b = (2 * (OriginalWidth + OriginalHeight));
float ReScaleFactor = a / b;

nsvgRasterize(rast, image, 0, 0, ReScaleFactor, (unsigned char*)bits, TargetWidth, TargetHeight, static_cast<int>(TargetWidth * 4));

nsvgDeleteRasterizer(rast);

nsvgDelete(image);  

return hbitmap; }

添加带有 HBitmap 的按钮和 MFCToolBar 到对话框

BOOL CSvgDlg::OnInitDialog(){
CDialogEx::OnInitDialog();
.....
.....
.....
// Create the button
m_button.Create(_T(" "), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,CRect(50, 50, 100, 100), this, 3);

//create MFCToolBar
if (!m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, 100))
{
   return FALSE;
}    
m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle()
        & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_ANY));

CSize   sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE);
m_wndToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy,
        SWP_NOACTIVATE | SWP_NOZORDER);

HBITMAP bitmap = SvgToHbitmap("XXX.svg");

m_button.SetBitmap(bitmap);

int ImageIdx = m_wndToolBar.GetImages()->AddImage(bitmap);

m_wndToolBar.InsertButton(CMFCToolBarButton(ID_APP_MENU, -1, _T("Menu")));
m_wndToolBar.InsertButton(CMFCToolBarButton(ID_APP_ABOUT, ImageIdx, _T("About")));
m_wndToolBar.InsertButton(CMFCToolBarButton(ID_APP_EXIT, -1, _T("Exit")));

}

使用 CImageList

m_CImageList.Create(16, 16, ILC_COLORDDB | ILC_MASK, 0, 1);
CBitmap lcbitmap;
lcbitmap.Attach(bitmap);
const COLORREF rgbWhite = 0x00FFFFFF;   
int ImageIdx = m_CImageList.Add(&lcbitmap, rgbWhite);   
m_wndToolBar.GetImages()->CreateFromImageList(m_CImageList);

我不明白为什么

m_wndToolBar.GetImages()->AddImage(bitmap);
不工作而
m_wndToolBar.GetImages()->CreateFromImageList(m_CImageList);
工作。有什么问题

c++ windows winapi mfc cmfctoolbar
© www.soinside.com 2019 - 2024. All rights reserved.