WinAPI 中的编辑控件文本无法更改

Posted

技术标签:

【中文标题】WinAPI 中的编辑控件文本无法更改【英文标题】:Edit Control Text in WinAPI can't be changed 【发布时间】:2015-01-06 13:50:12 【问题描述】:

这段代码一直有效,我不知道哪里出了问题,见下文:

CreateWindowW(L"EDIT", L"Type Here!", WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 150, 25, hwnd, (HMENU)ID_TEXTBOX1, NULL, NULL);

程序运行时创建控件时,可以使用SetWindowText函数选择文本并更改,但不能通过键入更改文本,为什么?

我看过这个栈溢出的话题:win32 api edit control can't be selected or edited,但是即使使用SetFocus函数或者EnableWindow,还是不行。

这是整个过程函数:

#include <windows.h>

// IDs dos controles
#define ID_TEXTBOX1 1000
#define ID_BUTTON1 1001

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPSTR pCmdLine, int nCmdShow)

 MSG msg;
 HWND hwnd;
 WNDCLASSW wc;

 wc.style     = CS_HREDRAW | CS_VREDRAW;
 wc.cbClsExtra  = 0;
 wc.cbWndExtra  = 0;
 wc.lpszClassName = L"WINDOW";
 wc.hInstance   = hInstance;
 wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
 wc.lpszMenuName = NULL;
 wc.lpfnWndProc  = WndProc;
 wc.hCursor    = LoadCursor(NULL, IDC_ARROW);
 wc.hIcon     = LoadIcon(NULL, IDI_APPLICATION);

 RegisterClassW(&wc);
 hwnd = CreateWindowW(L"WINDOW", L"Janela",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        100, 100, 200, 200, NULL, NULL, hInstance, NULL);

 ShowWindow(hwnd, nCmdShow);
 UpdateWindow(hwnd);

 while( GetMessage(&msg, NULL, 0, 0)) 
  DispatchMessage(&msg);


 return (int) msg.wParam;


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
  WPARAM wParam, LPARAM lParam)

 switch(msg)
 
  case WM_CREATE:
      // Here is creted the edit control
      CreateWindowW(L"EDIT", L"Type Here!", WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 150, 25,       hwnd, (HMENU)ID_TEXTBOX1, NULL, NULL);
   // Functions that i tried
   //EnableWindow(GetDlgItem(hwnd, ID_TEXTBOX1), true);
   //SetFocus(GetDlgItem(hwnd, ID_TEXTBOX1));
   // Here is create a button
      CreateWindowW(L"BUTTON", L"Show Text", WS_CHILD | WS_VISIBLE, 10, 45, 100, 20, hwnd, (HMENU)ID_BUTTON1, NULL, NULL);
   break;
 case WM_COMMAND:
   switch (LOWORD(wParam))
   
   case ID_BUTTON1:
       int len = GetWindowTextLengthW(GetDlgItem(hwnd, ID_TEXTBOX1)) + 1;
       wchar_t *txt = new wchar_t[len];
       GetWindowText(GetDlgItem(hwnd, ID_TEXTBOX1), txt, len);
       //
       MessageBox(NULL, txt, L"Info", MB_OK);
       delete txt;
       break;
   
   break;
 case WM_DESTROY:
   PostQuitMessage(0);
   return 0;
 

 return DefWindowProcW(hwnd, msg, wParam, lParam);

【问题讨论】:

请同时发布您的应用程序的消息循环,并提供创建主窗口的代码。你也在泄漏内存。我可以看到new wchar_t[len],但没有伴随的delete[]。由于这个问题被标记为 C++,你应该使用 std::vector 而不是手动内存管理。 @IInspectable 我在非托管数组 *txt 之后添加了整个代码和“删除”,但即使在非托管数组之后删除或没有 WM_COMMAND 的内容,它仍然不起作用。跨度> 该项目在mediafire.com/download/zkfh1u4mi2z4fe4/testEDC.zip中可用 【参考方案1】:

您在消息循环中缺少对TranslateMessage 的调用,从而阻止了键盘输入生成WM_CHAR/WM_UNICHAR 消息。这将使您的编辑控件看起来像没有得到任何输入。有关标准消息循环实现,请参阅 GetMessage。

顺便说一句,在分配数组时,需要使用数组删除操作符,即delete[] txt;

【讨论】:

以上是关于WinAPI 中的编辑控件文本无法更改的主要内容,如果未能解决你的问题,请参考以下文章

winapi中多行编辑中的意外行为

c ++ winapi - 子类化编辑控件 - 单击“Enter”时发出烦人的声音

如何使用 WinAPI 制作可编辑的文本框?

控件的背景颜色(winapi)

如何使用纯 WINAPI 在渐变背景上显示控件?

为了使用 winapi 显示推文,我可以选择的最佳控件是啥?