c++ - 如何在MFC中创建一个可以发送和接收窗口消息的c++类
问题描述
我只想创建一个可以在 MFC 中发送和处理窗口消息的 C++ 类。我尝试了很多从网上获得的方法,大致是这样的:
- 使用 Visual Studio 2019 社区版中的类向导创建类 myClass::public CWnd。
- 在构造函数中使用以下代码
CString wcn = ::AfxRegisterWndClass(NULL);
BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, { 0, 0, 0, 0 }, this->GetParent(), /*HWND_MESSAGE,*/ 0, 0);
- 设置消息映射
BEGIN_MESSAGE_MAP(myClass, CWnd)
ON_MESSAGE(WM_USER + 1, DoNOOP)
END_MESSAGE_MAP()
- 编写消息处理函数:
afx_msg LRESULT myClass::DoNOOP(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!"));
return LRESULT(true);
}
- 从父窗口发送的消息:
myClass* hmw = new myClass();
::SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0);
它通过了构建过程。但是,当我在调试模式下运行它时,SendMessge 在这里触发了一个断点:
_AFXWIN_INLINE CWnd* CWnd::GetParent() const
{ ASSERT(::IsWindow(m_hWnd)); return CWnd::FromHandle(::GetParent(m_hWnd)); }
这是在 afxwin2.inl
我真的不知道现在该怎么办。请帮忙。我会很感激的。
完整的类声明:
#pragma once
class CMyMessageOnlyWindowClass : public CWnd
{
DECLARE_DYNAMIC(CMyMessageOnlyWindowClass)
public:
CMyMessageOnlyWindowClass();
virtual ~CMyMessageOnlyWindowClass();
protected:
DECLARE_MESSAGE_MAP()
afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);
};
执行:
#include "pch.h"
#include "MFCmsg.h"
#include "CMyMessageOnlyWindowClass.h"
// CMyMessageOnlyWindowClass
IMPLEMENT_DYNAMIC(CMyMessageOnlyWindowClass, CWnd)
CMyMessageOnlyWindowClass::CMyMessageOnlyWindowClass()
{
CString wcn = ::AfxRegisterWndClass(NULL);
BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, { 0, 0, 0, 0 }, this->GetParent(), /*HWND_MESSAGE,*/ 0, 0);
}
CMyMessageOnlyWindowClass::~CMyMessageOnlyWindowClass()
{
}
BEGIN_MESSAGE_MAP(CMyMessageOnlyWindowClass, CWnd)
ON_MESSAGE(WM_USER + 1, DoNOOP)
END_MESSAGE_MAP()
// CMyMessageOnlyWindowClass message handlers
afx_msg LRESULT CMyMessageOnlyWindowClass::DoNOOP(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!"));
return LRESULT(true);
}
主窗口是一个只有确定和取消按钮的对话框。当点击确定时,
void CMFCmsgDlg::OnBnClickedOk()
{
CMyMessageOnlyWindowClass* hmw = new CMyMessageOnlyWindowClass();
hmw->SendMessage(WM_USER + 1);
CDialogEx::OnOK();
}
这将触发一个断点。请帮忙。
解决方案
推荐阅读
- php - 图片未显示在网页上(Laravel)
- python - 解锁网络服务器?
- c - 无法构建“输入 y 循环”程序
- r - R函数可以对每个x值求和,重叠每次计算的数据?
- visual-studio-2019 - 如何让 Visual Studio Intellisense 推荐“”包含?
- android - 如何在细节片段leanback中膨胀自定义布局
- android - 解组时找不到类:com.google.android.gms.auth.api.signin.internal.SignInConfiguration
- r - 在 R(或 RStudio)中,我想将带有单位的字段转换为数字,但收到错误警告
- rust - `impl Trait` 不允许在函数和固有方法返回类型之外
- scala - 如何防止 Akka Http 重定向请求中的 URI 百分比解码?