armagidon1 | Дата: Понедельник, 09.01.2023, 19:06 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 25
Статус: Offline
| Как задействовать нормальный стиль Windows без манифеста, а не этот из Win95? Как в других программах, без .manifest, например.
|
|
| |
zamabuvaraeu | Дата: Вторник, 10.01.2023, 19:39 | Сообщение # 2 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| В других программах везде манифест используют. Пишете свой манифест: Код <?xml version="1.0" encoding="utf-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" name="ProrgamName" processorArchitecture="*" type="win32" /> <description>Description</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
Файл ресурсов: Код 1 RT_MANIFEST "src\\app.exe.manifest"
Не забываем вызвать InitCommonControlsEx перед созданием окон и диалогов: Код Function EnableVisualStyles()As Integer Dim icc As INITCOMMONCONTROLSEX = Any icc.dwSize = SizeOf(INITCOMMONCONTROLSEX) icc.dwICC = ICC_ANIMATE_CLASS Or _ ICC_BAR_CLASSES Or _ ICC_COOL_CLASSES Or _ ICC_DATE_CLASSES Or _ ICC_HOTKEY_CLASS Or _ ICC_INTERNET_CLASSES Or _ ICC_LINK_CLASS Or _ ICC_LISTVIEW_CLASSES Or _ ICC_NATIVEFNTCTL_CLASS Or _ ICC_PAGESCROLLER_CLASS Or _ ICC_PROGRESS_CLASS Or _ ICC_STANDARD_CLASSES Or _ ICC_TAB_CLASSES Or _ ICC_TREEVIEW_CLASSES Or _ ICC_UPDOWN_CLASS Or _ ICC_USEREX_CLASSES Or _ ICC_WIN95_CLASSES Dim res As BOOL = InitCommonControlsEx(@icc) If res = 0 Then Return 1 End If Return 0 End Function
И вульваля! Визуальные стили XP включены.
|
|
| |
armagidon1 | Дата: Вторник, 10.01.2023, 21:16 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 25
Статус: Offline
| О, спасибо! Моя вечная признательность.
|
|
| |
Vitamin | Дата: Среда, 11.01.2023, 19:09 | Сообщение # 4 |
Лейтенант
Группа: Пользователи
Сообщений: 59
Статус: Offline
| О! совсем другое дело, стало выглядеть по-человечески. И вопрос в догонкуЦитата Не забываем вызвать InitCommonControlsEx перед созданием окон и диалогов: У меня все прекрасно работает без этой функции - проверял на WinXP_x32 и Win10_x64. Может она и не нужна тогда?
|
|
| |
zamabuvaraeu | Дата: Среда, 11.01.2023, 20:30 | Сообщение # 5 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Ответ даёт Рэймонд Чэн (в переводе Гансмокера)
Если InitCommonControls ничего не делает - зачем же мне её вызывать?
Одной из проблем, с которыми встречаются новички, когда они начинают использовать общие элементы управления оболочки (shell common controls), является забывание про вызов [url=http://msdn.microsoft.com/en-us/library/bb775695(VS.85).aspx]функции InitCommonControls[/url]. Но если вы дизассемблеризируете саму функцию InitCommonControls, то вы увидите, что она, как и функция FlushInstructionCache, ничего не делает.
Тогда зачем вам её вызывать?
Как и с FlushInstructionCache, здесь важно, не то, что делает функция, а важен просто сам факт, что вы её вызываете.
Вспомните, что простое указание ссылки на библиотеку в импорте не приводит к связыванию вашего приложения с этой библиотекой. Вам нужно вызвать функцию из этой DLL, чтобы линкер создал запись импорта в вашей программе для этой DLL. И InitCommonControls и есть такая функция.
Без функции InitCommonControls, программа, которая хочет использовать библиотеку общих элементов управления оболочки, могла бы не иметь ссылки на библиотеку COMCTL32.DLL в своей таблице импорта. Это означает, что когда программа запускается, то COMCTL32.DLL не загружается и, поэтому, не инициализируется. Что означает, что она не регистрирует свои оконные классы. Что, в свою очередь, означает, что ваш вызов [url=http://msdn.microsoft.com/en-us/library/ms632679(VS.85).aspx]CreateWindow[/url] завершится неудачно, потому что оконный класс не был зарегистрирован.
Вот почему вам нужно вызывать функцию, которая ничего не делает. Это для вашего же блага.
(Конечно же, теперь есть новая [url=http://msdn.microsoft.com/en-us/library/bb775697(VS.85).aspx]функция InitCommonControlsEx[/url], которая позволяет вам указать классы, которые вы хотели бы зарегистрировать. При загрузке COMCTL32.DLL регистрируются только классические классы из Windows 95 - для всего остального вам нужно попросить загрузку отдельно).
Блог GunSmoker-а (переводы): Если InitCommonControls ничего не делает - зачем же мне её вызывать? (transl-gunsmoker.ru)Добавлено (11.01.2023, 20:41) --------------------------------------------- Один из примеров манифеста. Желательно добавить раздел с dpiAwarenes чтобы программа не замыливалась на мониторах с вывоким DPI: Код <?xml version="1.0" encoding="utf-8" standalone="yes"?><!-- В релизной версии комментарии желательно удалить -->
<!-- Корневой элемент оставляем без изменений --> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0"> <!-- Этот раздел обязателен Здесь нужно указывать версию программы и name в формате «НазваниеКорпорации.НазваниеПродукта.НазваниеПрограммы» атрибут type всегда должен быть равен win32 --> <assemblyIdentity version="1.0.0.0" name="BatchedFiles.DateTimePicker.DateTimePicker" processorArchitecture="*" type="win32" /> <!-- Описание программы --> <description>DateTimePicker</description> <!-- Использование COM без регистрации в реестре <file name="sampleu.dll"> <comClass description="Font Property Page" clsid="{0BE35200-8F91-11CE-9DE3-00AA004BB851}" threadingModel="Apartment" /> <comClass description="Color Property Page" clsid="{0BE35201-8F91-11CE-9DE3-00AA004BB851}" /> <comClass description="Picture Property Page" clsid="{0BE35202-8F91-11CE-9DE3-00AA004BB851}" /> <typelib tlbid="{44EC0535-400F-11D0-9DCD-00A0C90391D3}" version="1.0" helpdir="" /> </file> --> <!-- Добавляем если нужна поддержка стилей как в XP, иначе интерфейс будет выглядеть как в Windows 2000 Для консольных программ и неинтерактивных служб не требуется --> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> <!-- Добавляем если программа поддерживает возможности версий ОС --> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 если не указать, то функция GetVersionEx будет возвращать версию системы 8.1, вместо 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"></supportedOS> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"></supportedOS> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS> <!-- Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS> </application> </compatibility> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <!-- Если эта секция отсутствует в манифесте, к приложению будет применена виртуализация файловой системы и реестра. Если такое приложение пытается записать что‐то в защищённые папки типа «Program files», запись будет перенаправлена в папку «%userprofile%\AppData\Local\VirtualStore\Program files». Аналогично, попытки записи в раздел реестра HKEY_LOCAL_MACHINE будут перенаправлены в «HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE». Естественно, сделанные таким образом изменения будут видны только приложениям, запущенным в режиме виртуализации. --> <security> <requestedPrivileges> <!-- Для запуска с правами простого пользователя --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <!-- Для запуска с правами администратора, в этом случае выскочит UAC с требованием ввести пароль --> <!-- <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> --> <!-- Ставим uiAccess="true" только если программа отправляет пользовательский ввод в другие программы, например, наша программа — это виртуальная клавиатура --> </requestedPrivileges> </security> </trustInfo> <asmv3:application> <asmv3:windowsSettings> <!-- Добавляем если программа осведомлена о поддержке высокого DPI --> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> <!-- Добавляем если программа осведомлена о поддержке высокого DPI на разных мониторах с уведомлением дочерних окон о смене DPI Если тег dpiAwareness присутствует, то тег dpiAware игнорируется --> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> <!-- Добавляем если нужно масштабирование GDI --> <!-- <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> --> </asmv3:windowsSettings> </asmv3:application> </assembly>
|
|
| |