C++ 使用WinAPI从编辑控件获取文本
基本上,我是在尝试从文本字段获取文本,据我所知,您是从GetWindowText获取指针,对吗?我无法将文本放入长字符,所以我必须使用int,消息框不接受int,所以我必须转换为长字符,然后反转指针(&)?在信息框中显示文本,这给我带来了一大堆废话 案例创建:C++ 使用WinAPI从编辑控件获取文本,c++,winapi,C++,Winapi,基本上,我是在尝试从文本字段获取文本,据我所知,您是从GetWindowText获取指针,对吗?我无法将文本放入长字符,所以我必须使用int,消息框不接受int,所以我必须转换为长字符,然后反转指针(&)?在信息框中显示文本,这给我带来了一大堆废话 案例创建: textbox1 = CreateWindow(L"EDIT", L"X0", WS_BORDER | WS_CHILD | WS_VISIBLE, 50, 120, 50, 20,
textbox1 = CreateWindow(L"EDIT",
L"X0", WS_BORDER | WS_CHILD | WS_VISIBLE,
50, 120, 50, 20,
hwnd, NULL, NULL, NULL);
case 111:{
TCHAR buff[1024];
int text = GetWindowText(textbox1, buff, 1024);
TCHAR textS = (TCHAR)text;
MessageBox(hwnd, &textS, &textS, MB_OKCANCEL | MB_ICONEXCLAMATION);}
case WM_命令:
textbox1 = CreateWindow(L"EDIT",
L"X0", WS_BORDER | WS_CHILD | WS_VISIBLE,
50, 120, 50, 20,
hwnd, NULL, NULL, NULL);
case 111:{
TCHAR buff[1024];
int text = GetWindowText(textbox1, buff, 1024);
TCHAR textS = (TCHAR)text;
MessageBox(hwnd, &textS, &textS, MB_OKCANCEL | MB_ICONEXCLAMATION);}
仅使用(wchar\u t/TCHAR)缓冲区:
int cTextLength; // text length
cTextLength = GetWindowTextLength(hWndEdit);// get text length
wchar_t * textS = new wchar_t[cTextLength + 1]; //dynamically allocate buffer
// get text from an edit and store it into a buffer variable
GetWindowText(hWndEdit, textS, cTextLength + 1);
// display the message
MessageBox(NULL, textS, textS, MB_OKCANCEL | MB_ICONEXCLAMATION);
delete[] textS; // free the allocated memory
GetWindowText()
的返回值是复制文本的长度(不包括空终止符)。您正在将该值强制转换为单个TCHAR
字符,然后将该单个字符的内存地址传递给MessageBox()
。这完全是错误的MessageBox()
需要指向以null结尾的字符串的指针,因此您应该传递复制的TCHAR[]
缓冲区:
TCHAR buff[1024] = {0};
GetWindowText(textbox1, buff, 1024);
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION);
int len = GetWindowTextLength(textbox1) + 1;
TCHAR *buff = new TCHAR[len];
len = GetWindowText(textbox1, buff, len);
buff[len] = 0;
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION);
delete[] buff;
或者,使用动态分配的缓冲区:
TCHAR buff[1024] = {0};
GetWindowText(textbox1, buff, 1024);
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION);
int len = GetWindowTextLength(textbox1) + 1;
TCHAR *buff = new TCHAR[len];
len = GetWindowText(textbox1, buff, len);
buff[len] = 0;
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION);
delete[] buff;
删除
TCHAR文本=(TCHAR)文本
只需使用buff
:“如果函数成功,返回值是复制的字符串的长度(以字符为单位),不包括终止的空字符。”您在哪里看到“您从GetWindowText获取指针”?哦,我用了另一种方式使用此函数,因为Richard说我只需要打印“buff”,这对我来说是意外的,现在一切都有意义了GetWindowTextLength()
返回的是int
,而不是size\u t
。如果文本大于1023个字符,此代码将溢出缓冲区。如果您要使用GetWindowTextLength()
,则可以根据报告的实际长度动态分配文本
,或者至少使用min()
将cTextLength
的值限制为1023最大值。对,您是Remy。我已经按照你的指示更新了答案。我不确定它是否应该是newwchar__t[cTextLength]代码>或新的wchar\u t[cTextLength+1]代码>?由GetWindowTextLength()
返回的长度不包含空终止符,但传递给GetWindowText()
的大小包含空终止符,因此分配cTextLength
字符,然后传递cTextLength+1
是错误的。也不要忘记释放你分配的内存。