2013-11-04 107 views
2

我是windows编程的新手,并且不断遇到各种各样的问题,其中大部分问题我都能够自己解决。C++ win32编辑框光标不闪烁

我手边的问题是文本区域中显示的插入符(或光标)。指示你在哪里输入文字的东西?那么它至少表现出来,但它不会像应该那样闪烁。

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

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

+2

Unicode不应该假设为btw,这种代码写入的方式很可能是调用'CreateWindowA'例如ANSI版本。 Unicode版本将'LPCWSTR'作为第一个参数,传递一个'LPCSTR'。我会**高度**建议确保您将字符集设置为Unicode,如果您使用的是VS,或者如果不是,则定义“UNICODE”和“_UNICODE”。 – Mgetz

+0

哦,原来就是这样。我从VS2012升级到VS2013,突然我所有的L字符串都出错了,我不得不将它改成只字符串。我将UNICODE和_UNICODE都添加到我的预处理器定义中,一切都恢复正常。 –

+0

你应该不需要手动执行该操作,你应该检查你可能设置为MBCS的VC++项目设置 – Mgetz

回答

4

使用你的代码,我没有得到一个闪烁的插入符号。但后来我又说:

SetFocus(userField); 

就万事大吉了,一个闪烁的插入符号:-)

+0

它对我没有任何帮助。我在WM_CREATE结尾添加了 - 你把它放在哪里? –

+0

在WM_CREATE末尾。 – manuell

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。

+0

其他地方一定有别的东西。通过使用确切的CreateWindow代码,我再现了您的问题(没有焦点时没有脱字符,也没有* realy *问题...),并且只通过SetFocus添加了“固定”它。奇怪的。 – manuell

+0

哦。你一定误解了这个问题。问题不在于没有焦点(如你所说的,并非真正的问题......),但是当焦点集中时插入符号不会闪烁。当我说不眨眼时,我的意思是有一个插入符号 - 它只是不闪烁。 –

+0

对不起。我的答案根本就不相关。是“不闪烁”的插入符号? (使用箭头键或鼠标时,ID会移动) – manuell

1

这可能不是OP中遇到的问题,但我遇到同样的症状,我在这里发布我的解决方案的情况下,别人的经验这个问题...

总之,如果你子类编辑控件,并处理WM_SETFOCUS事件,您需要调用DefSubclassProc()或您的脱字符不会显示。据推测,你可以自己调用ShowCaret(),但只要调用DefSubclassProc()就可以更安全,以防需要发生其他处理。