使用
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
消息;对于替代情况,使用 GetClipboardData()
函数。
第三种选择,消息返回值可以是
CString*
,包含请求的文本。它必须由父级通过调用 new
来分配,从原始版本复制构造。返回时,孩子“拥有”该对象,并且必须通过调用 delete
来释放它。或者消息可以只返回 CString
对象的地址,甚至是它的缓冲区(调用 GetString()
) - 在这些情况下,它被认为对于子级来说是“只读”的。
如果这是进程间通信,那么你会考虑
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.");
}
或者如果您确定
static_cast
是一个 GetParent()
类,请使用 CMyParent
。
我不知道你们的课程设计如何。也许你有
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));
工作正常!