2014-01-29 25 views
3

這裏是代碼片段(Xlib的):爲什麼使用XDrawPoint(X Window)無法「平滑」繪製點?

void update_screen() 
{ 
    int X,Y; 
    for (X = 0; X < Wnd_X; X++) 
    for (Y = 0; Y < Wnd_Y; Y++) 
    { 
     XDrawPoint(dsp, win, gc_2, X, Y); 
     usleep(100); 
    } 

    return; 
} 

但它會是這樣的:

然後:

爲什麼點不了用XDrawPoint順利繪製

如何流利地用綠色填充窗口?

全部代碼在這裏:

#include <X11/Xlib.h> // must precede most other headers! 
#include <stdlib.h> 

int Wnd_X=500; 
int Wnd_Y=500; 

void update_screen(); 

GC gc_2; 
Window win; 
Display *dsp; 

int main() 
{ 
    dsp = XOpenDisplay(NULL); 
    int screen = DefaultScreen(dsp); 
    win = XCreateWindow(dsp, DefaultRootWindow(dsp), 0, 0, Wnd_X, Wnd_Y, 0, 0, 0, 0, 0, 0); 
     //XCreateSimpleWindow(dsp, DefaultRootWindow(dsp), 0, 0, Wnd_X, Wnd_Y, 0, 0x000000, 0xFFFFFF); 
    Atom wmDelete = XInternAtom(dsp, "WM_DELETE_WINDOW", True); 
    XSetWMProtocols(dsp, win, &wmDelete, 1); 

    XGCValues gcvalues_2; 
    gcvalues_2.function = GXcopy; 
    gcvalues_2.plane_mask = AllPlanes; 
    gcvalues_2.foreground = 0x00FF00; 
    gcvalues_2.background = 0xFFFFFF; 
    gc_2 = XCreateGC(dsp, win, GCFunction|GCPlaneMask|GCForeground|GCBackground, &gcvalues_2); 

    XEvent evt; 
    long eventMask = StructureNotifyMask; 
    eventMask |= ButtonPressMask|ButtonReleaseMask|KeyPressMask|KeyReleaseMask; 
    XSelectInput(dsp, win, eventMask); 

    XMapWindow(dsp, win); 

    // wait until window appears 
    do { XNextEvent(dsp,&evt); } while (evt.type != MapNotify); 

    update_screen(); 
    XDestroyWindow(dsp, win); 
    XCloseDisplay(dsp); 

    return 0; 
} 

void update_screen() 
{ 
    int X,Y; 
    for (X = 0; X < Wnd_X; X++) 
    for (Y = 0; Y < Wnd_Y; Y++) 
    { 
     XDrawPoint(dsp, win, gc_2, X, Y); 
     usleep(100); 
    } 

    return; 
} 
+0

你必須要求'ulseep(100)'?它會導致像素繪製延遲。 –

+0

@jayeshbhoi這是必須的。 :-)沒有它,窗口會立即填充。 –

+0

好吧,但你是否已經使用(x11)xilb與其他工具進行填充,如OpenGL ES,或者您可以使用'XFillRectangle()'api通過縮小窗口大小。 –

回答

2

您需要更新刷新到X服務器。試試這個:

​​
+0

+1太棒了!我最終解決了這個問題! –