使用SendMessage获取CString值?

问题描述 投票:0回答:3

使用

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 正在传递到接收文本的位置。

我是否应该向家长发布一条消息,说“我想要字符串”传递我的窗口句柄。然后在该处理程序中,它使用字符串值向该句柄发送一条消息?

我是不是把事情搞得太复杂了?

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

visual-c++ mfc sendmessage
3个回答
3
投票

您可以简单地定义一条要求文本的消息。调用者(子级)必须有一个缓冲区来接收文本。

wParam
可以是缓冲区长度,
lParam
可以是缓冲区(指针)。

或者,消息返回值可以是内存对象(句柄或指针),例如由父进程分配并由子进程释放的内存对象。有关如何定义消息的示例,请查看

WM_GETTEXT
消息;对于替代情况,使用
GetClipboardData()
函数。

第三种选择,消息返回值可以是

CString*
,包含请求的文本。它必须由父级通过调用
new
来分配,从原始版本复制构造。返回时,孩子“拥有”该对象,并且必须通过调用
delete
来释放它。或者消息可以只返回
CString
对象的地址,甚至是它的缓冲区(调用
GetString()
) - 在这些情况下,它被认为对于子级来说是“只读”的。


2
投票

如果这是进程间通信,那么你会考虑

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
作为作弊。


1
投票

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

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));

工作正常!

© www.soinside.com 2019 - 2024. All rights reserved.