我正在尝试使用C
和GTK3
在Linux Ubuntu中构建应用程序,但收到关于gdk_window_get_origin
的错误,我无法弄清楚自己在做什么错。
该应用程序运行,并且Window确实是我的Screen的大小,但是有一个警告我无法解决:
(Stack:7229):Gdk-CRITICAL **:11:09:22.221:gdk_window_get_origin:断言'GDK_IS_WINDOW(window)'失败 屏幕最大:1600W X 900H
这是示例代码:
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
gint width, height;
gtk_init(&argc, &argv);
/// Creating the Window
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/// Get window Size
GdkDisplay *dpy = gtk_widget_get_display( window );
GdkWindow *win = gtk_widget_get_window(window);
GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win);
/// Get window Geometry
GdkRectangle geometry;
gdk_monitor_get_geometry(monitor, &geometry);
width = geometry.width;
height = geometry.height;
g_print("Screen max: %dW X %dH\n", width, height);
// Setting the default size of the Window
gtk_window_set_default_size(GTK_WINDOW(window), width, height );
// Destroy the Window
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
}
答案 0 :(得分:0)
TL; DR:您正在尝试在实现GtkWindow之前访问GdkWindow。
来自using System;
using System.Runtime.CompilerServices;
struct Foo
{
public int x, y;
}
class MyClass<T>
{
public T Value = default(T);
public unsafe MyClass(byte[] bytes)
{
if (bytes.Length < Unsafe.SizeOf<T>())
throw new InvalidOperationException("not enough data");
Value = Unsafe.As<byte, T>(ref bytes[0]);
}
}
static class P
{
static void Main() {
byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var obj = new MyClass<Foo>(bytes);
var val = obj.Value;
Console.WriteLine(val.x); // 67305985 = 0x04030201
Console.WriteLine(val.y); // 134678021 = 0x08070605
}
}
documentation:
如果已实现则返回窗口小部件的窗口,否则返回NULL
创建与窗口小部件关联的GDK(窗口系统)资源。 例如,在实现小部件时将创建小部件->窗口。 通常,实现是隐式发生的;如果您显示一个小部件和所有 它的父容器,那么该小部件将被实现并映射 自动。
您需要先调用gtk_widget_get_window
,然后再尝试使用gtk_widget_realize
访问GdkWindow,或者使用对{{3}的回调,将访问推迟到实现窗口(在Gtk主循环开始之后)为止}信号:
gtk_widget_get_display