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编辑框光标不闪烁的主要内容,如果未能解决你的问题,请参考以下文章

win10此电脑搜索框点了没反应,不出现闪烁的光标,左下角的搜索也用不了,怎么解决?

win32编辑框设置提示文字

Win32 中仅接受文本框(编辑控件)中的字符和空格

在word2016窗口的编辑区闪烁的一条竖线表示啥

win32选择全部编辑ctrl(文本框)

当我在计时器中使用 UpdateData(False) 时,窗口的一个多行编辑框闪烁