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
相关产品推荐
相关产品推荐

