-
Как рисовать не текущей темой оформления? Хотя бы на HDC, а не "применять" к своим окнам. Хотя интересно и это тоже. Есть же софт который так может (оба варианта).
Кто не в теме - имеются ввиду функции типа DrawTheme*()
-
Стандартно - никак, рисование тем находится на базовом уровне системы. Софт, который может, рисует руками от начала до конца, скорее всего.
-
Или подключай в манифесте древний comctl32 без поддержки тем и снова же руками рисуй.
-
Да у Вас беда с логикой.
Как положить жирафа в холодильник?
Предполагаемое верное решение: Открыть холодильник, положить туда жирафа, закрыть холодильник.
Как запихнуть слона в холодильник?
Предполагаемое верное решение: Открыть холодильник, вынуть оттуда жирафа, засунуть туда слона, закрыть холодильник.
> Стандартно - никак, рисование тем находится на базовом уровне > системы.Софт, который может, рисует руками от начала до > конца, скорее всего.
Ручками уже лет 20 никто не рисует. Есть же фреймворки/движки UI.
-
Насколько я знаю просто dll перехватывает рисование стандартных классов, разве нет?
Ну допустим применять к окну нельзя, это просто отрисовка руками, но даже тогда первая часть вопроса всё равно в силе: как же рисовать не текущей, а одной из других имеющихся? А софт который я видел выводит список всех тем в системе и можно выбрать из них. Тема меняется только у окон программы, системную не меняет. Может оно как-то обманывает dll?
-
Не было вашего сообщения, пока писал предыдущий ответ. Просто меня интересует управление стандартными темами ОС, а не всякие фреймворки. При наличии манифеста ОС и так сама рисует уже всё что надо. Мне интересно как тему изменить.
-
> Ручками уже лет 20 никто не рисует. Есть же фреймворки/движки > UI.
Вы, сударь, ерунду говорите.
-
> разве нет?
Нет. Еще раз - поддержка тем встроена в базовые библиотеки (user32.dll), если есть желание - можно, конечно, ее заменять. При подключении нужной comctl32.dll через манифест, она она эскпортирует набор нужных функций, о которых знает user32.dll. Тема в каждый момент времени одна на все стандартные окна, двух не получится.
-
>> The visual styles API implemented in UxTheme.dll © msdn Поддержка тем находится в UxTheme.dll и рисуют тему тоже функции из неё. Приложение может подгружать user32 и comctl32 но тем нету, они работают только когда подгружена uxtheme.
Тут я уже не уверен, но UxTheme откуда-то же берёт имя текущей темы? Подозреваю что из реестра. И она же должна прочитать этот файл сперва? Если её как-то обмануть и подсунуть другой путь? И вообще - стандартный "предпросмотр тем" рисует же не текущей темой. Как он "открывает" другую тему?
-
Д7 (14.08.16 00:00) [8]
А зачем что-то подозревать - ты можешь взять отладчик и пройти по обработке оконных сообщений стандартной процедуры.
-
Мне знаний/навыков не хватит. В институте не показывали как пользоваться отладчиками, сам потихоньку учусь из сети и методом тыка - дак у меня Делфи только по строкам моего исходника прыгает. Как я в АПИ залезу? Свой код я кое-как отлаживаю, получается, а как чужой - не знаю. Конечно понятно я просто не особо умею, что-то не знаю, но разве меня пустит внутрь функций ОС? И надо ж не оконную процедуру, думаю загрузка происходит где-нибудь в DllInit этой UxTheme.
"Вангую": запускатор exe-файлов видит манифест и тогда насильно инжектит к моему процессу dll-ку UxTheme, а та в своей DllInit читает из реестра имя текущей темы и грузит её файлы. А потом вероятно сабклассит все окна процесса, беря их отрисовку на себя. И когда есть сообщение об изменении текущей темы - снова читает из реестра имя новой текущей темы и грузит её файлы. Ну и после рассылает всем окнам процесса сообщения перерисоваться.
-
Д7 (14.08.16 14:03) [10]
Ванговать ничего не надо, надо взять отладчик и пройти. Это не сложно, отладчик искать по слову windbg.
|