C++ Win32获取文本框输入传入MessageBox及表达式错误修复
问题根源
你遇到的expression cannot be used as a function编译错误,直接触发原因是MessageBox调用里的字符串参数写法不符合C++语法:
"I am" ()textSaved "and i am Beautiful!"
C++仅支持相邻的字符串字面量自动拼接,字符数组变量不能直接和字面量靠在一起拼接。你写的空括号()会让编译器认为你要把"I am"这个const char*当作函数调用、传入textSaved作为参数,自然会报“表达式不能作为函数使用”的错误。
除此之外你的代码还有两处逻辑问题会导致运行/编译异常:
WM_COMMAND分支写法完全错误:你是在switch (message)结构下写分支,case 1:对应的是消息码值为1的系统消息,和ID为1的按钮完全无关,按钮点击的逻辑永远不会被触发;且两个case之间没有break,会导致分支穿透。- case分支内直接定义局部变量,不加块作用域大括号会触发变量重定义/作用域相关的编译错误。
修正方案
- 修复
WM_COMMAND分支判断逻辑:收到WM_COMMAND消息时,先判断低16位wParam是不是按钮ID 1,高16位wParam是不是按钮点击通知BN_CLICKED,再执行后续逻辑。 - 提前定义足够长度的输出缓冲区,用字符串拷贝/拼接函数把前缀、输入内容、后缀拼到缓冲区里,再传给MessageBox。
- 给每个case内的逻辑块加上大括号明确作用域,避免变量作用域编译错误。
修正后的核心消息处理逻辑参考:
switch (message) { case WM_CREATE: { TextBox = CreateWindowA("EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER, 10,10,80,20, hwnd,NULL,NULL,NULL); CreateWindowA("BUTTON", "GO", WS_VISIBLE|WS_CHILD|WS_BORDER, 100,10,70,20, hwnd,(HMENU)1,NULL,NULL); break; } case WM_COMMAND: { // 判断是否为ID=1的按钮触发的点击事件 if (LOWORD(wParam) == 1 && HIWORD(wParam) == BN_CLICKED) { char textSaved[50] = {0}; char msgBuf[256] = {0}; GetWindowTextA(TextBox, textSaved, sizeof(textSaved)); // 拼接待展示的字符串 strcpy(msgBuf, "I am "); strcat(msgBuf, textSaved); strcat(msgBuf, " and i am Beautiful!"); MessageBoxA( hwnd, msgBuf, "smile", MB_YESNO); } break; } // 其余原有消息分支保持不变 }
注:如果你项目配置的是Unicode字符集,把上述代码里的
char替换为wchar_t,strcpy/strcat替换为wcscpy/wcscat,CreateWindowA/GetWindowTextA/MessageBoxA替换为不带A后缀的默认宏版本即可。
内容的提问来源于stack exchange,提问作者Keldroph
相关产品推荐
相关产品推荐

