Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема замены изображения кнопки "Пуск" в Windows 2000 [D6, Win2k]


Виталий17 ©   (2004-12-14 11:54:00) 

Здравствуйте! Обнаружил, что в Win 2000 не удается сменить изображение на кнопке "Пуск" при помощи функции API
SendMessage(StartBtn, BM_SETIMAGE, 0, NewImage), StartBtn - хендл кнопки "Пуск" (хендл правильный, проверял в WinSight32), NewImage - хендл нового битмапа. В чем же дело? Кнопка не ловит сообщение
BM_SETIMAGE? Помогите советом, пожалуйста.


Виталий17   (2004-12-15 21:41:00) [1]

>Само слово "Пуск" (в XP - "пуск" берется из ресурсов explorer'а
>- строка #578)
>Дальше - не знаю: нет у меня Win 2000 :)

Действительно, строка 578 - для темы Windows XP, строка 595 - для классической темы. В Win 2000 только строка 578.
Т.е. придется ставить HOOK(прошу прощения за глупые вопросы - только изучаю Win API), ловить WM_PAIN и рисовать ручками. Но по идее, HOOK должен подтормаживать систему. Есть ли другой, менее ресурсоемкий способ?


DVM   (2004-12-15 11:09:00) [2]


> Текст пишется.

Точнее рисуется. Кнопка похоже OwnerDraw.


z007   (2004-12-14 23:11:00) [3]

>>если конечно, текст не рисуется в WM_PAINT
Текст пишется.
Само слово "Пуск" (в XP - "пуск" берется из ресурсов explorer'а
- строка #578)
Дальше - не знаю: нет у меня Win 2000 :)


Виталий17   (2004-12-14 18:50:00) [4]

Покопался в Explorer.exe и Shell32.dll - там такой картинки нет. Символ Windows есть, но без надписи "Пуск". В то же время надпись не является текстом(проверял через GetWindowTextLength), т.е. символ+надпись - все-таки картинка(если конечно, текст не рисуется в WM_PAINT). Может есть ещё какие ни-ть dll-ки с рисунками?
И какое решение может быть в целом?


DVM   (2004-12-14 17:59:00) [5]


> кстати старый битмап тоже в другом.

Другом это каком? Ничего не работает потому, что твоя картинка лежит не в адресном пространстве эксплорера, а в адресном пространстве твоей программы.


Виталий17   (2004-12-14 17:50:00) [6]

Нет, NewImage лежит в другом адресном пространстве, кстати старый битмап тоже в другом.
Интересен такой момент: при посылке хендла нового изображения кнопке(а хендл старого битмапа запоминаем), она окрашивается обычным серым цветом. Посылаем кнопке хендл старого битмапа(запомненный) - рисунок кнопки восстанавливается. Что это значит? WM_PAINT проверяет описатель модуля из которого загружен битмап(по-видимому, Explorer.exe, Shell32.dll или другой файл)? Или есть другие мысли? Заранее спасибо за ответ.


DVM   (2004-12-14 12:23:00) [7]


> Кнопка не ловит сообщение
> BM_SETIMAGE?

точнее обрабатывает и плюет на него. Все рисуется в обработчике WM_PAINT вероятно.
А все хозяйство (NewImage и прочее) в том же адресном пространстве что и кнопка?


Наверх

Титульная страница Поиск, карта сайта Написать письмо