如何从c ++更改窗口闪烁光标形状?

时间:2012-11-18 11:33:26

标签: windows cursor blink

如何更改窗口从垂直方向闪烁光标形状,默认情况下(|)为水平方向,如dos(_)中所用。

是否有一些好的功能可以照顾到它?

操作系统:win7

1 个答案:

答案 0 :(得分:3)

这实际上称为插入符号,而不是游标。这可能是混乱的来源,以及为什么寻找解决方案并没有产生太大的用处。 NullPonyPointer's comment也反映了这种常见的混淆。 SetCursor函数确实是您想要更改鼠标光标的功能,但它无法更改插入符号。

幸运的是,有一组Windows功能可以使用插入符:CreateCaretShowCaretHideCaretSetCaretPosDestroyCaret。还有其他一些操作眨眼时间,但我建议坚持用户的当前设置(这将是默认设置)。

首先,有点背景知识。我强烈建议您阅读两篇MSDN简介文章about caretsusing carets。但这里有一个简短的总结:插入符号由一个窗口拥有;特别是,当前具有焦点的窗口。此窗口可能类似于文本框控件。当窗口接收焦点时,它会创建一个使用的插入符号,然后当它失去焦点时,它会破坏其插入符号。显然,如果您不手动执行任何操作,您将收到默认实现。

现在,示例代码。因为我喜欢糖果机接口,所以我将它包装在一个函数中:

bool CreateCustomCaret(HWND hWnd, int width, int height, int x, int y)
{
    // Create the caret for the control receiving the focus.
    if (!CreateCaret(hWnd,    /* handle to the window that will own the caret */
                     NULL,    /* create a solid caret using specified size    */
                     width,   /* width of caret, in logical units             */
                     height)) /* height of caret, in logical units            */
        return false;

    // Set the position of the caret in the window.
    if (!SetCaretPos(x, y))
        return false;

    // Show the caret. It will begin flashing automatically.
    if (!ShowCaret(hWnd))
        return false;

    return true;
}

然后,在回复WM_SETFOCUSEN_SETFOCUS或类似通知时,我会调用CreateCustomCaret函数。在回复WM_KILLFOCUSEN_KILLFOCUS或其他类似通知时,我会致电DestroyCaret()

或者,CreateCustomCaret可以从位图创建插入符号。我可能会提供以下重载:

bool CreateCustomCaret(HWND hWnd, HBITMAP hbmp, int x, int y)
{
    // Create the caret for the control receiving the focus.
    if (!CreateCaret(hWnd,   /* handle to the window that will own the caret   */
                     hBmp,   /* create a caret using specified bitmap          */
                     0, 0))  /* width and height parameters ignored for bitmap */
        return false;

    // Set the position of the caret in the window.
    if (!SetCaretPos(x, y))
        return false;

    // Show the caret. It will begin flashing automatically.
    if (!ShowCaret(hWnd))
        return false;

    return true;
}