【问题标题】:wxWidgets drawing transparency issuewxWidgets 绘制透明度问题
【发布时间】: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 对象?

标签: bitmap wxwidgets


【解决方案1】:

假设您使用的是最新版本的 wxWidgets,您可以直接绘制到 wxImage,但首先您必须设置 alpha 通道。

然后可以像您当前所做的那样对图像进行缩放并复制到提供的 mdc。

// Setup the alpha channel.
unsigned char* alphaData = new unsigned char[bwidth * bheight];
memset (alphaData, wxIMAGE_ALPHA_TRANSPARENT, bwidth * bheight);

// Create an image with alpha.
wxImage image (wxSize(bwidth, bheight));
image.SetAlpha (alphaData);
wxGraphicsContext* gc = wxGraphicsContext::Create (image);

gc->SetPen (wxPen(colour, penWidth));
gc->SetBrush (wxTRANSPARENT_BRUSH);

// Do drawing here ....

// Release the graphics context.
delete gc;

// Scale the image and convert to a bitmap.
wxBitmap outBmp (image.Scale(t_width, t_height), 32);

// Blit it to the provide mdc.
mdc->DrawBitmap (outBmp, wxPoint(x,y)), true);

【讨论】:

  • 顺便说一下,image.SetAlpha 可以将 NULL 作为参数来避免 alphaData 内存分配步骤,但我不确定在这种情况下它是如何初始化 alpha 通道的,所以我更喜欢这样做我自己。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多