我是Win32 gui编码的新手,在捕获用户输入方面遇到了很多困难。
基本上我要做的是让用户在文本框中输入一些文本(称之为文本框A),单击一个按钮,然后将该文本复制到另一个文本框中(称之为文本框B)。我正在尝试使用GetWindowsText()
函数将文本框A中的文本复制到缓冲区,然后在单击按钮时向文本框B发送消息,将文本设置为等于缓冲区的内容。简单吧? ...我的回调代码是:
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_MAIN_BUTTON:
{
GetWindowText(hwnd_path, buffer, 5);
SendMessage(hEdit,WM_SETTEXT,NULL,(LPARAM)buffer);
MessageBox(NULL, buffer, TEXT("Edit Text"), MB_OK);
}
break;
}
break;
hwnd_path是文本框A的句柄,hEdit是文本框B的句柄,缓冲区已声明为:TCHAR buffer[6]
- 这些变量已全局声明,因此它们都应该在回调函数的范围内。我已经添加了消息框,只是为了仔细检查缓冲区的值。
问题是单击按钮后文本框B或消息框中都没有显示任何内容 - 在GetWindowText(hwnd_path, buffer, 5)
命令后,缓冲区似乎仍为空。
如果有人能提供任何建议,我将非常感激。
杰克
答案 0 :(得分:1)
使用SetWindowText而不是调用SendMessage。
我怀疑你的hEdit和/或hwnd_path句柄不是你认为的那样。确保这些HWND变量在创建时实际引用了编辑和文本控制句柄。
在调用“MessageBox”后,不要指望对话框立即更新。可能需要一些内部消息帖子才能使SetWindowText API实际完成。 MessageBox会在内部发送消息,所以这可能没问题。
这是一些可行的示例代码。它是在DialogBox wndproc中编写的。如果您在一个对话框中,请将两个对GetDlgItem的调用替换为创建编辑和文本字段时返回的窗口句柄的分配。
case WM_COMMAND:
{
switch LOWORD(wParam)
{
case IDC_BUTTON1:
{
wchar_t szEditText[300] = {0};
// If you aren't using DialogBox(), then replace these apis by assigneing hEdit and hText with the HANDLES of your created controls.
HWND hEdit = GetDlgItem(hwnd, IDC_EDIT1);
HWND hText = GetDlgItem(hwnd, IDC_TEXT1);
GetWindowText(hEdit, szEditText, ARRAYSIZE(szEditText));
SetWindowText(hText, szEditText);
// If this Window was created with DialogBox, then return TRUE
// Otherwise, return 0.
return TRUE;
}