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


Автор: Бугемот 27.4.2006, 13:13
Привет!
в mdi приложении из главного окна может открываться дочернее, но всего лишь одно. указатель на это дочернее окно является членом класса CMainFrame. Вот код:
Код

void CMainFrame::OnShowAll()
{
    if (m_pFrameShowAll) // если указатель не пустой
        if (!IsWindow(m_pFrameShowAll->GetSafeHwnd())) // вот тут проверяю, существует ли окно.
            m_pFrameShowAll = NULL;
    if (m_pFrameShowAll)
    {
        if (m_pFrameShowAll->GetSafeHwnd())
        {
            m_pFrameShowAll->MDIActivate();
            m_pFrameShowAll->MDIRestore();
            return;
        }
    }
....
}

окон подобного типа у меня несколько (соответственно, на каждое окно - свой указатель)
если одновременно открыть все возможные окна в приложении (и из главного окна и из дочерних), а потом их закрыть, оставив только главное окно. то через некоторое время на строке
Код

if (!IsWindow(m_pFrameShowAll->GetSafeHwnd())) 

отладчик выдает ошибку (отлаживаю пошагово). хотя код работает и проверен многократно. а ошибка вылетает только если все окна открывать. что это за ерунда такая? smile 

Автор: threef 27.4.2006, 13:21
проверь m_pFrameShowAll на NULL 

Автор: Бугемот 27.4.2006, 13:23
Самая первая строка кода это и делает smile 

Автор: threef 28.4.2006, 20:38
Поставь :: перед IsWindow. Ато у тебя с MainFrame глюк возможен. Или мало информации, чтобы рассуждать. Еще обрати внимание на то, какой ASSERT выскакивает при этом 

Автор: Бугемот 29.4.2006, 11:48
Цитата(threef @  28.4.2006,  20:38 Найти цитируемый пост)
Поставь :: перед IsWindow

так и было с самого начала, когда уже начались шаманские танцы, убрал :: smile
Цитата(threef @  28.4.2006,  20:38 Найти цитируемый пост)
 Еще обрати внимание на то, какой ASSERT выскакивает при этом 

память can not be read, причем эта ошибка проявляется как-то не сразу. Т.е. код может несколько раз отработать нормально, а потом на этой строчке - рухнет.
Вобщем, после двух дней мытарств я так и не разобрался в чем дело. Пришлось переделать - теперь просто получаю список всех дочерних для CMainFrame окон и все. (EnumChildWindows) 

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