Конференция "WinAPI" » Как рисовать не текущей темой оформления? Хотя бы на DC, [D7, WinXP]
 
  • Д7 (12.08.16 22:41) [0]
    Как рисовать не текущей темой оформления?
    Хотя бы на HDC, а не "применять" к своим окнам.
    Хотя интересно и это тоже. Есть же софт который так может (оба варианта).

    Кто не в теме - имеются ввиду функции типа DrawTheme*()
  • Игорь Шевченко © (13.08.16 10:22) [1]
    Стандартно - никак, рисование тем находится на базовом уровне системы.
    Софт, который может, рисует руками от начала до конца, скорее всего.
  • Игорь Шевченко © (13.08.16 10:23) [2]
    Или подключай в манифесте древний comctl32 без поддержки тем и снова же руками рисуй.
  • Pavia © (13.08.16 15:19) [3]
    Да у Вас беда с логикой.

    Как положить жирафа в холодильник?

    Предполагаемое верное решение: Открыть холодильник, положить туда жирафа, закрыть холодильник.

    Как запихнуть слона в холодильник?

    Предполагаемое верное решение: Открыть холодильник, вынуть оттуда жирафа, засунуть туда слона, закрыть холодильник.


    > Стандартно - никак, рисование тем находится на базовом уровне
    > системы.Софт, который может, рисует руками от начала до
    > конца, скорее всего.

    Ручками уже лет 20 никто не рисует. Есть же фреймворки/движки UI.
  • Д7 (13.08.16 15:23) [4]
    Насколько я знаю просто dll перехватывает рисование стандартных классов, разве нет?

    Ну допустим применять к окну нельзя, это просто отрисовка руками, но даже тогда первая часть вопроса всё равно в силе: как же рисовать не текущей, а одной из других имеющихся?
    А софт который я видел выводит список всех тем в системе и можно выбрать из них. Тема меняется только у окон программы, системную не меняет. Может оно как-то обманывает dll?
  • Д7 (13.08.16 15:26) [5]
    Не было вашего сообщения, пока писал предыдущий ответ.
    Просто меня интересует управление стандартными темами ОС, а не всякие фреймворки. При наличии манифеста ОС и так сама рисует уже всё что надо. Мне интересно как тему изменить.
  • Игорь Шевченко © (13.08.16 19:05) [6]

    > Ручками уже лет 20 никто не рисует. Есть же фреймворки/движки
    > UI.


    Вы, сударь, ерунду говорите.
  • Игорь Шевченко © (13.08.16 19:09) [7]

    > разве нет?


    Нет. Еще раз - поддержка тем встроена в базовые библиотеки (user32.dll), если есть желание - можно, конечно, ее заменять. При подключении нужной comctl32.dll через манифест, она она эскпортирует набор нужных функций, о которых знает user32.dll. Тема в каждый момент времени одна на все стандартные окна, двух не получится.
  • Д7 (14.08.16 00:00) [8]
    >> The visual styles API implemented in UxTheme.dll © msdn
    Поддержка тем находится в UxTheme.dll и рисуют тему тоже функции из неё.
    Приложение может подгружать user32 и comctl32 но тем нету, они работают только когда подгружена uxtheme.

    Тут я уже не уверен, но UxTheme откуда-то же берёт имя текущей темы? Подозреваю что из реестра. И она же должна прочитать этот файл сперва? Если её как-то обмануть и подсунуть другой путь?
    И вообще - стандартный "предпросмотр тем" рисует же не текущей темой. Как он "открывает" другую тему?
  • Игорь Шевченко © (14.08.16 10:17) [9]
    Д7   (14.08.16 00:00) [8]

    А зачем что-то подозревать - ты можешь взять отладчик и пройти по обработке оконных сообщений стандартной процедуры.
  • Д7 (14.08.16 14:03) [10]
    Мне знаний/навыков не хватит. В институте не показывали как пользоваться отладчиками, сам потихоньку учусь из сети и методом тыка - дак у меня Делфи только по строкам моего исходника прыгает. Как я в АПИ залезу?
    Свой код я кое-как отлаживаю, получается, а как чужой - не знаю. Конечно понятно я просто не особо умею, что-то не знаю, но разве меня пустит внутрь функций ОС?
    И надо ж не оконную процедуру, думаю загрузка происходит где-нибудь в DllInit этой UxTheme.

    "Вангую": запускатор exe-файлов видит манифест и тогда насильно инжектит к моему процессу dll-ку UxTheme, а та в своей DllInit читает из реестра имя текущей темы и грузит её файлы. А потом вероятно сабклассит все окна процесса, беря их отрисовку на себя. И когда есть сообщение об изменении текущей темы - снова читает из реестра имя новой текущей темы и грузит её файлы. Ну и после рассылает всем окнам процесса сообщения перерисоваться.
  • Игорь Шевченко © (14.08.16 15:15) [11]
    Д7   (14.08.16 14:03) [10]

    Ванговать ничего не надо, надо взять отладчик и пройти. Это не сложно, отладчик искать по слову windbg.
 
Конференция "WinAPI" » Как рисовать не текущей темой оформления? Хотя бы на DC, [D7, WinXP]
Есть новые Нет новых   [118461   +16][b:0][p:0]