我有一个应用程序层,我想移植到Gtk,它拥有所有自己的布局代码,我真的不想花费'n'个月重新编写它来使用Gtk布局系统,但是而只是使用现有的内部布局代码,让Gtk渲染生成的小部件。
我在尝试了几个内置容器后开始编写自己的小部件。基本上我正在寻找像没有最小尺寸的GtkFixed容器之类的东西,即Gtk将适合整个窗口的第一个窗口小部件,并且所有子窗口小部件都将自己放置以便填充该区域。如果我使用GtkFixed,窗口总是限于初始布局的大小,因为这是“请求”的空间。我不能把它调整到小于使用窗户装饰边缘的尺寸。
也许我需要在分配和请求方面接受教育。到目前为止,我的谷歌搜索还没有找到我需要的信息来完成这项工作。我确实试过了。
我目前正在使用C API,我的目标是Win32和Linux。到目前为止,我有一个在Win32中运行的shell应用程序,它建立了一个空窗口。但是第一个子窗口小部件将调整大小限制为它的初始大小。
编辑:仅供参考,所有这一切的最终结果可用here。该代码表示我可以独立于GTK布局引擎移动和调整大小的基本窗口小部件。
答案 0 :(得分:2)
我相信你想使用GtkFixed
并连接到它上面的size-request
信号,只要小部件被要求弄清楚它想要多少空间就会被调用。将GtkRequisition
结构修改为您希望窗口小部件具有的空间。这将是GTK布局引擎尝试分配给窗口小部件的空间量,因此它实际上是您希望窗口小部件具有的最小大小。当然,布局引擎可以自由分配比您请求更多(或更少!)的空间。
答案 1 :(得分:0)
我的代码的问题是我正在捕获“configure-event”并返回TRUE,这阻止了一些正常的GTK布局工作。我需要该事件来更新我的内部大小变量,但我还需要返回FALSE以允许下一个处理程序获取该信号。
现在我的小部件可以正确地假设窗口的客户区域的大小,然后我可以使用GtkFixed样式定位来布置我需要它们的控件。
答案 2 :(得分:0)
一种解决方案可能是将小部件子类化,使其就其首选/最小尺寸向父母撒谎:
// here is where we are reckless about our content's size
static void reckless_fixed_get_preferred_width(GtkWidget *widget, int *minimal, int *natural) {
*minimal = *natural = 1;
}
//here too
static void reckless_fixed_get_preferred_height(GtkWidget *widget, int *minimal, int *natural) {
*minimal = *natural = 1;
}
完整的代码适用于稍微不同的用例,但是也适合这里: