与Windows wxWidgets上的GDI +一样,如何使用cairo在Linux wxWidgets上绘制自定义控件?

问题描述

在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>