我想在程序启动之间保存/恢复窗口位置。 窗口可以最大化。这也应该保存。 问题是在窗口位置最大化(缩放)时保存窗口位置。
所以细节(我不关心保存,这是非常简单的任务)。 我需要获得窗口正常状态的x,y,宽度,高度的方法,并标记窗口是否最大化。 不幸的是,gdk_window_get_size / gdk_window_get_position返回实际的窗口位置。
使用GetWindowPlacement和rcNormalPosition可以在Windows下轻松解决此问题。 但我需要一个适用于Mac OS X Cocoa的解决方案(至少)或纯GTK中的某种解决方案。
答案 0 :(得分:0)
Cocoa *解决方案在Window Programming Guide的Saving Window Position中有描述。让你的申请代表做:
[window setFrameAutosaveName:@"MyWindowFrame"];
使窗口在帧更改时自动将其框架保存为用户默认值。然后在下次发布时,
[window setFrameUsingName:@"MyWindowFrame"];
窗口知道它是is "zoomed"(最大化):
[window isZoomed];
所以你可以随时随地获得这个标志:
// Gives you an NSRect in screen coordinates
[window frame];
根据文档,isZoomed
和zoom
通过windowWillUseStandardFrame:defaultFrame:
检查窗口的代理人。我不确定你想要去Cocoa有多深,但这看起来像是你在评论中提到的情况的一个选项。我认为窗口委托对象可以通过此方法为框架提供合理的默认值,如果窗口是使用缩放框架创建的。
*和Obj-C,因为我不懂C ++。
答案 1 :(得分:0)
为此,我做的是使用在调整大小时发出Gtk.Window的信号,通过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%d\n", 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;
}
}
这个架构:
<?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>
祝你好运!
答案 2 :(得分:0)