如何更改窗口从垂直方向闪烁光标形状,默认情况下(|)为水平方向,如dos(_)中所用。
是否有一些好的功能可以照顾到它?
操作系统:win7
答案 0 :(得分:3)
这实际上称为插入符号,而不是游标。这可能是混乱的来源,以及为什么寻找解决方案并没有产生太大的用处。 NullPonyPointer's comment也反映了这种常见的混淆。 SetCursor
函数确实是您想要更改鼠标光标的功能,但它无法更改插入符号。
幸运的是,有一组Windows功能可以使用插入符:CreateCaret
,ShowCaret
,HideCaret
,SetCaretPos
和DestroyCaret
。还有其他一些操作眨眼时间,但我建议坚持用户的当前设置(这将是默认设置)。
首先,有点背景知识。我强烈建议您阅读两篇MSDN简介文章about carets和using 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_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;
}