【发布时间】: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