c ++ win32编辑框光标不闪烁

时间:2013-11-04 11:24:20

标签: c++ winapi visual-c++ caret

我是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)中的插入符号不会闪烁。

如果您需要,请询问更多详情。

3 个答案:

答案 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的全局引用。