【问题标题】:Trying to capture text from an edit box on button click and then display to another edit box尝试在单击按钮时从编辑框中捕获文本,然后显示到另一个编辑框
【发布时间】:2013-12-02 12:26:34
【问题描述】:

我对 Win32 gui 编码非常陌生,并且在捕获用户输入方面遇到了很多困难。

基本上我要做的是让用户在文本框中输入一些文本(称为文本框 A),单击一个按钮,然后将该文本复制到另一个文本框中(称为文本框 B)。我正在尝试使用 GetWindowsText() 函数将文本框 A 中的文本复制到缓冲区,然后在单击按钮时向文本框 B 发送消息,将文本设置为缓冲区的内容。简单吧? ...我的回调代码是:

    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
        case IDC_MAIN_BUTTON:
        {
            GetWindowText(hwnd_path, buffer, 5);
            SendMessage(hEdit,WM_SETTEXT,NULL,(LPARAM)buffer);
            MessageBox(NULL, buffer, TEXT("Edit Text"), MB_OK);
        }
        break;
    }
    break;

hwnd_path 是文本框 A 的句柄,hEdit 是文本框 B 的句柄,缓冲区已声明为:TCHAR buffer[6] - 这些变量已全局声明,因此它们都应该在回调函数的范围内。我添加了消息框只是为了仔细检查缓冲区的值。

问题是单击按钮后,文本框 B 或消息框中都没有出现任何内容 - 在 GetWindowText(hwnd_path, buffer, 5) 命令之后,缓冲区似乎仍然是空的。

如果有人能提供任何建议,我将不胜感激。

杰克

【问题讨论】:

  • 你调试了吗?并且更好地使用 SetWindowText 并在以后强制重绘。
  • GetWindowText 返回什么?如果返回 0,则调用 GetLastError 并查找错误代码。
  • 您好,感谢您迄今为止的建议。调试时,似乎缓冲区值以值“\000\000\000\000\000”开头(我发现这令人不安,因为它似乎有比它初始化时更多的元素:/)并且是没有被 GetWindowText() 调用改变......我试图坚持使用 GetWindowText() 函数,因为我的真正目标是能够从文本框中获取用户输入,将其存储在变量中,然后使用我的一些代码处理它已经写了。任何更多的想法都会很受欢迎:)
  • '\000' 等于 '\0' 等于 0。寻求 ScottMcP-MVP 的建议。
  • GetWindowText的返回值是多少? GetWindowText返回0时GetLastError()的返回值是多少?

标签: c++ c winapi settext


【解决方案1】:

使用 SetWindowText 而不是调用 SendMessage。

我怀疑您的 hEdit 和/或 hwnd_path 句柄不是您认为的那样。确保这些 HWND 变量在您创建它们时实际上引用了您的编辑和文本控制句柄。

不要期望对话框在您调用“MessageBox”后立即更新。 SetWindowText API 可能需要一些内部消息帖子才能真正完成。 MessageBox 会在内部泵送消息,所以这可能没问题。

这里有一些可以工作的示例代码。它是在 DialogBox wndproc 中编写的。如果您在对话框中,请将对 GetDlgItem 的两个调用替换为创建编辑和文本字段时返回的窗口句柄的分配。

    case WM_COMMAND:
    {
        switch LOWORD(wParam)
        {
            case IDC_BUTTON1:
            {
                wchar_t szEditText[300] = {0};

                // If you aren't using DialogBox(), then replace these apis by assigneing hEdit and hText with the HANDLES of your created controls.
                HWND hEdit = GetDlgItem(hwnd, IDC_EDIT1);
                HWND hText = GetDlgItem(hwnd, IDC_TEXT1);

                GetWindowText(hEdit, szEditText, ARRAYSIZE(szEditText));
                SetWindowText(hText, szEditText);

                // If this Window was created with DialogBox, then return TRUE
                // Otherwise, return 0.
                return TRUE;
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多