Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > работа с производным классом


Автор: torero 17.10.2006, 18:57
    У меня простой пример для вопроса. Проект CProba на основе CView.
  В CProbaView::OnCreate ставлю операторы:

    CWnd* pWnd = new CWnd;
    pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
    CRect(0, 0, 20, 20), this, 1234);

 Получается маленькое окно, всё работает правильно.
 Но теперь при помощи ClassWizard создаю новый класс CProbaOkno произ-
 водный от CWnd, в нём пишу функцию Sozd() c теми же операторами:

   void CProbaOkno::Sozd()
{       CWnd* pWnd = new CWnd;
    pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
     CRect(0, 0, 20, 20), this, 1234);
}

  А в CProbaView::OnCreate() прежние операторы удалил и пишу:
      CProbaOkno pok;
      pok.Sozd();
 Получаю два сообщения:
 1. Окно создаётся с ошибкой.
 2. Обнаружена утечка памяти.
    В чём может быть причина?

Автор: xTr1m 18.10.2006, 08:50
ну утечка, скорее всего, тут
Цитата

CWnd* pWnd = new CWnd;


ты ведь выделил память, так сам ее и очищай

насчет ошибки, так сказать не могу. Хоть на какой строчке ошибка вылетает? 

Автор: Любитель 19.10.2006, 12:44
Не надо создавать Sozd. Перегрузи Create, если не хочешь много параметров - сделай один - CWnd* parent.
Код

void COkno::Create(CWnd* parent)
{
   CWnd::Create(...);
   wnd.Create(..., this, ...)
}

wnd добав как private-переменную типа CWnd в COkno

Автор: Earnest 20.10.2006, 17:59
Цитата(torero @  17.10.2006,  19:57 Найти цитируемый пост)
void CProbaOkno::Sozd()
{       CWnd* pWnd = new CWnd;
    pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
     CRect(0, 0, 20, 20), this, 1234);
}

Здесь "this" - это несуществующее окно. Отсюда и ошибка.

Добавлено @ 18:06 
Цитата(Любитель @  19.10.2006,  13:44 Найти цитируемый пост)
wnd добав как private-переменную типа CWnd в COkno 

Наверное, все же имелось в виду, что надо вставить контрол типа CProbaOkno во вью. Тогда нужно добавить переменную типа CProbaOkno в класс вью, а то создается, понимаешь, автоматическая переменная... она ведь сразу разрушится.

Автор: torero 20.10.2006, 19:56
  Переменные CProbaOkno  pok  и
             CWnd *parent
  завёл и сделал обращение в CProbaView::OnCreate
   {  pok.Create(parent); }  , но    
 ошибка трансляции в вызове базового метода CWnd::Create();
   'Create' : function does not take 0 parameters
 пока не поставил все 6 параметров.
  После этого программа отработала, но окно не построила и дала 
  сообщение на каждый Create :
  Warning: Window creation failed: GetLastError returns 0x00000000
  Warning: Window creation failed: GetLastError returns 0x00000000

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)