3

如何将窗口闪烁光标形状从默认情况下的垂直(|)更改为水平,就像在 dos(_)中使用的那样。

有什么好的功能可以解决这个问题吗?

操作系统:win7

4

1 回答 1

3

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

幸运的是,有一整组 Windows 函数可以使用脱字符号:CreateCaret、、、、和。还有其他一些用于操纵眨眼时间的方法,但我建议坚持用户的当前设置(这将是默认设置)。ShowCaretHideCaretSetCaretPosDestroyCaret

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

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

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_SETFOCUS,EN_SETFOCUS或类似的通知,我会调用该CreateCustomCaret函数。为了响应WM_KILLFOCUS,EN_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;
}
于 2013-04-04T00:28:58.037 回答