Что нового.
Немного изменена структура требуемая XML-файла, описывающего диалоговое окно — теперь атрибуты шрифта задаются внутри отдельного тега <Font>, являющегося дочерним по отношению к тэгу <Dialog>:
<Dialog
Styles="Popup Caption SysMenu SetFont ModalFrame"
Left="0" Top="0" Width="260" Height="90"
Caption="Test Dialog">
<Font
TypeFace="Tahoma"
PointSize="8"/>
...
</Dialog>
Реализовна возможность создания "расширенных" диалоговых окон (шаблоны которых состоят из набора структур DLGTEMPLATEEX/DLGITEMTEMPLATEEX). С этой целью в тэг <Dialog> добавлен булев атрибут "Extended"; если он имеет значение "истина", то из тэгов <Dialog> и <Control> дополнительно считывается атрибут "HelpID", позволяющий назначить идентификатор контекстной справки (значение данного атрибута должно задаваться в виде строкового представления десятичного или шестнадцатеричного 4-байтового числа).
Кроме того, для "расширенных" диалоговых окон из тэга <Font> дополнительно считываются атрибуты "Weight" ("вес" шрифта в виде строкового представления числа, соответствующего одной из констант FW_*; на данный момент Windows игнорирует это значение и всегда использует FW_REGULAR), "Italic" (если имеет ненулевое значение, то шрифт становится курсивным) и "CharSet" (в виде строкового представления числа, соответствующего одной из констант *_CHARSET; если данный атрибут не задан, то по умолчанию используется значение "0", соответствующее ANSI_CHARSET).
В методе CDialogXML::DoModal() теперь проверяется наличие папки, путь к которой вернул вызов GetXMLpath(); если такая папка не существует, то предпринимается попытка ее создания. Для билдов, ориентированных на Win95/98/NT (т.е. выполненных при значении директивы препроцессора _WIN32_WINDOWS меньшем 0x0490), это делается с помощью функции MakeSureDirectoryPathExists() из dbghelp.dll (вы должны будете распространять ее вместе со своим приложением). Для билдов, ориентированных на WinME/2000/XP (т.е. при _WIN32_WINDOWS больше либо равном 0x0490), используется функция SHCreateDirectoryEx() из shell32.dll (уже присутствует в Windows).
Если папка уже существует (или ее удалось создать), проверяется наличие в ней требуемого XML-файла. В случае, когда он отсутствует, выполняется поиск ресурса типа "DIALOG_XML", имеющего строковое имя, совпадающее с "именем" диалога, хранящимся в поле m_strDialogName. Если такой ресурс будет найден, то его содержимое будет записано в предварительно созданный XML-файл, после чего генерация шаблона диалога продолжится обычным образом. Заметим, что поиск исполняемого модуля, содержащего ресурс, выполняется с помощью функции AfxFindResourceHandle(), которая "просматривает" не только файл приложения, но и все загруженные им MFC extension DLLs.
Добавлена функция-парсер для элементов управления RichEdit; она ассоциирована с оконными классами "RichEdit", "RichEdit20A" и "RichEdit20W".
Обновленный демонстрационный проект:
XMLDialogs.zip[ posted via RSDN@Home 1.1.4 beta 3 r279 ]