【问题标题】:unable to get text from edit control in winapi [closed]无法从winapi中的编辑控件获取文本[关闭]
【发布时间】:2012-08-25 20:11:31
【问题描述】:

我无法从主窗口上的编辑控件中检索任何文本。我可以设置在绘制窗口时显示的文本,但我无法获取我想在 MessageBox 中显示的文本。我尝试了“SendMessage()”和“GetWindowText()”,但都做了同样的事情。我正在检索的文本长度似乎也无效,因此即使我可以看到其中的文本,编辑也没有任何价值。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HWND addCust, editCust1, editCust2;

switch (message) {
case WM_CREATE: {
    addCust = CreateWindow(L"BUTTON",L"addCust",
                   WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
                   140,70,100,25,hWnd,(HMENU)IDC_ADDCUST,NULL,NULL);
    editCust1 = CreateWindowEx(WS_EX_CLIENTEDGE,L"EDIT",L"",
                    WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL,
                    50,100,200,20,hWnd,(HMENU)IDC_EDITCUST1,NULL,NULL);
    editCust2 = CreateWindowEx(WS_EX_CLIENTEDGE,L"EDIT",L"",
                    WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL,
                    50,130,200,20,hWnd,(HMENU)IDC_EDITCUST2,NULL,NULL);
    SendMessage(editCust1,WM_SETTEXT,NULL,(LPARAM)L"first name");
    SendMessage(editCust2,WM_SETTEXT,NULL,(LPARAM)L"last name");
    break;
}
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    case IDC_ADDCUST: {
        TCHAR buff[64] = { '\0' };
        int len = SendMessage(editCust1, WM_GETTEXTLENGTH, 0, 0);
        SendMessage(editCust1, WM_GETTEXT, len+1, (LPARAM)buff);
        GetWindowText(editCust1, buff, len+1);
        MessageBox(NULL, buff, L"Information", MB_ICONINFORMATION);
        break;
        }
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

【问题讨论】:

    标签: c++ winapi text controls


    【解决方案1】:
     HWND addCust, editCust1, editCust2;
    

    那行不通,这些是局部变量。在 WM_CREATE 消息处理程序运行并且 WndProc() 方法退出后,它们将失去其价值。当您在 WM_COMMAND 处理程序中再次使用 editCust1 时,变量包含垃圾。顺便说一句,使用调试器很容易看到。您需要将它们设为全局变量,以便它们保持其值。

    buff 声明也是错误的,它只能包含 63 个字符。当编辑控件实际上包含 64 个或更多字符时,您将破坏堆栈帧并(希望)使您的程序崩溃。使用 malloc() 创建一个足够大的缓冲区。

    这些是 C 语言编程的陷阱,它们与 Windows api 几乎没有关系。除了“放慢速度”之外很难给出建议,您确实需要在 Windows 停止让您头疼之前知道 C 是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 2011-11-15
      • 2013-09-05
      • 1970-01-01
      相关资源
      最近更新 更多