You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32 API开发计算器时按钮点击覆盖Edit控件内容及取值方法问题

问题修复方案

1. 数字覆盖问题修复

你遇到的覆盖问题是因为当前使用的WM_SETTEXT消息本身的作用就是直接替换Edit控件的全部文本内容,每次点击按钮都会清空原有内容写入新字符,自然无法实现拼接效果。
推荐使用更简便的EM_REPLACESEL消息实现追加效果:该消息会在Edit控件的光标当前位置插入新文本,没有手动选中内容时默认会在末尾追加,不需要额外读取原有内容,只需要把所有数字按钮里的WM_SETTEXT调用替换为EM_REPLACESEL即可。
修改后的单按钮处理示例:

case IDC_BUTTON1:
    // 第一个参数为TRUE表示新内容可以被撤销,第二个参数是要插入的文本
    SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"1");
    break;

2. Edit控件内容读取到变量的方法

配合GetWindowTextLength和GetWindowText两个API就能拿到Edit的全部内容,后续可以转成数值类型做运算:

// 先获取文本长度,申请对应大小的缓冲区,+1是给字符串结束符'\0'预留位置
int len = GetWindowTextLength(text) + 1;
TCHAR* inputBuf = new TCHAR[len];
// 读取Edit控件内容到缓冲区
GetWindowText(text, inputBuf, len);

// 转成数值类型做运算示例,转double:
double num = _wtof(inputBuf); // 如果你使用多字节字符集可以替换为atof(inputBuf)

// 用完释放缓冲区
delete[] inputBuf;

如果要实现计算器运算逻辑,可以在点击运算符按钮时把当前Edit的内容存到全局变量,清空Edit后等待输入第二个数字,点击等号时再读取当前内容和之前存储的数字做计算即可。

修改后的完整可运行代码

#include <windows.h>
#include "resource.h"
#include <tchar.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, EM_REPLACESEL, TRUE, (LPARAM)"1");
            break;          
        case IDC_BUTTON2:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"2");
            break;
        case IDC_BUTTON3:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"3");
            break;
        case IDC_BUTTON4:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"4");
            break;
        case IDC_BUTTON5:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"5");
            break;
        case IDC_BUTTON6:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"6");
            break;
        case IDC_BUTTON7:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"7");
            break;
        case IDC_BUTTON8:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"8");
            break;
        case IDC_BUTTON9:
            SendMessage(text, EM_REPLACESEL, TRUE, (LPARAM)"9");
            break;
        case IDC_BUTTON10:
            SendMessage(text, EM_REPLACESEL, TRUE, (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;
}

内容的提问来源于stack exchange,提问作者grey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:45:04