使用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";只读";为了孩子。
这是一个很长的注释:
如果这是进程间通信,那么您将考虑SendMessage
、WM_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
。
我不知道你们班的设计。也许你有CMyParent1
和CMyParent2
,它们共享一些函数,很难将它们联系在一起(但这应该不是不可能的),在这种情况下,你可以使用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));
工作正常!谢谢大家。