
每一个屏幕上都有一个根窗口。根窗口总是占据整个屏幕尺寸。这个窗口无法被销毁,改变尺寸或者图标化。当一个应用程序创建了一些窗口,它先创建至少一个顶层窗口。在被映射到屏幕上后,这个窗口成为一个根窗口的直接子窗口。这个窗口在被映射到屏幕上之前,窗口管理器被告知什么发生了,然后,窗口管理器获得特权成为新顶层窗口的"父亲"。这通常被用来增加一个会包含新窗口的窗口和绘制框架,标题栏,系统菜单等。
一旦一个顶层窗口(当然它实际上不是一个顶层窗口,因为窗口管理器已经成为它的父窗口了)被创建了,应用程序可以在它里面创建它的子窗口。一个子窗口只能在它的父窗口里显示 - 如果试图把它移动到外面,出去的部分将被父窗口的边框给切掉。任何窗口都可以包含一个以上的子窗口,在这种情况下,这些子窗口将被放置在应用的内部栈上。当一个顶层窗口被打开 - 它的所有子窗口也将随着它被打开。
以下例子演示如何在一个给定的叫"win"的窗口里打开一个子窗口。
Lets see how to create a child window inside a given window 'win'.
/* this variable will store the handle of the newly created child window. */
Window child_win
/* these variables will store the window's width and height. */
int child_win_width = 50
int child_win_height = 30
/* these variables will store the window's location. */
/* position of the child window is top-left corner of the*/
/* parent window. - 0,0. */
int child_win_x = 0
int child_win_y = 0
/* create the window, as specified earlier. */
child_win = XCreateSimpleWindow(display,
win,
child_win_x, child_win_y,
child_win_width, child_win_height,
child_win_border_width,
BlackPixel(display, screen_num),
WhitePixel(display, screen_num))
--------------------------------------------------------------------------------
事件传递
先前我们已经讨论了事件传递 - 如果一个窗口收到了一个它不处理的事件 - 它就把该事件发到它的父窗口去。如果那个父窗口也不处理该事件 - 那个父窗口就把该事件发到它的父窗口上去,接下来依此类推。这种行为对一个简单的Xlib程序是没什么用的,但对于抽象级更高的绘图库是有用的。这些抽象级更高的绘图库通常把某个特定窗口的事件联系到一个函数上去。在这种情况下,发送事件到特定的窗口并用适当的函数来处理就非常有用。
---------------------------------------------------------------------------
很高兴回答楼主的问题 如有错误请见谅
使用 XSetWMNormalHints 函数 修改 M_NORMAL_HINTS Property 设置 min 和max height 和 width应该可以做到?http://tronche.com/gui/x/xlib/ICC/client-to-window-manager/wm-normal-hints.html
不过如果你用的qt 或者gtk之类的高层次一点的库,应该有自己的函数吧,为什么要找xlib啊。这种问题自己去翻一下xlib的手册吧
你要在你编写程序中实现画图功能的话,在linux下一般是基于xlib和opengl的,窗口化部分则是交给qt或gtk嫌麻烦的话,可以用glut,这个是基于opengl的功能包,功能较简单,适合拿来玩熟原理
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)