В Windows, использующей Code::Blocks, я вызывал this->GetHandle() в пользовательском элементе управления wxWidgets, чтобы получить дескриптор HWND, откуда можно рисовать с помощью библиотек GDI+. Делая то же самое в Linux, я получаю GtkWidget*, когда вызываю this->GetHandle() из обработчика событий рисования, но я не знаю, как использовать библиотеки 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, используя графику GDI+, созданную переданным HWND.
wxEVT_PAINT
. Если вы не хотите использовать wxWidgets для этого окна, вы должны полностью реализовать его на уровне GTK и внедрить с помощьюwxNativeWindow
. До сих пор не совсем понятно, что вы на самом деле пытаетесь сделать. 12.01.2021wxGraphicsContext
и должны напрямую обращаться к собственному API. Но я согласен, что использованиеGetHandle()
все равно должно работать. Я не знаю, почему это не так, извините. Как всегда, хорошим первым шагом будет начать с минимально возможного простейшего и самостоятельного примера. 14.01.2021