问题描述
在Windows上使用Code :: Blocks,我曾经在wxWidgets自定义控件中调用this-> GetHandle()来获取HWND句柄,该句柄可从此处使用GDI +库进行绘制。在Linux中,从绘画事件处理程序调用this-> GetHandle()时,会得到一个GtkWidget *,但我不知道如何像GDI +一样使用cairo库来呈现自定义控件。我尝试了一些通过互联网进行开罗渲染的示例,但老实说是行不通的。
在自定义控件中,我在paint事件处理程序中拥有了它
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
。
如果没有,那么您基本上需要直接使用GTK API,有很多将Cairo与GTK一起使用的示例。但是,这再次违背了使用wxWidgets隐藏平台之间差异的想法-这正是wxGraphicsContext
所做的(因为Windows内部使用GDI +或Direct2D,而Unix系统内部使用Cairo)。 / p>