0

This resource describes a method of creating a modeless dialog using pointers. They create a pointer that pointer to the dialog class and then use the -> syntax.

CModeLess *m_pmodeless = new CModeLess(this);
m_pmodeless->Create(CModeLess::IDD);
m_pmodeless->ShowWindow(SW_SHOW);

I have been doing something like this so far:

CModeLess m_pmodeless;
m_pmodeless.Create(IDD_DIALOG);
m_pmodeless.ShowWindow(SW_SHOW);

I do this mainly because I feel comfortable using classes. Is there any disadvantage of using this approach?

Secondly, in the pointer approach I have to do something like this to close the window: (if I am not mistaken)

if(m_pmodeless != NULL) { delete m_pmodeless; }

Is there some deletion I have to do If I use classes or is m_pmodeless.closeWindow() enough?

I apologize if this is a very basic question, but i'm curious to know.

4

1 回答 1

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 是这样写的,那么你别无选择,只能使用指针版本。

于 2012-09-08T08:39:48.030 回答