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

如何将Win32 EDIT控件输入文本存入C++ std::string?

如何将Win32 EDIT控件的输入文本存入C++ std::string

当然可以用std::string来存储EDIT控件的输入文本,它比固定大小的char数组更安全、灵活,不用担心缓冲区溢出的问题。下面是两种实用的实现方法,直接替换你现有代码里的char数组逻辑就行:

方法一:先获取文本长度,按需分配空间(推荐)

这种方法会先获取控件中文本的实际长度,再给std::string分配刚好足够的空间,避免内存浪费:

  1. 用GetWindowTextLength获取EDIT控件的文本长度(注意这个值不包含末尾的\0终止符)
  2. 调用std::string::resize调整字符串大小,刚好容纳文本
  3. 用GetWindowTextA把文本写入std::string的底层缓冲区
  4. 用std::string::c_str()把字符串转换成C风格字符串,传给MessageBox

修改后的代码片段如下:

#include <string>  // 别忘了包含std::string的头文件

// 替换原来的char txtStore[200];
std::string txtStore;

/* WM_CREATE 部分保持不变 */
TextBox = CreateWindow("edit", "", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 
                       0, 30, 500, 20, hwnd, (HMENU)0, NULL, NULL);
CreateWindow("button", "Go", WS_VISIBLE | WS_CHILD, 
             500, 30, 100, 20, hwnd, (HMENU)2, NULL, NULL);

/* WM_COMMAND 部分修改为: */
if(LOWORD(wParam) == 2){
    // 获取文本长度(不含终止符)
    int textLen = GetWindowTextLength(TextBox);
    // 调整string大小,预留足够空间
    txtStore.resize(textLen);
    // 将控件文本写入string的缓冲区,textLen+1是为了容纳终止符
    GetWindowTextA(TextBox, &txtStore[0], textLen + 1);
    // 用c_str()转为C风格字符串传给MessageBox
    MessageBoxA(0, txtStore.c_str(), "Title", 0);
}

方法二:直接使用足够大的std::string(简单但稍显浪费)

如果你不想先获取长度,也可以直接初始化一个足够大的std::string,不过这种方法会预先分配固定大小的内存,不如第一种高效:

std::string txtStore(200, '\0');  // 初始化一个200字符的空字符串

if(LOWORD(wParam) == 2){
    GetWindowTextA(TextBox, &txtStore[0], 200);
    MessageBoxA(0, txtStore.c_str(), "Title", 0);
}

注意事项

  • 如果你使用的是Unicode版本的Windows API(定义了UNICODE宏),需要把GetWindowTextA换成GetWindowTextW,同时用std::wstring代替std::string,MessageBoxA换成MessageBoxW。
  • std::string::c_str()返回的指针指向字符串内部的C风格缓冲区,这个指针在std::string被修改或销毁前有效,所以直接传给MessageBox是安全的。

内容的提问来源于stack exchange,提问作者Subha Jeet Sikdar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:26:57