在GTK中保存/恢复窗口位置
Save/restore window position in GTK
我想在程序启动之间保存/恢复窗口位置。窗口可以最大化。这个也应该保存。问题是当它被最大化(缩放)时保存窗口位置。
所以细节(我不关心保存,这是相当简单的任务)。我需要获得窗口正常状态的x,y,宽度,高度和标志窗口是否最大化的方法。不幸的是,gdk_window_get_size/gdk_window_get_position返回的是实际的窗口位置。
这个问题可以很容易地解决在Windows下使用GetWindowPlacement和rcNormalPosition。但我需要一个Mac OS X Cocoa(至少)或纯GTK的解决方案。
对此,我所做的是使用发出Gtk的信号。窗口,当你调整它的大小,通过gsettings我保存值和恢复它以同样的方式启动应用程序。下面是vala + GTK+中的一个示例:
using Gtk;
using GLib;
public class Prueba : Window {
public void on_resize (Window win)
{
int width;
int height;
win.get_size (out width, out height);
/* GSETTINGS CONFIG */
string settings_dir = Path.get_dirname (".");
SettingsSchemaSource sss = new SettingsSchemaSource.from_directory (settings_dir, null, false);
SettingsSchema schema = sss.lookup ("apps.test-gs", false);
if (sss.lookup == null)
{
stdout.printf ("GLIB.GIO.SCHEMA: ID not found.");
}
GLib.Settings config = new GLib.Settings.full (schema, null, null);
/* GSETTINGS FIN */
stdout.printf ("RESOLUTION: %dx%dn", width, height);
config.set_int ("width", width);
config.set_int ("height", height);
}
public void on_destroy (Window ventana)
{
stderr.printf ("APPLICATION EXIT!n");
Gtk.main_quit ();
}
public Prueba ()
{
this.title = "Prueba GTK+";
string settings_dir = Path.get_dirname (".");
SettingsSchemaSource sss = new SettingsSchemaSource.from_directory (settings_dir, null, false);
SettingsSchema schema = sss.lookup ("apps.test-gs", false);
if (sss.lookup == null)
{
stdout.printf ("GLIB.GIO.SCHEMA: ID not found.");
}
GLib.Settings settings = new GLib.Settings.full (schema, null, null);
this.set_default_size (settings.get_int("width"), settings.get_int("height"));
this.border_width = 10;
this.window_position = WindowPosition.CENTER;
Button b = new Button.with_label ("SALIR");
b.clicked.connect (()=>{
this.on_destroy (this);
});
this.add (b);
this.show_all ();
}
public static int main (string[] args)
{
Gtk.init (ref args);
Prueba app = new Prueba ();
app.destroy.connect (()=> {
app.on_destroy (app);
});
app.size_allocate.connect (()=>{
app.on_resize (app);
});
Gtk.main ();
return 0;
}
}
和schema:
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
<schema id="apps.test-gs" path="/apps/test-gs/">
<key type="b" name="check-test">
<default>false</default>
<summary>Check de mi app TEST</summary>
<description>Es un ejemplo de BOOLEANO de mi APP TEST</description>
</key>
<key type="i" name="width">
<default>300</default>
<summary>Pixels del Ancho</summary>
<description>Valor del Ancho del Programa TEST</description>
</key>
<key type="i" name="height">
<default>100</default>
<summary>Pixels del Alto</summary>
<description>Valor del Alto del Programa TEST</description>
</key>
</schema>
</schemalist>
祝你好运!
Cocoa*解决方案在窗口编程指南中的保存窗口位置中进行了描述。让你的应用程序委托做:
[window setFrameAutosaveName:@"MyWindowFrame"];
使窗口在框架发生变化时自动将其框架保存为User Defaults。然后在下次启动时,
[window setFrameUsingName:@"MyWindowFrame"];
窗口知道它是否被"缩放"(最大化):
[window isZoomed];
所以你可以随时获得这个标志,以及框架:
// Gives you an NSRect in screen coordinates
[window frame];
根据文档,isZoomed
和zoom
通过windowWillUseStandardFrame:defaultFrame:
与窗口的委托进行检查。我不确定您想在这里深入到什么程度,但对于您在评论中提到的情况,这似乎是一种选择。我认为窗口委托对象可以通过这个方法为框架提供一个合理的默认值,如果窗口是用缩放的框架创建的。
<子> * Obj-C,因为我不知道c++。子>
我刚刚使用pygobject
实现了这样的事情;它不是c++,但它仍然是有用的。
你可以在这里找到代码。
我使用GNOME Builder的默认模板来创建一个python GNOME应用程序,所以如果你用它来设置你的项目,它应该非常容易复制。
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- 恢复Qt窗口大小和位置问题
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- 最小化后无法恢复 SDL 窗口
- 隐藏/显示所有窗口并恢复 Z 顺序
- 如果 winapi 窗口最小化,如何恢复它?
- qt 样式 QPalette::窗口文本颜色在应用程序启动后恢复
- 恢复磁盘支持哪个窗口子系统
- 在qml中恢复最小化的无框窗口
- 释放并恢复Qt中的嵌入式窗口
- WM_PAINT在最小化并恢复窗口后停止工作
- 确定恢复的窗口大小
- 如何正确恢复窗口7/vista aero快照调整大小的窗口小部件
- 在GTK中保存/恢复窗口位置
- 当控件的父窗口被销毁时,是否有必要显式恢复控件字体?