Продолжаю рассказывать о продвинутых фичах в Tiger2; теперь -- об относящихся к диалогу, появляющемуся в гуёвом режиме (при запуске с пустой командной строкой).
* В заголовке диалога нет иконки, причём в кнопке на таскбаре она есть, и при переключении по Alt-Tab -- тоже есть. Эта иконка была сгенерирована IrfanView из полноразмерной картинки, и по её краям идёт заметная светло-серая полоса антиалиасинга. На сером фоне кнопки это смотрится нормально, а на синем фоне заголовка -- плохо; поэтому я постарался совсем убрать иконку из заголовка.
Оказалось, что единственный способ убрать оттуда иконку, сохранив её в остальных местах -- это пометить ехе-шник как предназначенный для WinNT 3.x. В этом случае для совместимости со старыми прогами включается "режим Windows 3.x", в котором фон у окон белый, текст набран шрифтом System и т.д. Всё, что мне нужно от этого режима -- это отсутствие иконки в заголовке; остальные эффекты потом приходится вручную исправлять (перекрашивать окно, менять шрифт на MS Shell Dlg и т.д.)
Как выяснилось позже, в WinXP со включёнными темами иконка в заголовке всё равно отрисовывается. Будем считать это багом в uxtheme.dll, нарушающим совместимость с существующими со времён WinNT 3.1 программами
* Картинка с Тигрой в левой части диалога -- это статик с SS_ENHMETAFILE, поэтому при изменении размеров системных шрифтов она будет красиво растягиваться вместе со всем диалогом, а не зависать в углу либо в центре рамки. (Можете проверить.)
Сам метафайл сгенерирован лежащей рядом с исходниками прогой на VB, и состоит из единственного элемента -- иконки размером 115х104. (Винда поддерживает иконки даже таких необычных размеров.) Картинка была сделана иконкой, а не битмапом, -- затем, чтобы её фон был "прозрачным", т.е. принимал системное значение цвета фона.
В иконке задействована ещё одна нечасто применяемая фича -- "инверсные пикселы", которые принимают цвет, контрастный с цветом фона в соответствующем месте. (Инверсные пикселы часто применяются в курсорах, но поддерживаются также и в иконках.) Именно из таких инверсных пикселов составлена надпись "CS.USU.EDU.RU", поэтому она будет различима при любом системном цвете фона. (Можете проверить.)
* Самая понтовая из фич гуёвого режима -- это гиперссылки в месседжбоксе About. (Это действительно обычный месседжбокс, а не хитрый кастомный диалог.) Сами гиперссылки -- это обычные статики; сразу после создания месседжбокса они добавляются на него из таймера, запускаемого непосредственно перед вызовом MessageBox. Затем месседжбокс сабклассится, и новый обработчик придаёт добавленным статикам функциональность гиперссылок -- меняющийся при наведении цвет, подчёркивание, курсор-палец и т.д.
На этом месте я случайно нажал Esc, потерял весь набранный текст, и был вынужден сочинять его по-новой. Раз уж пошло добавление на форум Хитрых Скриптов, нельзя ли добавить такой, который отключит на время набора текста кнопку Esc?
При добавлении статиков-гиперссылок их координаты рассчитываются при помощи DrawText(DT_CALCRECT), так что они не попадут мимо положенного места даже при нестандартных размерах системных шрифтов. (Можете проверить.)