2015-01-06 68 views
1

这个代码总是工作,我不知道什么是错的,见下图:编辑控件文本不能改变

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); 
} 
+0

请发布您的应用程序的消息循环,并提供创建主窗口的代码。你也在泄漏记忆。我可以看到'new wchar_t [len]',但没有附带'delete []'。由于这个问题被标记为* C++ *,您应该使用'std :: vector'而不是手动内存管理。 – IInspectable

+0

@IInspectable我在非托管数组* txt之后添加了整个代码和'delete',但即使在非托管数组之后删除,或者没有WM_COMMAND的内容,它仍然不起作用。 – FelipeDurar

+0

该项目可在http://www.mediafire.com/download/zkfh1u4mi2z4fe4/testEDC.zip – FelipeDurar

回答

5

你缺少TranslateMessage来电您的消息循环,防止产生WM_CHAR/WM_UNICHAR消息键盘输入。这将使您的编辑控件看起来像没有得到任何输入。有关标准消息循环实现,请参阅GetMessage。另外,在分配数组时,需要使用数组删除操作符,即delete[] txt;

+0

工作!非常感谢! – FelipeDurar