请教关于MFC中类和资源关联的问题

时间:2022-07-17 05:04:49
一直都这么用,今天突然想到一些细节的问题,欢迎各位指导:

1、创建了一个资源,定义一个类与之关联,用这个类实例化对象或者指针,对对象或者指针的操作就是对该资源的操作,对吗?

2、创建了一个资源,定义一个类与之关联,并且我还增加了“一般成员函数”(对资源没有任何操作),用这个类创建指针,我不对资源操作,只是单纯想用里面的“一般成员函数”,我就可以不分配内存,直接p->func() 吗?如果操作资源呢?我到底什么时候要给分配内存?

3、我的一个类对象和对话框相关联了,有了对话框的ID,可是为什么显示出窗口
dlgStatusCtrl->Create(IDD_DIALOG_STATUS_CONTROL, this);里面还要包含了对话框的ID?我关联了资源不就有了这个资源的ID吗?

9 个解决方案

#1


lz只要记住:资源是资源,类对象是类对象,本来是没有什么联系的,是你的代码通过资源ID使得类对象和特定的资源发生了关联
那么很多问题就很好理解了

#2


引用 1 楼 worldy 的回复:
lz只要记住:资源是资源,类对象是类对象,本来是没有什么联系的,是你的代码通过资源ID使得类对象和特定的资源发生了关联
那么很多问题就很好理解了


谢谢~你这么一说我确实经常模糊了两者的关系。
请允许我问一些细节点的东西:

1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

#3


1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?

#4


引用 3 楼 worldy 的回复:
1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?


由衷的感谢你~

#5


引用 4 楼 nsxzclx 的回复:
Quote: 引用 3 楼 worldy 的回复:

1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?


由衷的感谢你~


1、资源是一堆数据,如对话框资源,记录了这个对话框的属性,只是作为模板,运行出现的对话框是实体对话框不是资源?
2、利用一个对话框资源,就可不断的创建出基于此对话框模板的对话框吗?
3、virtual BOOL CDialog::Create( UINT nIDTemplate,CWnd* pParentWnd = NULL ); 用pMyDialog->Create( nIDTemplate,pParentWnd ); pMyDialog是由跟对话框关联的类创建,pMyDialog中不就有了对话框的ID了吗?

#6


引用 3 楼 worldy 的回复:
1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?


1、资源是一堆数据,如对话框资源,记录了这个对话框的属性,只是作为模板,运行出现的对话框是实体对话框不是资源?
2、利用一个对话框资源,就可不断的创建出基于此对话框模板的对话框吗?
3、virtual BOOL CDialog::Create( UINT nIDTemplate,CWnd* pParentWnd = NULL ); 用pMyDialog->Create( nIDTemplate,pParentWnd ); pMyDialog是由跟对话框关联的类创建,pMyDialog中不就有了对话框的ID了吗?

#7



#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO 
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 163
        TOPMARGIN, 7
        BOTTOMMARGIN, 55
    END

    IDD_SET_FREQ, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 309
        TOPMARGIN, 7
        BOTTOMMARGIN, 176
    END

    IDD_OSC_II, DIALOG
    BEGIN
        RIGHTMARGIN, 588
        BOTTOMMARGIN, 333
    END
END
#endif    // APSTUDIO_INVOKED

这就是所谓的资源,你想创建几个对话框就创建几个

#8


1.正确
2.类的指针?不是实例(对象)的指针一般不能操作类的函数
3.表面上是这样的。但是微软的函数就这样定义了,必须这样用

#9


"资源是一堆数据",似乎明确了一个概念,谢谢。

#1


lz只要记住:资源是资源,类对象是类对象,本来是没有什么联系的,是你的代码通过资源ID使得类对象和特定的资源发生了关联
那么很多问题就很好理解了

#2


引用 1 楼 worldy 的回复:
lz只要记住:资源是资源,类对象是类对象,本来是没有什么联系的,是你的代码通过资源ID使得类对象和特定的资源发生了关联
那么很多问题就很好理解了


谢谢~你这么一说我确实经常模糊了两者的关系。
请允许我问一些细节点的东西:

1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

#3


1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?

#4


引用 3 楼 worldy 的回复:
1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?


由衷的感谢你~

#5


引用 4 楼 nsxzclx 的回复:
Quote: 引用 3 楼 worldy 的回复:

1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?


由衷的感谢你~


1、资源是一堆数据,如对话框资源,记录了这个对话框的属性,只是作为模板,运行出现的对话框是实体对话框不是资源?
2、利用一个对话框资源,就可不断的创建出基于此对话框模板的对话框吗?
3、virtual BOOL CDialog::Create( UINT nIDTemplate,CWnd* pParentWnd = NULL ); 用pMyDialog->Create( nIDTemplate,pParentWnd ); pMyDialog是由跟对话框关联的类创建,pMyDialog中不就有了对话框的ID了吗?

#6


引用 3 楼 worldy 的回复:
1、因为   "类" (保存有资源ID)  和资源关联起来了,这样子我通过它   "类对象”   (通过MFC内部机制,也保存有资源ID)可以对资源操作,可以这么理解嘛?

差不多就是这样,但是关键的是对话框模板只是模板,它本身是静态的,只有通过代码,对话框才能动起来、活起来

2、virtual BOOL CDialog::Create(
   UINT nIDTemplate,
   CWnd* pParentWnd = NULL 
); MSDN的解释是:使用从资源,创建一个对话框模板调用 Create 创建无模式对话框;nIDTemplate包含对话框模板资源的ID号。
从资源是什么?模板资源的ID号又是什么呢?我的类对象已经关联了资源,还要我填写ID?

从资源?翻译有点问题吧,原文应该是这个吧:Call this member function to create a modeless dialog box using a dialog-box template from a resource. 
调用这个成员函数从资源模板创建一个无模式对话框

模板资源ID就是你资源中对话框的ID
当然需要你填写,因为创建是别的窗口的事情,你程序运行开始是没有对话框的,只有在某个位置点击或操作了什么,从而引发创建对话框的操作,你没有填写,那么电脑哪知道你要创建什么对话框?


1、资源是一堆数据,如对话框资源,记录了这个对话框的属性,只是作为模板,运行出现的对话框是实体对话框不是资源?
2、利用一个对话框资源,就可不断的创建出基于此对话框模板的对话框吗?
3、virtual BOOL CDialog::Create( UINT nIDTemplate,CWnd* pParentWnd = NULL ); 用pMyDialog->Create( nIDTemplate,pParentWnd ); pMyDialog是由跟对话框关联的类创建,pMyDialog中不就有了对话框的ID了吗?

#7



#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO 
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 163
        TOPMARGIN, 7
        BOTTOMMARGIN, 55
    END

    IDD_SET_FREQ, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 309
        TOPMARGIN, 7
        BOTTOMMARGIN, 176
    END

    IDD_OSC_II, DIALOG
    BEGIN
        RIGHTMARGIN, 588
        BOTTOMMARGIN, 333
    END
END
#endif    // APSTUDIO_INVOKED

这就是所谓的资源,你想创建几个对话框就创建几个

#8


1.正确
2.类的指针?不是实例(对象)的指针一般不能操作类的函数
3.表面上是这样的。但是微软的函数就这样定义了,必须这样用

#9


"资源是一堆数据",似乎明确了一个概念,谢谢。