使用SendMessage获取CString值



使用SendMessage,我可以很容易地将CString传递给父级(简化):

CString strText = L"The text";
GetParent()->SendMessage(theApp.UWM_LOADED_SRR_FILE_MSG, 
reinterpret_cast<WPARAM>(strText.GetString()));

父处理程序:

afx_msg LRESULT CMyDialog::OnSetSRRFilename(WPARAM wParam, LPARAM lParam)
{
LPCTSTR szFilename = reinterpret_cast<LPCTSTR>(wParam);
// Do something.
return 0;
}

这是有效的,但另一种方法呢?如何使用消息传递从父级获取当前CString值?我知道我可以直接转换为父对象类型并调用公共方法。但我想使用消息。我的理解是SendMessage正在传递到一个接收文本的位置。

我是不是应该给家长发一条信息,说";我想要字符串";路过我的窗户把手。然后在该处理程序中,它向该处理程序发送一条带有字符串值的消息?

我是不是太复杂了?

字符串值不是控件,只是一个私有变量。

您可以简单地定义一条请求文本的消息。调用方(子级)必须有一个缓冲区才能接收文本。wParam可以是缓冲器长度,lParam可以是缓冲器(指针)。

或者,消息返回值可以是内存对象(句柄或指针),例如由父对象分配并由子对象释放。关于如何定义消息的示例,请查看WM_GETTEXT消息;对于可供选择的CCD_ 6函数。

第三种选择,消息返回值可以是CString*,包含请求的文本。它必须由父级通过调用new来分配,副本由原始副本构造。返回时,孩子";拥有";对象,并且必须通过调用CCD_ 9来释放它。或者消息可以只返回CString对象的地址,甚至返回其缓冲区(调用GetString())——在这些情况下,它被认为是"0";只读";为了孩子。

这是一个很长的注释:

如果这是进程间通信,那么您将考虑SendMessageWM_COPYDATA、剪贴板等。

但看起来您正在处理一个单线程应用程序。您不需要增加windows消息处理的复杂性。只需使用标准c++直接调用其他类中的函数即可。例如,

auto ptr = dynamic_cast<CMyParent*>(GetParent());
if (ptr)
{
CString str;
ptr->GetSRRFilename(str);
ptr->SetSRRFilename(str);
...
}
else
{
MessageBox("cast failed, 
parent is not CMyParent class. We are not interested.");
}

如果确定GetParent()CMyParent类,则使用static_cast

我不知道你们班的设计。也许你有CMyParent1CMyParent2,它们共享一些函数,很难将它们联系在一起(但这应该不是不可能的),在这种情况下,你可以使用SendMessage作为欺骗。

根据评论,我现在有了这个解决方案:

afx_msg LRESULT CMyDialog::OnGetSRRFilename(WPARAM wParam, LPARAM lParam)
{
return reinterpret_cast<LRESULT>(GetLastEditedSRRFile().GetString());
}

在我的对话框中,需要获取数据:

const auto szFileName = reinterpret_cast<LPCTSTR>(GetParent()->SendMessage(theApp.UWM_GET_SRR_FILENAME_MSG));

工作正常!谢谢大家。

最新更新