我是Windows编程的新手,我不断遇到各种各样的问题,其中大部分都是我自己能够解决的问题。
我手头的问题是文本区域中显示的插入符号(或光标)。表明你在哪里输入文字的东西?好吧,它至少显示出来,但不会像它应该的那样闪烁。
我在WM_CREATE中创建了一个EDIT框,如下所示:
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)中的插入符号不会闪烁。
如果您需要,请询问更多详情。
答案 0 :(得分:4)
使用你的代码,我没有得到闪烁的插入符号。但后来我补充道:
SetFocus( userField );
和voilà,一个闪烁的插入符号: - )
答案 1 :(得分:1)
这可能不是OP遇到的问题,但我遇到了同样的症状,我在这里发布我的解决方案以防其他人遇到这个问题......
简而言之,如果您子类化编辑控件并处理WM_SETFOCUS事件,则需要调用DefSubclassProc(),否则您的插入符号将不会显示。据推测,你可以自己调用ShowCaret(),但是如果需要进行其他处理,你可能更安全地调用DefSubclassProc()。
答案 2 :(得分:0)
玩完之后 - 让我的代码更整洁一点 - 我不小心自己解决了这个问题
我改变了
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的全局引用。