Есть проблема, а заключается она в следующем:
Есть класс, базовым которого является CWnd (class CDevice : public CWnd)
Этот класс CDevice отвечает за общение с СОМ-портом, поэтому нужно, чтобы
1. Этот класс мог принимать сообщения, как любое стандартное окно.
2. Этот класс не показывал никаких окон, хотя они могут существовать "виртуально"
В одной из процедур класса я пытаюсь запустить таймер. Он не запускается, Debugger говорит, что ошибка находитя в этой стандартной функции (файл Afxwin2.inl)
Насколько я понимаю, ошибка возникает из-за того, что у моего класса 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 );
Здравствуйте, kpn, Вы писали:
kpn>Большое спасибо за советы.
kpn>Еще один вопрос: kpn>После того, как я создам окно при помощи create, его под конец работы надо как-то самому разрушать, или не обязательно?
Здравствуйте, kpn, Вы писали:
kpn>Большое спасибо за советы.
kpn>Еще один вопрос: kpn>После того, как я создам окно при помощи create, его под конец работы надо как-то самому разрушать, или не обязательно?
Написать m_dev.DestroyWindow() никогда не помешает, но:
The CWnd::DestroyWindow method only sends the WM_DESTROY message.
Когда Ваше приложение заканчивает работу, ему приходит это же сообщение — WM_DESTROY.
Подумайте, возможно вызов DestroyWindow — это лишняя работа, хотя никому от этого хуже не станет.
Любая задача имеет решение, даже когда решения не существует
Здравствуйте, 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 ошибок.
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 ошибок.
Согласен, поэтому попросил подумать.
Любая задача имеет решение, даже когда решения не существует
Здравствуйте, Burd, Вы писали:
B>>>The CWnd::DestroyWindow method only sends the WM_DESTROY message. RB>>Это откуда такая строка?
B>Из МСДН January 2000
Старая пиратская версия.
К тому же, самими пиратами и написанная...
Здравствуйте, 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>
Итак, подводя итоги я делаю следующий вывод:
Разрушать самому созданное окно НЕ обязательно, так как в любом случае, при закрытии всего приложения оно разрушится автоматически.
В то время, как самовольное разрушение плюсов никаких не дает, однако, дает проблеммы.
Я прав ? Или все же есть какие-то плюсы самовольного разрушения окон??
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> Аноним.