我希望能够向我的窗口应用程序添加一些彩色图形,而我能做到这一点的唯一方法是手动加载位图并使用Xlib的放置像素例程。
我目前正在使用 Xlib。我尝试了 gtk 和很多人,它的标题有编译问题,我认为其他额外的库不会工作,因为我想制作一些需要尽可能少的库的东西。
经过学习和实验,我注意到当我使用窗口管理器 (xfce) 最小化和恢复窗口时,窗口出现但内部内容消失(仅显示背景颜色),除非我之前包含模板代码中显示的事件,即使我这样做,我也必须重新执行用于生成窗口中项目的所有命令。如果目标计算机较旧,并且位图是逐像素加载的(尤其是大尺寸位图),则这可能是灾难性的。
因此,与其在每次最小化窗口然后恢复时都执行所有这些重新加载,是否有某种基本的 X 系统函数可以捕获窗口内容,并允许我将数据保存到变量(可能是 char* 类型的指针)然后我可以调用具有相同指针的函数一次恢复窗口的所有内容,而不是放置每个元素(包括单个位图像素)一次一个?
下面是模板代码:
XEvent e;
Window w;
Display* dpy;
//events interested in
long EvCap=ExposureMask|ButtonPressMask|KeyPressMask|StructureNotifyMask;
void endx(){
// Unload stuff so memory is freed
}
void initx(){
// Load window and initial commands that don't need updating
}
void redrawWindowItems(){
// Stuff that needs to go on screen that disappears on minimize
}
int main(){
initx();
redrawWindowItems();
while(1){
if (XCheckWindowEvent(dpy,w,EvCap,&e)){
if (e.type==Expose && e.xexpose.count==0) {redrawWindowItems();} //redraw exposed windows
}
}
endx();
}
...是否有某种基本的X系统功能可以捕获窗口内容...
您可以使用XCreatePixmap()
创建像素图。像素图应具有与窗口相同的深度。
使用XCopyArea()
函数将窗口的内容复制到 pixmap;收到Expose
事件时,使用XCopyArea()
将内容复制回窗口。
所用GC
的function
应为GXcopy
(这是调用XCreateGC()
时的默认值)。
但是,这不是最好的主意:
如果在"保存">窗口内容时窗口的某些部分不可见,则"保存"的数据将不完整。
但是,您可以(几乎)直接对像素图而不是窗口执行所有图形功能(例如绘图)。
直接将图像"绘制"到像素图而不是窗口。
然后调用XCopyArea()
第一次在窗口中显示图像。(每当收到Expose
事件时,请再次呼叫XCopyArea()
。