导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

对话框继承知识

我看你有戏 2010-07-07 01:20:49
我写了个对话框类 CAdlg 是从一个公用的对话框ccommdlg继承的
这个ccommdlg是从CDialog继承过来的


请问,窗口响应函数,如何不经过CAdlg 而是直接让ccommdlg中的函数进行相应

...全文
244 点赞 收藏 23
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
我看你有戏 2010-07-09
发个例子到我邮箱行吗,拜托了

6102435@qq.com
回复
Eleven 2010-07-09
[Quote=引用 20 楼 henry3695 的回复:]
引用 17 楼 visualeleven 的回复:
或者这样,你修改分别修改CNewDlg和CNewDlg2的构造函数
-------------------------------------------------

C/C++ code


class CNewDlg : public CDialog
{
// Construction
public:
CNewDlg(……
[/Quote]
你自己不会用吧,模态,非模态都可以,只用简单的改改就行了,主要是在构造函数中修改。。。
回复
我看你有戏 2010-07-09
请高手指点迷津
回复
我看你有戏 2010-07-07
[Quote=引用 17 楼 visualeleven 的回复:]
或者这样,你修改分别修改CNewDlg和CNewDlg2的构造函数
-------------------------------------------------

C/C++ code


class CNewDlg : public CDialog
{
// Construction
public:
CNewDlg(UINT nID, CWnd* pParent……
[/Quote]

大哥你这个不行的啊我试过了
回复
Eleven 2010-07-07
注意一下CNewDlg和CNewDlg2的构造函数的不同
回复
wltg2001 2010-07-07
[Quote=引用 16 楼 visualeleven 的回复:]
引用 12 楼 wltg2001 的回复:
试了一下部长的代码,好像弹出来的并不是子类对话框,而是CNewDlg类

因为子类中的ID和父类的一样。。。
这样应该就可以了吧
CNewDlg2* dlg = new CNewDlg2;
dlg->Create(IDD_DIALOG2, this);
dlg->ShowWindow(SW_SHOW);
[/Quote]
部长说的不错,上面的代码确实很实现楼主的功能,不过,用模态对话框不行.
回复
Eleven 2010-07-07
或者这样,你修改分别修改CNewDlg和CNewDlg2的构造函数
-------------------------------------------------


class CNewDlg : public CDialog
{
// Construction
public:
CNewDlg(UINT nID, CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CNewDlg)
// enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CNewDlg)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
---------------------------------------------------------------

CNewDlg::CNewDlg(UINT nID, CWnd* pParent /*=NULL*/)
: CDialog(nID, pParent)
{
//{{AFX_DATA_INIT(CNewDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CNewDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNewDlg, CDialog)
//{{AFX_MSG_MAP(CNewDlg)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNewDlg message handlers

void CNewDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
AfxMessageBox(_T("new1"));
CDialog::OnLButtonDown(nFlags, point);
}
--------------------------------------------------------------------
----------------------------------------------------------------------
#include "NewDlg.h"

class CNewDlg2 : public CNewDlg
{
// Construction
public:
CNewDlg2(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CNewDlg2)
enum { IDD = IDD_DIALOG2 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewDlg2)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CNewDlg2)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
------------------------------------------------------------------------


CNewDlg2::CNewDlg2(CWnd* pParent /*=NULL*/)
: CNewDlg(CNewDlg2::IDD,pParent)
{
//{{AFX_DATA_INIT(CNewDlg2)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CNewDlg2::DoDataExchange(CDataExchange* pDX)
{
CNewDlg::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewDlg2)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNewDlg2, CNewDlg)
//{{AFX_MSG_MAP(CNewDlg2)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNewDlg2 message handlers

-------------------------------------------------
----------------------------------------------
//调用
CNewDlg2 dlg;
dlg.DoModal();
回复
Eleven 2010-07-07
[Quote=引用 12 楼 wltg2001 的回复:]
试了一下部长的代码,好像弹出来的并不是子类对话框,而是CNewDlg类
[/Quote]
因为子类中的ID和父类的一样。。。
这样应该就可以了吧
CNewDlg2* dlg = new CNewDlg2;
dlg->Create(IDD_DIALOG2, this);
dlg->ShowWindow(SW_SHOW);
回复
我看你有戏 2010-07-07
那就是说只能是需要传递一下了吗
回复
wltg2001 2010-07-07
我觉得楼主的想法不太靠谱,当前弹出来的是子类对话框,消息肯定是发送给子类对话框窗口的, 那么处理当然也是由子类对话框来处理,由子类转发是可以的,但是完全跳过它不太可能.
回复
gz_qmc 2010-07-07

我理解你的意思,应该是说:
如何让子类不继承父类的某些东西
比如对某些消息的响应

那么你还是要在子类重新写这些函数
比如以2楼为例:
void CAdlg::OnOK()
{
}
这样一来,子类对IDOK就相当于不响应了.
又比如8楼的
void CNewDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
//CDialog::OnLButtonDown(nFlags, point);
}
把向父类传递的代码注释掉,子类就等同于不响应数标左键了

这样是你想要的结果吗?
回复
wltg2001 2010-07-07
试了一下部长的代码,好像弹出来的并不是子类对话框,而是CNewDlg类
回复
Eleven 2010-07-07
[Quote=引用 9 楼 henry3695 的回复:]
对啊,你这样写的话,好像是响应不到鼠标点击消息的吧
[/Quote]
你自己试一下不就很清楚了。。。。
回复
山伟 2010-07-07
你想要的恐怕不能实现。

根据继承的概念,假设你对ccommdlg添加了消息WM_LBUTTONDOWN,那么它的子类CAdlg也同样会继承该消息。因此你说的让父类的消息子类不响应应该不行。

不知道我的理解对不对,请高手继续解答!
回复
我看你有戏 2010-07-07
对啊,你这样写的话,好像是响应不到鼠标点击消息的吧
回复
Eleven 2010-07-07
[Quote=引用 7 楼 henry3695 的回复:]
引用 3 楼 wltg2001 的回复:
请问,窗口响应函数,如何不经过CAdlg 而是直接让ccommdlg中的函数进行相应
==========
在CAdlg中转发就行了,比如处理WM_LBUTTONDOWN消息,还是让CADlg处理WM_LBUTTONDOWN消息,不过直接调用commslg::LButton..();就行了.





我的想设计出这样的功能,有些消息我不……
[/Quote]
你说的是这个意思吗?例如下面的
//CNewDlg类 ,处理WM_LBUTTONDOWN消息

// CNewDlg的H文件
class CNewDlg : public CDialog
{
// Construction
public:
CNewDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CNewDlg)
enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CNewDlg)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// CNewDlg的CPP文件


CNewDlg::CNewDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNewDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNewDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CNewDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNewDlg, CDialog)
//{{AFX_MSG_MAP(CNewDlg)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNewDlg message handlers

void CNewDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
AfxMessageBox(_T("Hello"));
CDialog::OnLButtonDown(nFlags, point);
}
------------------------------------------------------------------
// CNewDlg2继承了CNewDlg类
#include "NewDlg.h"

// CNewDlg2的H文件
class CNewDlg2 : public CNewDlg
{
// Construction
public:
CNewDlg2(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CNewDlg2)
enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewDlg2)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CNewDlg2)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

// CNewDlg2的CPP文件

CNewDlg2::CNewDlg2(CWnd* pParent /*=NULL*/)
: CNewDlg(pParent)
{
//{{AFX_DATA_INIT(CNewDlg2)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CNewDlg2::DoDataExchange(CDataExchange* pDX)
{
CNewDlg::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewDlg2)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNewDlg2, CNewDlg)
//{{AFX_MSG_MAP(CNewDlg2)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNewDlg2 message handlers
--------------------------------------------------------------------------------
//调用:
CNewDlg2 dlg;
dlg.DoModal();
回复
我看你有戏 2010-07-07
[Quote=引用 3 楼 wltg2001 的回复:]
请问,窗口响应函数,如何不经过CAdlg 而是直接让ccommdlg中的函数进行相应
==========
在CAdlg中转发就行了,比如处理WM_LBUTTONDOWN消息,还是让CADlg处理WM_LBUTTONDOWN消息,不过直接调用commslg::LButton..();就行了.
[/Quote]




我的想设计出这样的功能,有些消息我不想让派生类的对话框处理,也不想让它给我转发,而是直接让基类对话框去响应


这样的东西可以设计出来吗

回复
我看你有戏 2010-07-07
[Quote=引用 3 楼 wltg2001 的回复:]
请问,窗口响应函数,如何不经过CAdlg 而是直接让ccommdlg中的函数进行相应
==========
在CAdlg中转发就行了,比如处理WM_LBUTTONDOWN消息,还是让CADlg处理WM_LBUTTONDOWN消息,不过直接调用commslg::LButton..();就行了.
[/Quote]




我的想设计出这样的功能,有些消息我不想让派生类的对话框处理,也不想让它给我转发,而是直接让基类对话框去响应


这样的东西可以设计出来吗

回复
我看你有戏 2010-07-07
[Quote=引用 3 楼 wltg2001 的回复:]
请问,窗口响应函数,如何不经过CAdlg 而是直接让ccommdlg中的函数进行相应
==========
在CAdlg中转发就行了,比如处理WM_LBUTTONDOWN消息,还是让CADlg处理WM_LBUTTONDOWN消息,不过直接调用commslg::LButton..();就行了.
[/Quote]




我的想设计出这样的功能,有些消息我不想让派生类的对话框处理,也不想让它给我转发

这样的东西可以设计出来吗
回复
gz_qmc 2010-07-07
抱歉,响应消息函数不是 重载 的概念,楼主注意了.
我2楼的语言有误,楼主见谅
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……