我想制作闪屏,现在我有两个问题?

1:我想要一个闪屏,但我只有一个窗口?所以,如何处理像parm一样

2:我已经用了一段时间(!完成)来绘制窗口,以便如何突破一个函数或者其他

这是我的代码,对你来说很多

g ++ -o m_splash m_splash.cpp -lX11 -lImlib2

#include  #include  #include  #include  int main() { Imlib_Image m_img; Display *m_dpy; Pixmap m_pix; Window m_root; Screen *scn; int m_width, m_height; const char *filename = "/home/ang/so_zt/w.png"; m_img = imlib_load_image(filename); if(!m_img) { printf("%s\n","init m_img faild"); } imlib_context_set_image(m_img); m_width = imlib_image_get_width(); m_height = imlib_image_get_height(); m_dpy = XOpenDisplay(NULL); if(!m_dpy) { printf("%s\n","open display failed"); } scn = DefaultScreenOfDisplay(m_dpy); int s = DefaultScreen(m_dpy); m_root = XCreateSimpleWindow(m_dpy, RootWindow(m_dpy,s),10,10,m_width,m_height,0, BlackPixel(m_dpy, s), WhitePixel(m_dpy, s)); m_pix = XCreatePixmap(m_dpy, m_root, m_width, m_height, DefaultDepthOfScreen(scn)); imlib_context_set_display(m_dpy); imlib_context_set_visual(DefaultVisualOfScreen(scn)); imlib_context_set_colormap(DefaultColormapOfScreen(scn)); imlib_context_set_drawable(m_pix); imlib_render_image_on_drawable(0,0); XSetWindowBackgroundPixmap(m_dpy, m_root, m_pix); XClearWindow(m_dpy, m_root); Atom wmDeleteMessage = XInternAtom(m_dpy, "WM_DELETE_WINDOW", False); XSetWMProtocols(m_dpy, m_root, &wmDeleteMessage, 1); XSelectInput(m_dpy, m_root, ExposureMask | KeyPressMask | StructureNotifyMask); XMapWindow(m_dpy, m_root); bool done = false; while (!done) { XEvent m_ev; XNextEvent(m_dpy, &m_ev); /* draw or redraw the window */ if (m_ev.type == Expose) { XFillRectangle(m_dpy, m_root, DefaultGC(m_dpy, DefaultScreen(m_dpy)), 20, 20, 10, 10); } /* exit on key press */ //usleep(1000000); //done = true; switch(m_ev.type) { case KeyPress: XDestroyWindow(m_dpy, m_root); break; case DestroyNotify: done = true; break; case ClientMessage: if (m_ev.xclient.data.l[0] == wmDeleteMessage) { done = true; } break; } } //XFreePixmap(m_dpy, m_pix); //imlib_free_image(); //XCloseDisplay(m_dpy); } 

要使其成为启动画面,请使用扩展窗口管理器提示。

 #include  Atom type = XInternAtom(m_dpy, "_NET_WM_WINDOW_TYPE", False); Atom value = XInternAtom(m_dpy, "_NET_WM_WINDOW_TYPE_SPLASH", False); XChangeProperty(m_dpy, m_root, type, XA_ATOM, 32, PropModeReplace, reinterpret_cast(&value), 1); 

然后窗口看起来没有装饰,直到被点击为止。

单击时,您将获得UnmapNotify事件,因此您应该使用它来设置完成。

为避免必须获取事件,请添加

 XFlush(m_dpy); 

映射窗口后显示它和

 XUnmapWindow(m_dpy, m_root); 

当你想要摆脱它。

在此示例中,程序在继续之前只hibernate5秒:

 #include  #include  #include  #include  #include  int main() { Imlib_Image m_img; Display *m_dpy; Pixmap m_pix; Window m_root; Screen *scn; int m_width, m_height; const char *filename = "w.png"; m_img = imlib_load_image(filename); if(!m_img) { printf("%s\n","init m_img faild"); } imlib_context_set_image(m_img); m_width = imlib_image_get_width(); m_height = imlib_image_get_height(); m_dpy = XOpenDisplay(NULL); if(!m_dpy) { printf("%s\n","open display failed"); } scn = DefaultScreenOfDisplay(m_dpy); int s = DefaultScreen(m_dpy); m_root = XCreateSimpleWindow(m_dpy, RootWindow(m_dpy,s),10,10,m_width,m_height,0, BlackPixel(m_dpy, s), WhitePixel(m_dpy, s)); m_pix = XCreatePixmap(m_dpy, m_root, m_width, m_height, DefaultDepthOfScreen(scn)); Atom type = XInternAtom(m_dpy, "_NET_WM_WINDOW_TYPE", False); Atom value = XInternAtom(m_dpy, "_NET_WM_WINDOW_TYPE_SPLASH", False); XChangeProperty(m_dpy, m_root, type, XA_ATOM, 32, PropModeReplace, reinterpret_cast(&value), 1); imlib_context_set_display(m_dpy); imlib_context_set_visual(DefaultVisualOfScreen(scn)); imlib_context_set_colormap(DefaultColormapOfScreen(scn)); imlib_context_set_drawable(m_pix); imlib_render_image_on_drawable(0,0); XSetWindowBackgroundPixmap(m_dpy, m_root, m_pix); XClearWindow(m_dpy, m_root); Atom wmDeleteMessage = XInternAtom(m_dpy, "WM_DELETE_WINDOW", False); XSetWMProtocols(m_dpy, m_root, &wmDeleteMessage, 1); XMapWindow(m_dpy, m_root); XFlush(m_dpy); sleep(5); XUnmapWindow(m_dpy, m_root); } 

而且这个程序可以有一个你好世界的飞溅,我不知道如何跳出来(!完成)这么多thx到U

g ++ -o test_chr test_chr.cpp -lX11

 #include  #include  #include  #include  #include  #include  int main(void) { Display *d; Window w; XEvent e; const char *msg = "Hello, World!"; int s; bool done = false; /* open connection with the server */ d = XOpenDisplay(NULL); if (d == NULL) { fprintf(stderr, "Cannot open display\n"); exit(1); } s = DefaultScreen(d); /* create window */ w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 480, 320, 0,BlackPixel(d, s), WhitePixel(d, s)); Atom type = XInternAtom(d,"_NET_WM_WINDOW_TYPE", False); Atom value = XInternAtom(d,"_NET_WM_WINDOW_TYPE_SPLASH", False); XChangeProperty(d, w, type, XA_ATOM, 32, PropModeReplace, reinterpret_cast(&value), 1); /* register interest in the delete window message */ Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False); XSetWMProtocols(d, w, &wmDeleteMessage, 1); /* select kind of events we are interested in */ XSelectInput(d, w, ExposureMask | KeyPressMask | StructureNotifyMask); /* map (show) the window */ XMapWindow(d, w); /* event loop */ while (!done) { XNextEvent(d, &e); /* draw or redraw the window */ if (e.type == Expose) { XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg)); } /* exit on key press */ switch(e.type) { case KeyPress: XDestroyWindow(d, w); break; case DestroyNotify: done = true; break; case ClientMessage: if (e.xclient.data.l[0] == wmDeleteMessage) { done = true; } break; } } /* close connection to server */ XCloseDisplay(d); return 0; }