2015-01-06 70 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