Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GtkWindow和GdkWindow之间的区别?_Gtk_Cairo_Gdk_Pango_Pangocairo - Fatal编程技术网

GtkWindow和GdkWindow之间的区别?

GtkWindow和GdkWindow之间的区别?,gtk,cairo,gdk,pango,pangocairo,Gtk,Cairo,Gdk,Pango,Pangocairo,在我的Gtk Gdk Cairo Pango应用程序开始时,我创建了以下窗口: GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 首先,有GtkWindow,但是gtk_create_window返回GtkWidget,而不是GtkWindow,为什么 然后,一些函数,如gdk\u window\u process\u updates(..)需要GdkWindow* gtk\u window\u set\u geometry\

在我的Gtk Gdk Cairo Pango应用程序开始时,我创建了以下窗口:

GtkWidget   *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
首先,有
GtkWindow
,但是
gtk_create_window
返回
GtkWidget
,而不是
GtkWindow
,为什么

然后,一些函数,如
gdk\u window\u process\u updates(..)
需要
GdkWindow*

gtk\u window\u set\u geometry\u hints()
另一方面需要
GtkWindow*

在文档中还有
GdkWindow*gdk\u window\u new()
返回
GdkWindow

当然有:

GdkWindow是屏幕上的矩形区域。这是一个低层次的问题 对象,用于实现诸如GtkWidget和 GTK+级别上的GtkWindow。GtkWindow是顶层窗口 一个用户可能会认为是带有标题栏的“窗口”之类的东西;A. GtkWindow可能包含许多GdkWindow

但它仍然没有告诉我,什么时候为什么我应该创建Gtk或Gdk窗口? 这里的模式是什么

现在你会问,我想解决什么问题?当然,在鼠标移动之后,我尝试在gtk+gdk的顶部使用cairo+pango绘制文本。问题是,虽然实际的绘图似乎执行得很快,但我无法让它完全在鼠标移动时发生。在我的
motion\u notify\u事件中
我只调用
gtk\u widget\u queue\u draw(GtkWidget)
,但明显滞后于屏幕上实际移动的鼠标,即使我绘制单个字符,它在移动阶段与鼠标指针不对齐,只有在鼠标停止后才能捕捉到它

我尝试的是通过调用
gdk_window_process_updates(gdk_window(window),false)来加速更新,编译器会吃掉它,但我得到了运行时断言:
Gdk CRITICAL**:Gdk\u window\u process\u updates:assertion'Gdk\u IS\u window(window)'失败
。我找不到有关此宏以及如何/何时使用它的任何信息

#包括
#包括
#定义TXT“1234567890”
int X=0,Y=0;
静态空心图(cairo_t*);
GtkWidget*窗口;
PangoLayout*布局=0;
静态gboolean on_draw_事件(GtkWidget*widget,cairo_t*cr,
gpointer用户(U数据){
杜鲁图(cr);
返回FALSE;
}
静态void do_图纸(cairo_t*cr){
如果(布局==0){
布局=pango\u cairo\u创建布局(cr);
pango_布局_集合_文本(布局,TXT,-1);
}
对于(int y=0;y<2;y++){
cairo\u set\u source\u rgb(cr,1,0,1);
开罗移动到(cr,0+X,0+y*20+y);
pango_cairo_show_布局(cr,布局);
}
gtk_小部件_队列_绘制(窗口);
}
静态gint onmouse(GtkWidget*小部件、GdkEventMotion*事件){
X=事件->X;Y=事件->Y;
gtk_小部件_队列_绘制(小部件);
gdk_窗口_进程_更新(gdk_窗口(小部件),错误);
}
int main(int argc,char*argv[]){
GtkWidget*darea;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
darea=gtk_图纸_区域_新();
gtk_容器添加(gtk_容器(窗口),darea);
gtk_小部件_设置_事件(窗口、GDK_曝光_掩码
|GDK_离开_通知_掩码| GDK_指针_运动_掩码);
g_信号连接(g_对象(darea),“绘制”,g_回调(在绘制事件上),NULL);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
g_信号连接(窗口,“运动通知事件”,g_回调(onmouse),空);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_窗口设置默认大小(gtk_窗口(窗口),5000,5000);
gtk_窗口设置标题(gtk_窗口(窗口),“行”);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
窗口管理器(X11、Wayland、Windows的user32.dll,以及Mac OS X中我不记得其名称的那一个)本身(不一定)提供了很多功能。他们给你的是:

  • 创建屏幕区域(称为窗口)的能力,您可以在其上绘制、移动、调整大小、重塑、最小化、隐藏在其他窗口后面以及以其他基本方式进行控制,但对于我们的讨论来说,最重要的是“绘制”
  • windows的鼠标事件处理:当鼠标移入或移出窗口、在窗口内移动或当鼠标光标位于窗口上方时单击鼠标按钮时发出通知
  • 接收键盘输入(聚焦窗口)和此窗口的键盘事件的窗口的概念:当用户键入窗口时
  • 其他杂项功能(例如,绘制鼠标光标)
当与在窗口中进行矢量图形和文本渲染的工具(通常由其他库提供,如cairo和pango)结合使用时,GUI工具包就发挥了作用。这就是将窗口管理器窗口划分为您熟悉的所有小控件的原因:按钮、文本字段、列表、选项卡、网页呈现器等

GTK+是本例中的GUI工具包。它提供了您在程序中使用的大量控件

当您使用GUI工具包时,通常不会直接与窗口管理器交互。因此,GUI工具包提供了自己的窗口。当您创建GUI工具箱窗口时,GUI工具箱将创建底层的窗口管理器窗口,然后控制所有图形和事件,以便它能够处理在该窗口中为您提供所有整洁控件的工作

对于GTK+,这是GtkWindow

GTK+的设计者不希望GTK+本身支持的每个平台都有所有窗口管理器交互代码。相反,他们创建了一个单独的库(包含在GTK+源代码中),称为GDK。GDK围绕特定于低级平台的窗口管理器函数提供了一致的可移植API

因此GdkWindow是一种围绕窗口管理器窗口的类型,它提供GTK+使用的可移植接口。