epitalon Ответов: 2

установить значок в CButton действительно вызывает утечку GDI ?


Привет,

В настоящее время я ищу утечки GDI в своем приложении MFC.

Я использую Cbutton, на который загружаю значок с помощью метода CButton:SetIcon (). Затем, когда окно владельца уничтожается, оно возвращает значку CButton значение NUll, а затем вызывает соответствующую функцию DestroyIcon ().

Когда я смотрю на Диспетчер приложений Windows, я вижу, что количество выделенных объектов GDI постоянно растет, поскольку пользователь открывает и закрывает окна. И это, кажется, связано с кнопкой значка : когда я удаляю вызов SetIcon, оставляя кнопку пустой, количество выделенных объектов GDI стабильно !

Я вижу, что вызов функции DestroyIcon() при закрытии окна помогает поддерживать низкое количество объектов GDI, но этого недостаточно.

Есть вопрос comctl32, связанной с двигателем V6 ? Я имею в виду, создает ли кнопка больше изображений на основе данного значка, чтобы приспособиться ко всем состояниям кнопки, тогда она "забудет" уничтожить эти изображения ?

Может ли кто-нибудь помочь мне или сказать, что я сделал не так ?

Заранее спасибо

CPallini

Вероятно, просмотр соответствующих фрагментов кода поможет.

2 Ответов

Рейтинг:
2

epitalon

ах, извините !..

Я забыл, что моя пуговица не была простой Кнопкой !
Я только что узнал, что ошибка находится в классе C++, который я получил от CodeProject.

Это CImageButtonWithStyle :

// Класс CImageButtonWithStyle-это производный класс CButton, который
// обрабатывает уведомление NM_CUSTOMDRAW для предоставления тематических визуальных стилей XP
// внешний вид кнопок с набором стилей BS_BITMAP или BS_ICON.
// Это делает их похожими на внешний вид обычных кнопок с текстовыми метками.
// Элементы управления Windows по умолчанию не обеспечивают тематический внешний вид для
// эта кнопка.

На самом деле в коде есть некоторая утечка GDI : каждый раз, когда рисуется значок-кнопка, этот простой фрагмент кода :

HICON hIcon;
ICONINFO ii;
GetIconInfo (hIcon, &ii);


генерирует не более двух HBITMAP, которые впоследствии должны быть удалены, с:

DeleteObject (ii.hbmColor);
DeleteObject (ii.hbmMask);


Спасибо, CPallini : вы заставили меня взглянуть ближе к проблеме !


Рейтинг:
2

steveb

КСТАТИ. Вам не нужно использовать сторонние кнопки начиная с VC 8.0. CMFCButton (новый класс кнопок MFC) имеет возможность отображать изображения.


Richard Deeming

СЕМЬ ЛЕТ слишком поздно!

steveb

Ответ был не для него, а для других, кто натыкается на этот вопрос. Особенно если он находится на вершине списка других связанных с этим вопросов сегодня.

Richard Deeming

Это в верхней части списка потому что вы опубликовали новое решение!