Проблема с наследником от CWnd
От: kpn  
Дата: 22.07.04 10:34
Оценка:
Есть проблема, а заключается она в следующем:
Есть класс, базовым которого является CWnd (class CDevice : public CWnd)
Этот класс CDevice отвечает за общение с СОМ-портом, поэтому нужно, чтобы
1. Этот класс мог принимать сообщения, как любое стандартное окно.
2. Этот класс не показывал никаких окон, хотя они могут существовать "виртуально"

В одной из процедур класса я пытаюсь запустить таймер. Он не запускается, Debugger говорит, что ошибка находитя в этой стандартной функции (файл Afxwin2.inl)

_AFXWIN_INLINE UINT CWnd::SetTimer(UINT nIDEvent, UINT nElapse,
void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD))
{ ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse,
(TIMERPROC)lpfnTimer); }

Насколько я понимаю, ошибка возникает из-за того, что у моего класса CDevice, хоть он
и наследован от CWnd, но перемнная m_hWnd НЕ проинициализирована. Прав ли я в своих предположениях и как мне проинициализировать m_hWnd??
Re: Проблема с наследником от CWnd
От: Аноним  
Дата: 22.07.04 10:38
Оценка:
Здравствуйте, kpn, Вы писали:


kpn>Есть проблема, а заключается она в следующем:

kpn>Есть класс, базовым которого является CWnd (class CDevice : public CWnd)
kpn>Этот класс CDevice отвечает за общение с СОМ-портом, поэтому нужно, чтобы
kpn>1. Этот класс мог принимать сообщения, как любое стандартное окно.
kpn>2. Этот класс не показывал никаких окон, хотя они могут существовать "виртуально"

kpn>В одной из процедур класса я пытаюсь запустить таймер. Он не запускается, Debugger говорит, что ошибка находитя в этой стандартной функции (файл Afxwin2.inl)


kpn>_AFXWIN_INLINE UINT CWnd::SetTimer(UINT nIDEvent, UINT nElapse,

kpn>void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD))
kpn>{ ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse,
kpn>(TIMERPROC)lpfnTimer); }

kpn>Насколько я понимаю, ошибка возникает из-за того, что у моего класса CDevice, хоть он

kpn>и наследован от CWnd, но перемнная m_hWnd НЕ проинициализирована. Прав ли я в своих предположениях и как мне проинициализировать m_hWnd??

CWnd::Create()



CWnd* _wnd = new CDevice;
_wnd->Create(_T("My Super window class"), "Hello world this is window", WS_POPUP /*| WS_VISIBLE*/,
       CRect(0, 0, 100, 100), NULL );
Re: Проблема с наследником от CWnd
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 22.07.04 10:41
Оценка:
Сначала окно нужно создать:

CDevice m_dev;

/*----------*/

m_dev.Create( куча параметров );

Этот код создаст хендл окна, и тогда Ассерт выскакивать не будет.

Вот пример создания окна:

CString wnd_class = AfxRegisterWndClass( CS_DBLCLKS, ::LoadCursor( NULL, IDC_ARROW ),
::CreateSolidBrush( ::GetSysColor( COLOR_WINDOW ) ), 0 );

m_dev.CreateEx( 0, wnd_class, NULL, WS_CHILD, CRect( 0, 0, 0, 0 ), this, 0, NULL )
Любая задача имеет решение, даже когда решения не существует
Re: Проблема с наследником от CWnd
От: kpn  
Дата: 22.07.04 10:52
Оценка:
Большое спасибо за советы.

Еще один вопрос:
После того, как я создам окно при помощи create, его под конец работы надо как-то самому разрушать, или не обязательно?
Re[2]: Проблема с наследником от CWnd
От: rus blood Россия  
Дата: 22.07.04 11:02
Оценка:
Здравствуйте, kpn, Вы писали:

kpn>Большое спасибо за советы.


kpn>Еще один вопрос:

kpn>После того, как я создам окно при помощи create, его под конец работы надо как-то самому разрушать, или не обязательно?

Лучше разрушить через DestroyWindow.
Имею скафандр — готов путешествовать!
Re[2]: Проблема с наследником от CWnd
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 22.07.04 11:07
Оценка:
Здравствуйте, kpn, Вы писали:

kpn>Большое спасибо за советы.


kpn>Еще один вопрос:

kpn>После того, как я создам окно при помощи create, его под конец работы надо как-то самому разрушать, или не обязательно?

Написать m_dev.DestroyWindow() никогда не помешает, но:

The CWnd::DestroyWindow method only sends the WM_DESTROY message.

Когда Ваше приложение заканчивает работу, ему приходит это же сообщение — WM_DESTROY.
Подумайте, возможно вызов DestroyWindow — это лишняя работа, хотя никому от этого хуже не станет.
Любая задача имеет решение, даже когда решения не существует
Re[3]: Проблема с наследником от CWnd
От: rus blood Россия  
Дата: 22.07.04 11:16
Оценка:
Здравствуйте, Burd, Вы писали:

B>The CWnd::DestroyWindow method only sends the WM_DESTROY message.

Это откуда такая строка?

B>Когда Ваше приложение заканчивает работу, ему приходит это же сообщение — WM_DESTROY.

Это потому, что обычно приложение заканчивает работу при нажатии на "крестик" в заголовке окна.
Окно получает сообщение WM_CLOSE и стандартный обработчик для этого сообщения вызывает DestroyWindow.
DestroyWindow имеено разрушает окно, а WM_DESTROY — всего лишь нотификация окну, что его разрушают.

B>Подумайте, возможно вызов DestroyWindow — это лишняя работа, хотя никому от этого хуже не станет.

Проблема может быть в том, что объект класса (m_dev) может "неожиданно" скончаться (удален, вышел из стека) до того, как окно разрушено. В этом случае можно получить много веселых run-time ошибок.
Имею скафандр — готов путешествовать!
Re[4]: Проблема с наследником от CWnd
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 22.07.04 11:25
Оценка:
Здравствуйте, rus blood, Вы писали:


B>>The CWnd::DestroyWindow method only sends the WM_DESTROY message.

RB>Это откуда такая строка?

Из МСДН January 2000

B>>Когда Ваше приложение заканчивает работу, ему приходит это же сообщение — WM_DESTROY.

RB>Это потому, что обычно приложение заканчивает работу при нажатии на "крестик" в заголовке окна.
RB>Окно получает сообщение WM_CLOSE и стандартный обработчик для этого сообщения вызывает DestroyWindow.
RB>DestroyWindow имеено разрушает окно, а WM_DESTROY — всего лишь нотификация окну, что его разрушают.

Возможно

B>>Подумайте, возможно вызов DestroyWindow — это лишняя работа, хотя никому от этого хуже не станет.

RB>Проблема может быть в том, что объект класса (m_dev) может "неожиданно" скончаться (удален, вышел из стека) до того, как окно разрушено. В этом случае можно получить много веселых run-time ошибок.

Согласен, поэтому попросил подумать.
Любая задача имеет решение, даже когда решения не существует
Re[5]: Проблема с наследником от CWnd
От: rus blood Россия  
Дата: 22.07.04 11:36
Оценка:
Здравствуйте, Burd, Вы писали:

B>>>The CWnd::DestroyWindow method only sends the WM_DESTROY message.

RB>>Это откуда такая строка?

B>Из МСДН January 2000


Старая пиратская версия.
К тому же, самими пиратами и написанная...
Имею скафандр — готов путешествовать!
Re[4]: Проблема с наследником от CWnd
От: Уважаемый товарищ Аноним  
Дата: 23.07.04 07:06
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Burd, Вы писали:


B>>The CWnd::DestroyWindow method only sends the WM_DESTROY message.

RB>Это откуда такая строка?

B>>Когда Ваше приложение заканчивает работу, ему приходит это же сообщение — WM_DESTROY.

RB>Это потому, что обычно приложение заканчивает работу при нажатии на "крестик" в заголовке окна.
RB>Окно получает сообщение WM_CLOSE и стандартный обработчик для этого сообщения вызывает DestroyWindow.
RB>DestroyWindow имеено разрушает окно, а WM_DESTROY — всего лишь нотификация окну, что его разрушают.

B>>Подумайте, возможно вызов DestroyWindow — это лишняя работа, хотя никому от этого хуже не станет.

RB>Проблема может быть в том, что объект класса (m_dev) может "неожиданно" скончаться (удален, вышел из стека) до того, как окно разрушено. В этом случае можно получить много веселых run-time ошибок.

A>

if(::IsWindow(m_dev.GetSafeHwnd())) m_dev.DestroyWindow();


A> В
OnDestroy()
главного окна?


А> Хотя, если оно еще живое, винда в
OnDestroy()
его и так уконтрапупит.

A> Лениво мне очень, очень извиняюсь .
A> Sincerely,
A> Аноним.
Re: Проблема с наследником от CWnd
От: kpn  
Дата: 23.07.04 21:07
Оценка:
Итак, подводя итоги я делаю следующий вывод:
Разрушать самому созданное окно НЕ обязательно, так как в любом случае, при закрытии всего приложения оно разрушится автоматически.
В то время, как самовольное разрушение плюсов никаких не дает, однако, дает проблеммы.

Я прав ? Или все же есть какие-то плюсы самовольного разрушения окон??
Re[2]: Проблема с наследником от CWnd
От: Аноним  
Дата: 24.07.04 14:17
Оценка:
Здравствуйте, kpn, Вы писали:

kpn>Итак, подводя итоги я делаю следующий вывод:

kpn>Разрушать самому созданное окно НЕ обязательно, так как в любом случае, при закрытии всего приложения оно разрушится автоматически.
kpn>В то время, как самовольное разрушение плюсов никаких не дает, однако, дает проблеммы.

kpn>Я прав ? Или все же есть какие-то плюсы самовольного разрушения окон??


A> Плюсы кой — какие могут быть:

A> 1 — Плюсы: Если у аппа окон много, то уничтожив ненужные, высвобождаем системные
A> ресурсы, это может быть более — менее критично в 98 — й, менее в 2K и старше.
A> 2 — минусы: a) Создание окна требует много времени. b) Лишние заморочки с проверками
A> типа if(::IsWindow(HWND)&&(NULL != pWindowObjectPtr)) и т.п.
A> По моему где — то так...
A> Лениво мне очень, очень извиняюсь .
A> Sincerely,
A> Аноним.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.