这个resource描述了一种使用指针创建无模式对话框的方法。他们创建一个指向对话框类的指针,然后使用 - >语法。
CModeLess *m_pmodeless = new CModeLess(this);
m_pmodeless->Create(CModeLess::IDD);
m_pmodeless->ShowWindow(SW_SHOW);
到目前为止,我一直在做这样的事情:
CModeLess m_pmodeless;
m_pmodeless.Create(IDD_DIALOG);
m_pmodeless.ShowWindow(SW_SHOW);
我这样做主要是因为我觉得使用课程很舒服。使用这种方法有什么不利之处吗?
其次,在指针方法中我必须做这样的事情来关闭窗口:(如果我没有记错的话)
if(m_pmodeless != NULL) { delete m_pmodeless; }
我需要做一些删除如果我使用类或m_pmodeless.closeWindow()
足够吗?
如果这是一个非常基本的问题,我道歉,但我很想知道。
答案 0 :(得分:1)
这是一个棘手的问题,因为很多问题取决于您正在尝试做什么,以及CModeless的实施方式。一般来说,你是正确的避免指针,但GUI编程有特殊问题,因为程序中的C ++对象代表屏幕上的GUI对象,并且协调程序中的C ++对象与屏幕上的GUI对象的破坏可能是相当的棘手。有时指针是解决这个问题的最简单方法。
我假设m_pmodeless是另一个类的成员变量。
一个问题是对象的生命周期。在类版本中,当销毁包含对象时,将销毁CModeless对象。这对你来说是否合适取决于你的代码。这是否也会破坏无模式对话取决于CModeless的实现方式。如果可以,您需要查看CModeless析构函数,如果不能,则需要查看CModeless的文档。使用指针版本,您可以明确控制对象何时被销毁,只需在正确的时间调用delete。
另一个问题是,当GUI对象被销毁时,某些GUI库会自动删除C ++对象。这样的东西(在Windows上)
case WM_NCDESTROY:
...
// last message received so delete the object
delete this;
break;
这样的代码假设所有对象都是堆分配的,并在适当的时候自动删除它们。如果像这样编写CModeless,那么你别无选择,只能使用指针版本。