mfc给一个类发送消息要new吗?
时间: 2024-02-05 07:04:26 浏览: 139
在MFC中,给一个类发送消息不需要使用`new`操作符。相反,你需要获取要发送消息的类的指针或引用。
如果你已经创建了接收消息的类的实例(即已经使用`new`创建了对象),你可以直接使用该对象的指针或引用来发送消息。
例如,假设你有一个名为`CReceiverClass`的类,并且已经在某处创建了它的实例,例如在`CMainClass`中:
```cpp
CReceiverClass receiver; // 创建接收消息的类的实例
```
在`CMainClass`中,你可以使用`&`操作符获取`receiver`对象的地址,并将其传递给其他类来发送消息:
```cpp
CSenderClass sender;
sender.SendMessage(&receiver, WM_CUSTOM_MESSAGE, wParam, lParam);
```
在`CSenderClass`中定义一个名为`SendMessage`的函数,用于发送消息:
```cpp
void CSenderClass::SendMessage(CReceiverClass* pReceiver, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
pReceiver->PostMessage(nMessage, wParam, lParam);
}
```
这样,你可以在不使用`new`操作符的情况下,将消息发送给另一个类。请确保在发送消息之前,接收类的实例已经被创建并且有效。
相关问题
mfc线程给子对话框发消息
在MFC(Microsoft Foundation Classes)框架中,如果你需要在一个主线程的窗口类(如`CWnd`)中创建一个子对话框(`CDlg`),并且希望从主线程向子对话框发送消息,你可以通过以下步骤操作:
1. **创建和显示子对话框**:
在`CWnd`派生类的某个成员函数中,使用`CreateDialog()`或`DoModal()`等方法创建并显示子对话框。
```cpp
CDialogEx* pDlg = new CDialogEx(pDX); // 创建子对话框
if (pDlg->DoModal() == IDOK) { // 如果用户点击确定按钮
// 处理返回的消息
}
```
2. **发送消息**:
主线程可以调用自己的`SendMessage()`方法,将消息传递给子对话框。通常使用`WM_COMMAND`或自定义消息ID,并指定接收者(即子对话框的句柄`HDLG`)。
```cpp
WPARAM wParam = ID_OK; // 或者你想发送的其他命令ID
LPARAM lParam;
pDlg->SendMessage(WM_COMMAND, wParam, lParam);
```
或者如果需要传递数据,可以创建一个`MSG`结构体并在`LPARAM`字段设置数据。
3. **处理消息**:
子对话框需要在`OnInitDialog()`或`OnCommand()`这样的消息处理函数中检查并响应接收到的消息。
```cpp
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case ID_OK:
// 对于ID_OK消息,处理相应的业务逻辑
break;
// 添加其他处理...
}
return TRUE; // 返回TRUE表示已处理了消息
}
```
mfc如何通过网页发送过来的消息获取到浏览器句柄
在 MFC 中,可以通过以下步骤获取浏览器句柄:
1. 在 MFC 应用程序中添加一个网页控件(如 CHtmlView)。
2. 使用网页控件的 Navigate2 方法加载网页。
3. 在网页中添加 JavaScript 代码,调用 MFC 应用程序提供的 COM 对象方法,将浏览器句柄作为参数传递给 MFC 应用程序。
4. 在 MFC 应用程序中实现 COM 对象方法,接收浏览器句柄参数,并保存浏览器句柄。
以下是具体的实现步骤:
1. 在 MFC 应用程序中添加一个网页控件(如 CHtmlView):
```cpp
class CMyHtmlView : public CHtmlView
{
// ...
};
```
2. 使用网页控件的 Navigate2 方法加载网页:
```cpp
void CMyHtmlView::OnInitialUpdate()
{
CHtmlView::OnInitialUpdate();
Navigate2(_T("http://example.com"), NULL, NULL);
}
```
3. 在网页中添加 JavaScript 代码,调用 MFC 应用程序提供的 COM 对象方法,将浏览器句柄作为参数传递给 MFC 应用程序:
```html
<html>
<head>
<script type="text/javascript">
function sendBrowserHandle()
{
var browserHandle = window.external.GetBrowserHandle();
// 将浏览器句柄作为参数传递给 MFC 应用程序
window.location.href = "myapp://handle/" + browserHandle;
}
</script>
</head>
<body onload="sendBrowserHandle()">
<!-- 网页内容 -->
</body>
</html>
```
这里使用了一个自定义的协议 myapp,用于在 JavaScript 中调用 MFC 应用程序提供的 COM 对象方法。具体的实现方法在下一步中说明。
4. 在 MFC 应用程序中实现 COM 对象方法,接收浏览器句柄参数,并保存浏览器句柄:
```cpp
class CMyApp : public CWinApp
{
public:
// ...
afx_msg void OnBrowserHandle(LPCTSTR lpszHandle);
// ...
};
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
// ...
ON_COMMAND(ID_BROWSER_HANDLE, OnBrowserHandle)
// ...
END_MESSAGE_MAP()
void CMyApp::OnBrowserHandle(LPCTSTR lpszHandle)
{
// 将字符串转换为浏览器句柄
HWND browserHandle = (HWND)_ttoi(lpszHandle);
// 保存浏览器句柄
// ...
}
```
在应用程序初始化时,需要注册自定义协议 myapp,并将 COM 对象方法与该协议关联:
```cpp
BOOL CMyApp::InitInstance()
{
// 注册自定义协议
AfxOleRegisterServerClass(AfxGetInstanceHandle(), CLSID_MyObject, _T("myapp"));
// 将 COM 对象方法与协议关联
CWinApp::InitInstance();
AfxOleSetUserCtrl(new CMyHtmlView);
ConnectExternalObject(new CMyObject);
return TRUE;
}
```
这里的 CLSID_MyObject 是 MFC 应用程序中实现的 COM 对象的 CLSID。ConnectExternalObject 方法用于将 COM 对象与 CHtmlView 关联,使得 JavaScript 中的 window.external 可以访问该 COM 对象。
阅读全文