【问题标题】:Problem with using Buttons to fill an Edit control使用按钮填充编辑控件的问题
【发布时间】:2021-11-20 01:34:48
【问题描述】:

在 Win32 API 的帮助下,我正在制作一个带有 C++ 接口的基本计算器。我已经完成了图形部分(我将在下面留下截图),现在我需要完成代码。

我已经可以使用按钮将文本添加到编辑控件。我希望在选择按钮 1 和 2 时,输入数字 12。

问题是这样做时,一个数字会覆盖另一个数字。如果我选择按钮 1,然后选择 2,则写入数字 1,然后将其擦除并写入 2。

你知道我该如何解决吗?我也想知道如何将 Edit 控件中的数据保存在变量中,然后对其进行操作。

对不起,如果这些是一些基本的东西,我刚刚开始使用 Win32 API。我把我所拥有的代码留给你,非常感谢:)

#include <windows.h>
#include "resource.h"

HWND text;
BOOL CALLBACK mycallback(HWND window, UINT message, WPARAM wParam, LPARAM lParam) {
    
    switch (message) {
    case WM_CLOSE: {
        DestroyWindow(window);
        break;
    }
    case WM_DESTROY: {
        PostQuitMessage(0);
        break;
    }
    case WM_INITDIALOG:
    {
        text = GetDlgItem(window, IDC_EDIT1);
        break;
    }
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDC_BUTTON1:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"1");
            break;          
        }
        case IDC_BUTTON2:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"2");
            break;
        }
        case IDC_BUTTON3:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"3");
            break;
        }
        case IDC_BUTTON4:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"4");
            break;
        }
        case IDC_BUTTON5:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"5");
            break;
        }
        case IDC_BUTTON6:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"6");
            break;
        }
        case IDC_BUTTON7:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"7");
            break;
        }
        case IDC_BUTTON8:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"8");
            break;
        }
        case IDC_BUTTON9:
        {
            SendMessage(text, WM_SETTEXT, 0, (LPARAM)"9");
            break;
        }
        case IDC_BUTTON10:
        {
            SendMessage(text, WM_SETTEXT, 0,(LPARAM)"0");
            break;
        }
        }
    }
    return false;
}

int WINAPI WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d) {
    DialogBox(a, MAKEINTRESOURCE(IDD_DIALOG1), NULL, mycallback);
    return 0;
}

【问题讨论】:

    标签: c++ visual-studio winapi


    【解决方案1】:

    最简单的方法是先获取控件的文本,在其上附加一个新数字,然后对其进行设置。

    GetWindowTextSetWindowText

    【讨论】:

      【解决方案2】:

      可以使用GetWindowText 请求当前文本,附加新文本,然后再次调用SetWindowText

      或者简单地使用Edit control 的内置功能,并向其发送EM_REPLACESEL 消息。如果没有选择,则在当前插入符号位置插入新文本。

      最好将文本读回变量中以响应EN_CHANGE 通知。

      【讨论】:

      • 如果有选择,但您仍想追加,那么您必须先发出 EM_SETSEL 删除当前选择并将插入符号移动到当前文本的末尾,然后发出EM_REPLACESEL 追加新文本,然后再次发出 EM_SETSEL 以恢复之前的选择。
      • @rem 如果您确实想保留并忽略选择,那么这就是您需要做的。保留和忽略编辑控件的选择几乎不是预期的默认行为。无论您如何附加文本,您都必须这样做,因此发送EM_REPLACESEL 仍然更容易。
      猜你喜欢
      • 2018-08-03
      • 2022-08-23
      • 2012-03-19
      • 2012-02-28
      • 2022-07-06
      • 1970-01-01
      • 2021-12-28
      • 2013-03-02
      • 1970-01-01
      相关资源
      最近更新 更多