FreeBasic
Главная
Вход
Регистрация
Суббота, 20.04.2024, 03:52Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Как задействовать стиль Windows без манифеста? (Как задействовать стиль Windows без манифеста?)
Как задействовать стиль Windows без манифеста?
armagidon1Дата: Понедельник, 09.01.2023, 19:06 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 25
Репутация: 0
Статус: Offline
Как задействовать нормальный стиль Windows без манифеста, а не этот из Win95?
Как в других программах, без .manifest, например.
 
zamabuvaraeuДата: Вторник, 10.01.2023, 19:39 | Сообщение # 2
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: 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
Репутация: 0
Статус: Offline
О, спасибо!
Моя вечная признательность.
 
VitaminДата: Среда, 11.01.2023, 19:09 | Сообщение # 4
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline
О! совсем другое дело, стало выглядеть по-человечески. И вопрос в догонку
Цитата
Не забываем вызвать InitCommonControlsEx перед созданием окон и диалогов:
У меня все прекрасно работает без этой функции - проверял на WinXP_x32 и Win10_x64. Может она и не нужна тогда?
 
zamabuvaraeuДата: Среда, 11.01.2023, 20:30 | Сообщение # 5
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: 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>
 
Форум » Freebasic » Вопросы по языку FreeBasic » Как задействовать стиль Windows без манифеста? (Как задействовать стиль Windows без манифеста?)
  • Страница 1 из 1
  • 1
Поиск: