Хобрук: Ваш путь к мастерству в программировании

Как использовать cairo для рисования пользовательских элементов управления в Linux wxWidgets, как с помощью GDI+ в Windows wxWidgets?

В 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.


  • Вы пробовали wxGraphicsContext, wxRendererNative? 24.10.2020
  • Да, я тоже пробовал такие. Код создает cairo_t и все остальное, но ничего не отображает на экране. Он показывает только пустое белое окно. 24.10.2020
  • Соберите и запустите drawing образец, поставляемый с wxW. Откройте меню Drawing и выберите Use default wxGraphicsContext. Вы тоже видите там пустое белое окно? 24.10.2020

Ответы:


1

Что именно ты пытаешься сделать? т.е. конечно, ваша конечная цель состоит не в том, чтобы использовать Cairo, а в том, чтобы что-то нарисовать, не так ли? Если это так, вы должны просто использовать wxGraphicsContext, как уже было рекомендовано в комментарии.

Если нет, вам в основном нужно использовать GTK API напрямую, есть много примеров использования Cairo вместе с GTK. Но, опять же, это противоречит самой идее использования wxWidgets для сокрытия различий между платформами — именно это и делает wxGraphicsContext (поскольку он использует GDI+ или Direct2D внутри Windows и Cairo в Unix-системах).

29.10.2020
  • Я попробовал ваше решение, но оно просто не работает. Я использую code::blocks в проекте wxWidgets для создания графического интерфейса. Когда я получаю GtkWidget* от GetHandle (помните, что я использую Linux), он ничего не делает, независимо от того, использую ли я wxGraphicsContext или другим способом. 11.12.2020
  • Я думаю, что решение связано с сигнализацией событий в GTK, так как мне перепривязать сигналы и обратные вызовы функций для рисования виджета? 12.01.2021
  • С помощью wxWidgets вы рисуете из обработчика wxEVT_PAINT. Если вы не хотите использовать wxWidgets для этого окна, вы должны полностью реализовать его на уровне GTK и внедрить с помощью wxNativeWindow. До сих пор не совсем понятно, что вы на самом деле пытаетесь сделать. 12.01.2021
  • Это просто, я использую wxWidgets для создания обычного графического интерфейса, такого как меню и кнопки, но мне нужен один пользовательский элемент управления, который имеет очень сложный рисунок и композицию. Этот единый элемент управления я намеревался получить из нативного API в каждой ОС (GDI+ в Windows и GTK+ в Linux) и начиная с дескриптора, который возвращается в методе GetHandle объектов wxWidgets. Закомментированные решения почему-то не работают, кроме того мне нужно использовать функционал сохранения и восстановления состояния графики, чтобы сэкономить время при рендеринге. 13.01.2021
  • Я должен добавить, что управление намного сложнее, чем пользовательская кнопка с другой формой, но проще, чем, скажем, в игре. Приложение предназначено для работы на машине без графического процессора, поэтому мне нужно сделать все возможное с API GDI+ и GTK+. 13.01.2021
  • Неясно, почему вы не можете сделать это с помощью wxGraphicsContext и должны напрямую обращаться к собственному API. Но я согласен, что использование GetHandle() все равно должно работать. Я не знаю, почему это не так, извините. Как всегда, хорошим первым шагом будет начать с минимально возможного простейшего и самостоятельного примера. 14.01.2021
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...