首页 > 解决方案 > 如何在MFC中创建一个可以发送和接收窗口消息的c++类

问题描述

我只想创建一个可以在 MFC 中发送和处理窗口消息的 C++ 类。我尝试了很多从网上获得的方法,大致是这样的:

  1. 使用 Visual Studio 2019 社区版中的类向导创建类 myClass::public CWnd。
  2. 在构造函数中使用以下代码
CString wcn = ::AfxRegisterWndClass(NULL);

BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, { 0, 0, 0, 0 }, this->GetParent(), /*HWND_MESSAGE,*/ 0, 0);
  1. 设置消息映射
BEGIN_MESSAGE_MAP(myClass, CWnd)
    ON_MESSAGE(WM_USER + 1, DoNOOP)
END_MESSAGE_MAP()
  1. 编写消息处理函数:
afx_msg LRESULT myClass::DoNOOP(WPARAM wParam, LPARAM lParam)
{
    AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!"));
    return LRESULT(true);
}
  1. 从父窗口发送的消息:
    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();
}

这将触发一个断点。请帮忙。

标签: c++windowsmfc

解决方案


推荐阅读