MFC自定义CDialog类创建模态和非模态窗口的用法

⌚Time: 2022-10-09 20:13:47

👨‍💻Author: Jack Ge

新建一个Dialog资源窗口,作为要弹出的窗口。资源ID是IDD_DIALOG1

对于此窗口,可以直接让他以非模态窗口的方式进行显示


CDialog dialog;

dialog.Create(IDD_DIALOG1,this);

dialog.ShowWindow(true);

但是对于控件功能的处理,以及其它自定义的功能,就需要建立自定义类来实现

添加自定义CDialog类

点击项目,添加类。使用类向导添加一个继承自CDialog的自定义类

添加名字


#pragma once

#include "afxwin.h"



class CMyDialog :

    public CDialog

{

public:

    CMyDialog(void);

public:

    ~CMyDialog(void);

public:

    DECLARE_MESSAGE_MAP()

};

#include "StdAfx.h"

#include "MyDialog.h"



CMyDialog::CMyDialog(void)

{

}



CMyDialog::~CMyDialog(void)

{

}

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)

END_MESSAGE_MAP()


建立非模态窗口

对于非模态方式窗体的建立,只需要在主窗体的头文件中加入对于自定义类头文件的引用


#include "MyDialog.h"

定义变量


CMyDialog m_myDialog;

创建非模态窗口


//关联窗口资源ID

m_myDialog.Create(IDD_DIALOG1,this);

m_myDialog.ShowWindow(true);

就可以正常使用

建立模态窗口

对于模态窗口的使用,需要在自定义类中包含资源头文件


#include "Resource.h"

同时在构造函数中向父类CDialog构造函数传递参数,指明窗体资源ID和父窗体指针(可以是NULL)


CMyDialog::CMyDialog(void)

: CDialog(IDD_DIALOG1, NULL)

{

}

在主窗体中同样包含自定义类的头文件


#include "MyDialog.h"

直接以模态方式运行窗口


CMyDialog myDialog;

myDialog.DoModal();

自定义窗体类关联资源视图中的窗体属性

对于直接在项目中使用类向导添加的自定义类,看资源视图,对于新建窗体的消息属性中是没有任何消息的,不能在这里直接添加消息响应函数

对于使用项目类向导建立的自定义类,与资源视图中窗体的属性建立关联的办法是在类声明中定义包含窗体资源ID的匿名枚举


enum { IDD = IDD_DIALOG1 };

并且重新打开项目,就可以在窗体的属性中看到相关的消息和函数了

由于使用了匿名枚举,对于构造函数,可以直接写成


CMyDialog::CMyDialog(void)

: CDialog(CMyDialog::IDD, NULL)

{

}