【发布时间】:2021-02-07 05:12:16
【问题描述】:
在使用 Code::Blocks 的 Windows 上,我曾经在 wxWidgets 自定义控件中调用 this->GetHandle() 来获取 HWND 句柄,以便从哪里使用 GDI+ 库进行绘制。在 Linux 中做同样的事情时,当我从绘图事件处理程序调用 this->GetHandle() 时,我得到一个 GtkWidget*,但我不知道如何使用 cairo 库与 GDI+ 一起呈现自定义控件。我尝试了一些来自互联网的 cairo 渲染示例,但老实说没有用。
在自定义控件中,我在绘制事件处理程序中有这个
void WorkingArea::paintEvent(wxPaintEvent& event)
{
wxPaintDC dc(this);
render(dc);
}
渲染函数是这样的
void WorkingArea::render(wxDC& dc)
{
Render(this->GetHandle(),graph);
//In windows I just call Render((HWND)this->GetHandle(),graph);
}
在 Windows 中渲染函数如下
void Render(HWND window_handle,const Simple2DGraph& graph)
{
delete gw;//deletes window graphic
gw=Graphics::FromHWND(window_handle);
delete g; //deletes buffer bitmap graphic
delete buffer;//deletes the buffer bitmap
ctrlW=graph.getCtrlW();
ctrlH=graph.getCtrlH();
buffer=new Bitmap(ctrlW,ctrlH,gw);
g=Graphics::FromImage(buffer);
//Graphics buffer settings
g->SetCompositingMode(CompositingMode::CompositingModeSourceOver);
g->SetCompositingQuality(CompositingQuality::CompositingQualityHighSpeed);
g->SetInterpolationMode(InterpolationMode::InterpolationModeBicubic);
g->SetPageScale(1);
g->SetPageUnit(Unit::UnitPixel);
g->SetPixelOffsetMode(PixelOffsetMode::PixelOffsetModeHighSpeed);
g->SetSmoothingMode(SmoothingMode::SmoothingModeHighQuality);
g->SetTextRenderingHint(TextRenderingHint::TextRenderingHintSystemDefault);
g->Clear(color1);
//->
//->
//->
//More rendering commands
}
我使用传递的 HWND 创建一个 Windows 图形,在其中我使用 GDI+ 库绘制对象。我想知道如何使用 cairo 库方法从获得的 GtkWidget* 呈现自定义控件,就像我可以在 Windows 上使用传递的 HWND 创建的 GDI+ 图形一样。
【问题讨论】:
-
你试过 wxGraphicsContext、wxRendererNative 吗?
-
是的,我也尝试过。该代码创建了 cairo_t 和所有内容,但在屏幕上不呈现任何内容。它只显示一个空白的白色窗口。
-
构建并运行 wxW 附带的
drawing示例。打开Drawing菜单并选择Use default wxGraphicsContext。你是否也看到了一个空白的白色窗口?
标签: render codeblocks wxwidgets cairo