【问题标题】:Get Gtk::DrawingArea size, before signaling draw获取 Gtk::DrawingArea 大小,在发出 draw 之前
【发布时间】:2020-10-11 05:17:18
【问题描述】:

我想在Gtk::DrawingArea 中一一绘制一些帧。在开始申请时,我需要得到DrawingArea的大小,分配一个RGB缓冲区,但是DrawingArea::get_width()DrawingArea::get_height()返回1。

我的代码是基于https://developer.gnome.org/gtkmm-tutorial/stable/sec-drawing-clock-example.html.en 加上一行来获得DrawingArea 的大小:

#include "clock.h"
#include <gtkmm/application.h>
#include <gtkmm/window.h>

int main(int argc, char** argv)
{
   auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

   Gtk::Window win;
   win.set_title("Cairomm Clock");

   Clock c;
   win.add(c);
   c.show();

   int w = c.get_width();
   // w is 1;

   return app->run(win);
}

在实际绘制之前如何获取 DrawingArea 的大小?

【问题讨论】:

  • 您在寻找signal_configure_event() 吗? GTK+ 中的布局协商并不简单。小部件的实际大小在绘制之前可能不知道。但是,如果需要,AFAIK 配置事件会在相应的绘制事件之前发送。顺便提一句。您仍然可以在 draw event 本身中检索小部件的实际大小,并在绘制之前分别更新您的内容。
  • 关于后者,这就是他们在Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); 的示例代码中所做的。关于分配 RGB 缓冲区:您可以“按需”执行此操作。只需检查抽奖事件是否已经完成。如果没有,那就去做吧。因此,它将仅在第一次调用中完成。不过,您可以改为在配置事件中执行此操作(无需检查“是否已完成”)。因此,它也会考虑尺寸变化。
  • @Scheff 我认为 signal_configure_event() 作为我的答案,您介意发表您的评论作为答案吗?
  • 在 Windows 支持变得不可靠之前,我是一个热情的 gtkmm 开发人员,我们决定切换到 Qt。我并没有忘记一切,但我的注意力主要来自感伤的记忆。 ;-) 如果您的示例按预期运行,您可以将其发布为self-answer(使用minimal reproducible example)。

标签: c++ gtkmm drawingarea


【解决方案1】:

我能够根据Scheff 的 cmets 跟踪大小变化:

#include "clock.h"
#include <gtkmm/application.h>
#include <gtkmm/window.h>

int width_ = 0;
int height_ = 0;
bool resized_ = false;

void check_size()
{
   if (resized_)
   {
      resized_ = false;
      // Apply size changes to resources using width_ and height_
   }
}

int main(int argc, char** argv)
{
   auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

   Gtk::Window win;
   win.set_title("Cairomm Clock");

   Clock c;
   c.signal_configure_event().connect([&](GdkEventConfigure* event)
   {
      width_ = event->width;
      height_ = event->height;
      resized_ = true;
      return true;
   });
   win.add(c);
   c.show();

   return app->run(win);
}

在哪里调用check_size 函数取决于应用程序的设计。就我而言,我在 c.queue_draw() 之前调用它。

【讨论】:

  • @BobMorane 我需要等待一段时间才能将我的答案标记为已解决。开始是 13 个小时,现在还剩 6 个小时。感谢您的编辑。
【解决方案2】:

我在操场上解决了关于 cairo 和 gtk 在 vala 添加连接到自定义 on_window_configure_event 的信号

meter.vala

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2013-04-17
    相关资源
    最近更新 更多