1

我正在尝试用 xlib 实现一个输入框,但我找不到任何关于如何显示闪烁光标的 ifnorm。

如下所示: 在此处输入图像描述

如何做呢?

4

2 回答 2

3

xlib没有内置的动画或闪烁概念。您必须运行计时器并定期绘制和擦除光标。

于 2013-11-04T20:34:27.200 回答
1

我使用类似: 这是我的项目http://open.source.sveena.com的摘录 你必须完成缺失的部分。

// call this periodically
void    FlipCaret()
{
       if( !s_caretgc )return;
       if( s_hidecaret )return;
        XACCESSLOCK;
        if( !s_caretgc )return;
       XFillRectangle(s_caretdisplay, s_caretwindow, s_caretgc, s_caretx, s_carety, s_caretcx, s_caretcy);
        XFlush(s_caretdisplay);
        s_caretvisible = s_caretvisible ? 0 : 1;
}

// to create and destroy caret
static void     s_DestroyCaret()
{
        if( !s_caretgc )return;
        XACCESSLOCK;
        if( s_caretgc ){
                if( s_caretvisible ){
                        FlipCaret();
                }
                XFreeGC( s_caretdisplay, s_caretgc );
                XFlush( s_caretdisplay );
                s_caretgc = 0;
        }
}

static void     s_CreateCaret( MWND* mwnd, Window w )
{
        s_DestroyCaret();
        XACCESSLOCK;
        s_caretdisplay = mwnd->m_Display;
        s_caretmwnd = mwnd;
        s_caretwindow = w;
        s_caretx = mwnd->Caretx;
        s_carety = mwnd->Carety;
        s_caretcx = mwnd->CaretCx;
        s_caretcy = mwnd->CaretCy;
        if( s_caretcx<5 )s_caretcx = 5;
        if( s_caretcx>20 )s_caretcx = 20;
        if( s_caretcy<16 )s_caretcy = 16;
        if( s_caretcy>100 )s_caretcy = 100;
        XGCValues gcval;
        gcval.function = GXinvert;
        gcval.fill_style = FillSolid;
        if( IsValidXWindow( w, "XCreateGC" ) )
        s_caretgc = XCreateGC(s_caretdisplay,w,GCFunction|GCFillStyle,&gcval);
        XFlush( s_caretdisplay );
}
于 2014-10-05T13:35:19.137 回答