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




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

Похожие статьи:
IS-DOS - Spectrum & OS
Ха-хакер - "Высказывания" отдельных представителей постоянно вымирающего класса - военных.
Credits - Главный редактор был пойман кучкой ламеров. Ламеры отлеживаютя в больнице.
Фанта - Памятка интуристу (Из цикла "Истец всему").
Опрос - Анкета от Eternity Industry.

В этот день...   18 апреля