VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 703|回复: 2

[原创] C++对话框类型的动态识别

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2017-9-5 00:21:23 | 显示全部楼层 |阅读模式
刚刚有位会员在 Vip的群中提出这么一个问题:

比如有两个窗口对应的类分别为:CADlg、CBDlg
这两个窗口需要共同调用一个函数,那么关于这个函数该如何设计呢?
因为我想在函数中区分是哪个窗口调用的?参数我写成了默认的窗口类指针 CWnd*,CADlg 和 CBDlg 调用 fun 函数的时候会分别把自己的对象指针传进去的。

备注:CADlg、CBDlg 是对话框类所以默认都派生自 CDialog,而 CDialog 又派生自窗口类 CWnd

void fun(CWnd* dlg)
{
}

问题如果这样设计,那么我要如何区分是 CADlg 还是 CBDlg 呢?

问题截图如下:
C++对话框类型的动态识别



解答:这个问题我感觉方法也是有多种的,刚开始我是想在 CADlg 和 CBDlg 类中都各自添加一个成员变量,比如:int class_type; 在 CADlg 中将 class_type = 1,在 CBDlg 中 class_type = 2,之后,在 fun 函数中进行判断。
但是现在 fun 函数的参数是 CWnd* 类型,并不是  CADlg 或者 CBDlg,所以此时如果进行强制类型转换的话,不管是转换成  CADlg* 还是转换成 CBDlg* 都不太合适,因为你也不能确定参数传进来的到底是 CADlg 类型 还是 CBDlg 类型。

于是,我想这么办:定义一个基类,例如:CBaseDlg,如下:
  1. class CBseDlg
  2. {
  3. public:
  4.         CBseDlg()
  5.         {
  6.                 class_type = 0;
  7.         };
  8. public:
  9.         int class_type;
  10. };
复制代码


本身 C++ 支持多重继承,所以让  CADlg 和 CBDlg 类不仅从其默认的父类继承过来,也从 CBseDlg 类继承过来。这样 CADlg 和 CBDlg 内部就都有 class_type 成员变量了。在 CADlg 的构造函数中将 class_type = 1,在 CBDlg 的构造函数中将 class_type = 2。
之后,将 fun 的参数类型改成 CBseDlg*,然后就可以在 fun 函数中做判断了:

  1. void fun(CBseDlg* dlg)
  2. {
  3.         if (dlg->class_type == 1)
  4.         {
  5.                 //是 CADlg 类对象
  6.         }
  7.         else if (dlg->class_type == 2)
  8.         {
  9.                 //是 CBDlg 类对象
  10.         }
  11. }
复制代码


大家明白了吗?自己亲自动手试一试吧!遇到问题了跟帖回复,如果大家有其他的方法也可以一起贴出来吧!

以上!




上一篇:在win7上安装SQL server 2005
下一篇:VC++智能枚举QQ聊天窗口类

本帖被以下淘专辑推荐:

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

94_avatar_middle
online_vip eagle1103 发表于 2017-9-5 00:26:48 | 显示全部楼层
谢谢大哥

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

81_avatar_middle
online_moderator Debug 发表于 2017-9-5 18:11:21 | 显示全部楼层
没错,可以让他们共同派生自某个类来实现。
其实 CDialog 也可以实现,只不过 CDialog 是MFC的源码,修改不了
所以只能是自定义一个父类了,同意 syc 的说法

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-15 20:54

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表