2016-11-22 43 views
-2

所以基本上我是从文本字段中试图获取文本编辑控件获取文本,因为我知道你从GetWindowText时得到指针是吗?我不能将该文本放置在长字符中,所以我不得不使用int和消息框来取整数,所以我必须转换成长字符,然后反转指针(&)?显示在消息框中的文本和刚刚打印我一串无义的使用WinAPI的

情况WM_CREATE:

textbox1 = CreateWindow(L"EDIT", 
      L"X0", WS_BORDER | WS_CHILD | WS_VISIBLE, 
      50, 120, 50, 20, 
      hwnd, NULL, NULL, NULL); 

情况WM_COMMAND:

case 111:{   
TCHAR buff[1024]; 
int text = GetWindowText(textbox1, buff, 1024); 
TCHAR textS = (TCHAR)text; 
MessageBox(hwnd, &textS, &textS, MB_OKCANCEL | MB_ICONEXCLAMATION);} 
+1

删除'TCHAR文本= (TCHAR)文本;'只使用'buff'。 –

+0

[来自MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/ms633520(v = vs.85).aspx):“如果函数成功,返回值是长度,以字符形式复制的字符串,不包括终止空字符。“你在哪里看到“你从GetWindowText得到指针”? – andlabs

+0

哦,我用其他方式使用这个函数,因为理查德说我只是需要打印“buff”,这对我来说是意想不到的,现在一切都变得有意义 – sanxe

回答

1

GetWindowText()的返回值是长度复制的文本(不包括空终止符)。您将该值类型转换为单个TCHAR字符,然后将该单个字符的内存地址传递给MessageBox()。这显然是错误的。 MessageBox()需要一个指向空结尾的字符串,所以你应该改为通过你的复制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; 
1

使用(wchar_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 
+0

'GetWindowTextLength()'返回一个'int',而不是'size_t'。如果文本大于1023个字符,此代码将溢出缓冲区。如果你打算使用'GetWindowTextLength()',那么要么根据报告的实际长度动态分配'textS',要么至少使用'min()'将'cTextLength'的值限制为1023 max。 –

+0

你是雷米吧。我已根据您的指示更新了答案。我不确定它应该是'new wchar_t [cTextLength];'还是'new wchar_t [cTextLength + 1];'? – 2016-11-22 21:52:30

+0

'GetWindowTextLength()'返回的长度不包括空终止符,但是传递给'GetWindowText()'的大小确实如此,因此分配'cTextLength'字符然后传递'cTextLength + 1'是错误的。另外不要忘记你分配的内存空间。 –