ZXNet эхоконференция «zxnet.pc»


тема: GDI



от: Eugene Palenock
кому: Aleksandr Majorov
дата: 04 Sep 2003
Привет, Aleksandr! Кстати, как ты тот сабжевый глюк делал ? Делаю в цикле CreatePen(PS_SOLID,1,1) - после их завершения (когда начинает возращать ошибку) интерфейс подглючивает, но не так сильно как у тебя... С уважением, Евгений.

от: Aleksandr Majorov
кому: Eugene Palenock
дата: 08 Sep 2003
Привет Eugene! 04 Сен 03 02:31, Eugene Palenock -> Aleksandr Majorov: EP> Кстати, как ты тот сабжевый глюк делал ? Чесно говоря, случайно :) Гораздо дольше и забавнее я его искал! EP> Делаю в цикле CreatePen(PS_SOLID,1,1) - после их завершения (когда EP> начинает возращать ошибку) интерфейс подглючивает, но не так сильно EP> как у тебя... Хе-хе, глючить тоже нужно умеючи! %) Значитсья писано на MSVC, проект "обычный диалог" (так проще) ╒═════════════════════════ Hачало GlukDlg.cpp ═════════════════════════╕ ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // В хеадере GlukDlg.h описываем переменные: DWORD m_Res; CString m_Time; time_t m_time; CImageList Image_Tray; // Иконки System Tray int m_num; NOTIFYICONDATA m_Tray; ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CGlukDlg message handlers BOOL CGlukDlg::OnInitDialog(){ CDialog::OnInitDialog(); // подготовка к глюку // будем часто-часто вызывать глюк-функцию m_time = time(NULL); SetTimer(0, 10, NULL); // загрузили битмап в массив картинок, Image_Tray.Create(IDB_SYSTRAY, 16, 8, RGB(1,1,1)); m_num = 0; // для наглядности создадим иконку в system tray, и будем там её анимировать. m_Tray.cbSize = sizeof(NOTIFYICONDATA); m_Tray.hWnd = m_hWnd; m_Tray.uID = 123; m_Tray.uCallbackMessage = WM_USER; sprintf(m_Tray.szTip, "Глюк!"); m_Tray.hIcon = Image_Tray.ExtractIcon(0); // раз утечка m_Tray.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIcon(NIM_ADD, &m_Tray); return TRUE; } // а вот и функция, которая будет вызываться по таймеру void CGlukDlg::OnTimer(UINT nIDEvent){ time_t xtime; int hour, min, sec; CDialog::OnTimer(nIDEvent); // выводим сколько времени мы уже глючим xtime = time(NULL) - m_time; hour = xtime / 60; min = hour % 60; hour /= 60; sec = xtime % 60; m_Time.Format("%02i:%02i:%02i", hour, min, sec); // а вот собственно и глюк! m_Tray.hIcon = Image_Tray.ExtractIcon(m_num); m_Tray.uFlags = NIF_ICON; Shell_NotifyIcon(NIM_MODIFY, &m_Tray); /* что хотели сделать: чтоб иконка в трее анимировалась, но для удобства желаем хранить все иконки в одном bmp-файле. Штатными средствами загрузили этот BMP в CImageList, у которого есть штатная функция "достать иконку по индексу" ExtractIcon(). Что получили: ну да, все анимируется. Однако, как оказалось, ExtractIcon() работает иначе: она не вынимает иконку, а создает новую и копирует в нее картинку по индексу. Т.е. более правильно было бы обозвать эту п/п как CreateIcon()! И если созданную иконку не убивать чем-то вроде DestroyObject(m_Tray.hIcon), то иконки будут множиться и множиться. А потом ка-а-а-ак прыгнут! :) Причем _нигде_ нет ни слова про опасность этой гадости с ExtractIcon()! */ // подсчитываем количество убитых ресурсов if(m_Tray.hIcon != NULL) m_Res++; m_num++; if(m_num == 8) m_num = 0; CString str; str.Format("%i", m_Res); GetDlgItem(IDC_EDIT1)->SetWindowText(str); GetDlgItem(IDC_EDIT2)->SetWindowText(m_Time); } ╘═════════════════════════ Конец GlukDlg.cpp ═════════════════════════╛ Aleksand

от: Eugene Palenock
кому: Aleksandr Majorov
дата: 10 Sep 2003
Привет, Aleksandr! 08 Сен 03 19:21, Aleksandr Majorov -> Eugene Palenock: AM> ExtractIcon() работает иначе: она не вынимает иконку, а создает новую и AM> копирует в нее картинку по индексу. Т.е. более правильно было бы AM> обозвать эту п/п как CreateIcon()! И если созданную иконку не убивать AM> чем-то вроде DestroyObject(m_Tray.hIcon), то иконки будут множиться и AM> множиться. А потом ка-а-а-ак прыгнут! :) AM> Причем _нигде_ нет ни слова про опасность этой гадости с ExtractIcon()! Читаю мсдн-2002-06: Remarks You must destroy the icon handle returned by ExtractIcon by calling the DestroyIcon function. зы. подозреваю, что любые хэндлы (например, файловые ;) могут закончится. И любая винда рухнет. Ибо имхо в случае например с hFile - их ядро не может как-либо безопасно лимиторовать для юзера... С уважением, Евгений.

от: Aleksandr Majorov
кому: Eugene Palenock
дата: 12 Sep 2003
Привет Eugene! 10 Сен 03 00:28, Eugene Palenock -> Aleksandr Majorov: [поскипано] AM>> Причем _нигде_ нет ни слова про опасность этой гадости с AM>> ExtractIcon()! EP> Читаю мсдн-2002-06: EP> Remarks EP> You must destroy the icon handle returned by ExtractIcon by calling EP> the DestroyIcon function. Hу значит я плохо читал. EP> зы. подозреваю, что любые хэндлы (например, файловые ;) могут EP> закончится. И любая винда рухнет. Ибо имхо в случае например с hFile - EP> их ядро не может как-либо безопасно лимиторовать для юзера... Более быстро и забавнее винда падает если открывать в бесконечном цикле новое окно. По крайней мере так писалось на форуме, сам я не проверял :) Aleksand




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Music scene - обзор музыки c Forever Hex.
Фэнтези - Челoвек кoтoрый никoгда не лгал.
События - демопати в Казани: CAFe'2002 - рассказ Tigrr/Brainwave.
Демопати - анонс ASCII'2002.
Реклама на канале "ББС"

В этот день...   8 мая