c++ win32编辑框光标不闪烁
Posted
技术标签:
【中文标题】c++ win32编辑框光标不闪烁【英文标题】:c++ win32 edit box cursor not flashing 【发布时间】:2013-11-04 11:24:20 【问题描述】:我是windows编程的新手,不断遇到各种各样的问题,其中大部分都是我自己能够解决的。
我手头的问题是文本区域中显示的插入符号(或光标)。指示您在哪里输入文本的东西?好吧,至少它显示出来了,但它并没有像应有的那样闪烁。
我在 WM_CREATE 中创建了一个编辑框,如下所示:
case WM_CREATE:
if(!logged)
HWND userField = CreateWindow(
"EDIT", // Predefined class; Unicode assumed
NULL, // Button text
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, // Styles
C_WIDTH/2 - 80, // x position
C_HEIGHT - 240, // y position
160, // Button width
25, // Button height
hwnd, // Parent window
NULL, // No menu.
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // Pointer not needed.
// initialize NONCLIENTMETRICS structure
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
// obtain non-client metrics
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
// create the new font
HFONT hNewFont = CreateFontIndirect(&ncm.lfMessageFont);
// set the new font
SendMessage(userField, WM_SETFONT, (WPARAM)hNewFont, 0);
break;
这就是关于编辑框的所有代码。如果我不够清楚或缺少我的代码供应,我很抱歉;我不确定代码的哪些部分在这里是相关的,哪些是不相关的。我也不认为我应该将整个代码粘贴到这里。
问题再次是文本框 (userField) 中的插入符号不闪烁。
如果您需要,请询问更多详细信息。
【问题讨论】:
不应该假定 Unicode 顺便说一句,这段代码的编写方式你很可能调用CreateWindowA
例如ANSI 版本。 Unicode 版本将LPCWSTR
作为第一个参数,您传递的是LPCSTR
。我会强烈建议如果您使用 VS,请确保您将字符集设置为 Unicode,或者如果您不是,请同时定义 UNICODE
和 _UNICODE
。
哦,原来如此。我从 VS2012 升级到 VS2013,突然我所有的 L"string" 都错了,我不得不把它改成只有 "string"。我将 UNICODE 和 _UNICODE 添加到我的预处理器定义中,一切都恢复正常。
您不需要手动执行此操作,您应该检查您可能设置为 MBCS 的 VC++ 项目设置
【参考方案1】:
使用您的代码,我没有得到闪烁的插入符号。但后来我补充说:
SetFocus( userField );
瞧,一个闪烁的插入符号:-)
【讨论】:
这对我没有用。我在 WM_CREATE 的末尾添加了它 - 你把它放在哪里了? 在 WM_CREATE 结束时。【参考方案2】:这可能不是 OP 遇到的问题,但我遇到了同样的症状,我在此处发布我的解决方案以防其他人遇到此问题...
简而言之,如果您将一个编辑控件子类化并处理 WM_SETFOCUS 事件,您需要调用 DefSubclassProc() 否则您的插入符号将不会出现。据推测,您可以自己调用 ShowCaret(),但如果需要进行其他处理,则调用 DefSubclassProc() 可能更安全。
【讨论】:
【参考方案3】:玩过之后——让我的代码更整洁一些——我不小心自己解决了这个问题
我变了
HWND userField = CreateWindow(
"EDIT", // Predefined class; Unicode assumed
NULL, // Button text
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, // Styles
C_WIDTH/2 - 80, // x position
C_HEIGHT - 240, // y position
160, // Button width
25, // Button height
hwnd, // Parent window
NULL, // No menu.
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // Pointer not needed.
进入
HWND userField = CreateWindow("EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
C_WIDTH/2 - 80, C_HEIGHT - 240, 160, 25, hwnd, NULL, g_hInstance, NULL);
唯一的区别是 hInstance:在第一个代码中它显然是错误的。我将其更改为 hInstance 的全局引用。
【讨论】:
在别处肯定有别的东西。我通过使用您的确切 CreateWindow 代码重现了您的问题(没有焦点时没有插入符号,不是 真正 问题......),并仅通过添加 SetFocus 来“修复”它。很奇怪。 哦。你一定误解了这个问题。问题不在于没有焦点时没有插入符号(正如您所说,这不是真正的问题......),而是有焦点时插入符号没有闪烁。当我说没有闪烁的插入符号时,我的意思是有一个插入符号 - 它只是没有闪烁。 对不起。我的回答根本不相关。是“非闪烁”插入符号功能吗? (使用箭头键或鼠标时,id 会移动) 是的,一切正常。插入符号只是没有闪烁 :D 这是这些小问题之一,让您非常恼火。 好的,如果您想进一步调查根本原因,或者您是否对“现在可以工作”感到满意,请告诉我:-)以上是关于c++ win32编辑框光标不闪烁的主要内容,如果未能解决你的问题,请参考以下文章