2

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

如果您需要,请询问更多详细信息。

4

3 回答 3

4

使用您的代码,我没有得到闪烁的插入符号。但后来我补充说:

SetFocus( userField );

瞧,一个闪烁的插入符号:-)

于 2013-11-04T12:06:45.850 回答
2

这可能不是 OP 遇到的问题,但我遇到了同样的症状,我在这里发布我的解决方案,以防其他人遇到这个问题......

简而言之,如果您将一个编辑控件子类化并处理 WM_SETFOCUS 事件,您需要调用 DefSubclassProc() 否则您的插入符号将不会出现。据推测,您可以自己调用 ShowCaret(),但如果需要进行其他处理,则调用 DefSubclassProc() 可能更安全。

于 2015-05-07T17:46:29.393 回答
1

在玩了一圈之后——让我的代码更整洁一些——我不小心自己解决了这个问题

我变了

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

于 2013-11-04T13:22:26.323 回答