在面板上绘制透明位图

时间:2011-12-17 08:44:31

标签: c++ bitmap wxwidgets

我想在 wxPanel 上绘制一个带圆角的矩形。 如下图所示,我无法透明。白色区域应该是透明的。

enter image description here 灰色区域是位图,在其下方有 wxPanel 背景。 我绘制位图的代码( wxBitmap )是

wxMemoryDC temp;
bitmap.Create(kWidth, kHeight);
temp.SelectObject(bitmap);
temp.SetBackground(*wxWHITE_BRUSH);
temp.Clear();
temp.SetPen(wxPen(wxColor(80, 80, 80), 1));
temp.SetBrush(*wxTRANSPARENT_BRUSH);
temp.DrawRectangle(0, 0, kWidth, kHeight);
temp.SetBrush(wxBrush(backgroundColor));
temp.DrawRoundedRectangle(0, 0, kWidth, kHeight, kRadius);

对于bliting(刷新)我的代码是

void draw(wxDC& dc, wxPoint mousePosition)
{
    wxMemoryDC temp;
    temp.SelectObject(bitmap);
    dc.Blit(wxPoint(kLeft, kTop), temp.GetSize(), &temp, wxPoint(0, 0), wxCOPY, true);
}

但输出如上所示。 我做错了什么?

2 个答案:

答案 0 :(得分:0)

在wxMask中绘制相同的圆角矩形。使您希望通过黑色看到的角落和您想要看到的白色部分。然后用你的wxMask对象调用bitmap.SetMask。将掩码应用于wxBitmap后,它应该在Draw方法中正确地进行blt。

答案 1 :(得分:0)

如果您希望在圆角下看到父级控件的黄色背景为白色背景,则需要创建形状控件。在Windows下,这可以通过使用WinAPI的SetWindowRgn()函数来实现。 你的wxPanel不透明。它有一些背景颜色,即使你用透明刷子在它上面绘制,所以如果你不创建形状控件,你仍然会看到圆角下的不透明区域。 对于其他平台,还应该有一些本机实现(我认为没有默认的wxWidgets API)。对于Linux和wxGTK,您可以使用wxWindow的GetHandle()方法获取GdkWindow *,并使用GDK pixmap创建圆角控件的形状。

另一种方法是在wxPanel下获取父级背景,在面板上绘制,然后绘制圆角矩形。