如何将窗口闪烁光标形状从默认情况下的垂直(|)更改为水平,就像在 dos(_)中使用的那样。
有什么好的功能可以解决这个问题吗?
操作系统:win7
这实际上称为插入符号,而不是游标。这可能就是混乱的来源,以及为什么寻找解决方案并没有产生太多的用处。NullPonyPointer 的评论也反映了这种常见的混淆。该SetCursor
功能确实是您想要更改鼠标光标的功能,但无法更改插入符号。
幸运的是,有一整组 Windows 函数可以使用脱字符号:CreateCaret
、、、、和。还有其他一些用于操纵眨眼时间的方法,但我建议坚持用户的当前设置(这将是默认设置)。ShowCaret
HideCaret
SetCaretPos
DestroyCaret
首先,一点背景。我强烈建议阅读关于插入符号和使用插入符号的两篇介绍性 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;
}