C++ 使用WinAPI从编辑控件获取文本

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,

基本上,我是在尝试从文本字段获取文本,据我所知,您是从GetWindowText获取指针,对吗?我无法将文本放入长字符,所以我必须使用int,消息框不接受int,所以我必须转换为长字符,然后反转指针(&)?在信息框中显示文本,这给我带来了一大堆废话

案例创建:

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
是错误的。也不要忘记释放你分配的内存。