weixin_44826062
moon19961996
2019-08-06 22:11
采纳率: 86.7%
浏览 465

非模态对话框创建的时候出错

我先说一下我创建非模态对话框的思路,
资源视图中创建一个对话框并创建类Coption,在菜单中加入一个按键coption,
在CChildView类中创建一个Coption类对象指针,在CChildView类中用Coption类对象指针创建非模态对话框,并判断Coption类对象指针是否为null,如果不为null,则不创建,将焦点给非模态对话框就行,创建的时候,将CChildView类作为Coption类构造参数传入Coption类中,当非模态对话框点击取消时,销毁非模态对话框,并发送消息给CChildView类,让他将Coption类对象指针赋值为null,否则非模态对话框只能出来一次,
但是现在发送消息会报错,
下面贴出四个文件代码,忘大佬们解答

CChildView.h:

#pragma once
#include"Coption.h"

// CChildView 窗口

class CChildView : public CWnd
{
// 构造
public:
    CChildView();

// 特性
public:

// 操作
public:

// 重写
    protected:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

// 实现
public:
    virtual ~CChildView();

    // 生成的消息映射函数
protected:
    afx_msg void OnPaint();
    DECLARE_MESSAGE_MAP()
protected:
    Coption* m_option;
public:
    afx_msg void On32771();     //为菜单option按钮
    afx_msg LRESULT ON_GOODBYE(WPARAM wparam, LPARAM lparam);
};

ChildView.cpp:


#include "stdafx.h"
#include "MFCApplication5.h"
#include "ChildView.h"
#include "resource.h"       // 主符号

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CChildView

CChildView::CChildView()
{
    m_option = NULL;
}


CChildView::~CChildView()
{
}


BEGIN_MESSAGE_MAP(CChildView, CWnd)
    ON_WM_PAINT()
    ON_COMMAND(ID_32771, &CChildView::On32771)
    ON_MESSAGE(WM_GOODBYE,ON_GOODBYE)
END_MESSAGE_MAP()

LRESULT  CChildView::ON_GOODBYE(WPARAM wparam, LPARAM lparam)
{
    delete m_option;
    m_option = NULL;

    return 0;
 }

// CChildView 消息处理程序

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
    if (!CWnd::PreCreateWindow(cs))
        return FALSE;

    cs.dwExStyle |= WS_EX_CLIENTEDGE;
    cs.style &= ~WS_BORDER;
    cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
        ::LoadCursor(nullptr, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), nullptr);

    return TRUE;
}

void CChildView::OnPaint() 
{
    CPaintDC dc(this); // 用于绘制的设备上下文

    // TODO: 在此处添加消息处理程序代码

    // 不要为绘制消息而调用 CWnd::OnPaint()
}



void CChildView::On32771()
{
    if (NULL!=m_option)
    {
        SetFocus();
        MessageBox(_T("m_option不为空"));
    }
    else
    {
        m_option = new Coption;
        m_option->Create(IDD_DIALOG1,this);
        m_option->ShowWindow(SW_SHOW);
        MessageBox(_T("m_option为空"));
    }
    // TODO: 在此添加命令处理程序代码
}

Coption.h:

class Coption : public CDialogEx
{
    DECLARE_DYNAMIC(Coption)

public:
    Coption(CWnd* pParent = nullptr);   // 标准构造函数
    Coption(CView* pview);   // 标准构造函数
    virtual ~Coption();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_DIALOG1 };
#endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedCancel();
    virtual void PostNcDestroy();
private:
    CView* p_view;
public:
    afx_msg void OnBnClickedOk();
};

Coption.cpp:


#include "stdafx.h"
#include "MFCApplication5.h"
#include "Coption.h"
#include "afxdialogex.h"


// Coption 对话框

IMPLEMENT_DYNAMIC(Coption, CDialogEx)

Coption::Coption(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOG1, pParent)
{

}

Coption::Coption(CView* pview /*=nullptr*/)
{
    p_view = pview;
}

Coption::~Coption()
{

}

void Coption::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(Coption, CDialogEx)
    ON_BN_CLICKED(IDCANCEL, &Coption::OnBnClickedCancel)
    ON_BN_CLICKED(IDOK, &Coption::OnBnClickedOk)
END_MESSAGE_MAP()


// Coption 消息处理程序


void Coption::OnBnClickedCancel()
{
    // TODO: 在此添加控件通知处理程序代码

    //CDialogEx::OnCancel();
    DestroyWindow();
}



void Coption::PostNcDestroy()
{
    // TODO: 在此添加专用代码和/或调用基类
    CDialogEx::PostNcDestroy();

    p_view->SendMessage(WM_GOODBYE, 0,0);                //屏蔽这一行就不会报错 


}


void Coption::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    //CDialogEx::OnOK();
    DestroyWindow();

}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • caozhy
    已采纳

    我回答过一个几乎和你这个类似的问题,只不过用的是win32。
    图片说明

    https://ask.csdn.net/questions/760642

    你先参考下,像那个提问者一样,先采纳回答,可以用MFC专门给你写一个,并且具有向主程序发消息的功能。

    点赞 评论
  • weixin_42375906
    Rotch 2019-08-07 14:22

    你这是全部源码吗,我用Win32 API 创建对话框需要资源文件的 (.rc)
    可以参考:
    https://docs.microsoft.com/zh-cn/windows/win32/menurc/resources-reference
    另注明:有一个叫 见了你女王大人喵姐还不跪下 的恶意刷低我声望,不要太在意他

    点赞 评论

相关推荐