如何将Win32 EDIT控件输入文本存入C++ std::string?
如何将Win32 EDIT控件的输入文本存入C++ std::string
当然可以用std::string来存储EDIT控件的输入文本,它比固定大小的char数组更安全、灵活,不用担心缓冲区溢出的问题。下面是两种实用的实现方法,直接替换你现有代码里的char数组逻辑就行:
方法一:先获取文本长度,按需分配空间(推荐)
这种方法会先获取控件中文本的实际长度,再给std::string分配刚好足够的空间,避免内存浪费:
- 用
GetWindowTextLength获取EDIT控件的文本长度(注意这个值不包含末尾的\0终止符) - 调用
std::string::resize调整字符串大小,刚好容纳文本 - 用
GetWindowTextA把文本写入std::string的底层缓冲区 - 用
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
相关产品推荐
相关产品推荐

