【发布时间】:2016-05-20 21:58:40
【问题描述】:
下面是相关的代码行。基本上我所做的是创建一个更大的位图,绘制到这个,然后从中创建一个较小的图像并将其绘制到屏幕上(wxDC mdc)。为了让它透明,我首先使用了 wxMemoryDC 和 wxGCDC,因为这是我能弄清楚的唯一方法。
问题是,它完美地工作,除非剪下的 sub_bmp 没有绘制任何东西,然后它只是绘制黑色背景而不是透明的。
有什么想法吗?
*bmp = wxBitmap(bwidth, bheight, 32);
bmp->UseAlpha();
wxColor colour;
colour.Set("#800020");
penWidth = 4;
mdc->SetPen(wxPen(colour, penWidth));
wxMemoryDC memDC (*bmp);
wxGCDC dc(memDC);
dc.SetBackground(*wxTRANSPARENT_BRUSH);
dc.Clear();
dc.SetBrush(*wxRED_BRUSH);
dc.SetPen(wxPen(colour, penWidth));
...
b1.x = pix_offset_x - (cpix.x - b1.x);
b1.y = pix_offset_y - (cpix.y - b1.y);
b2.x = pix_offset_x - (cpix.x - b2.x);
b2.y = pix_offset_y - (cpix.y - b2.y);
dc.DrawLine(b1, b2);
memDC.SelectObject(wxNullBitmap); //releases the bitmap from memDC
wxRect subSize(xloc,yloc , vp->pix_width*scaleFactor, vp->pix_height*scaleFactor);
wxBitmap sub_bmp = bmp->GetSubBitmap(subSize);
wxImage tmpimg = sub_bmp.ConvertToImage();
const wxBitmap tbmp(tmpimg.Scale(t_width, t_height),32);
mdc->DrawBitmap(tbmp, 0, 0, true);
【问题讨论】:
-
您是否在 EVT_PAINT 中执行此操作?如果是 - 您是否创建了 wxPaintDC?如果不是 - 您应该在 EVT_PAINT 中执行此操作,因为每个新的绘制事件都会覆盖您的位图。
-
bmp 在 .h 文件中全局声明,我从编写插件的核心程序中获得了 wxDC。这就是mdc。我不创建 wxPiantDC。
-
但是您是否按照应有的方式从 EVT_PAINT 进行绘画,对吗?在这种情况下,您必须创建 wxPaintDC,即使它不会被使用。或者你是说你的 mdc 是一个 wxPaintDC 对象?