Навіщо?

У Windows XP є менеджер тем (theme manager) який змінює вигляд
більшості стандартних об'єктів Windows. Misrosoft стверджує що старі версії
бібліотеки comctl32.dll містять код для підтримки різних платформ сімейства
Windows. Microsoft розумно вирішила почистити вміст comctl32.dll для
поліпшення роботи тим в Windows XP. Тепер виходить що існує дві версії
бібліотеки: стара (версія 5.8) яка має зворотну сумісність всіх
попередніх версій Windows (у тому числі і XP) і нову версію (версія 6) яка
сумісна тільки з XP (ну і наступними версіями Windows).

За замовчуванням всі програми розроблені під Windows XO використовують версію
5.8, отримуючи той же вигляд що і попередні програми Windows. Для того щоб
використовувати компоненти з бібліотеки 6 версії у вашому додатку ви повинні
підключити до вашого додатком Manifest який Windows буде читати для того
щоб отрісовка компонентів вироблялося через нову бібліотеку.

Що таке маніфест?


Що таке маніфест, і яку роль він відіграє у виборі версії 6.0 бібліотеки
comctl32.dll для мого програми? Маніфест – XML документ який повинен бути
залінковані в ресурси вашої програми. Зазвичай ресурси використовуються для
зберігання таких речей як картинки, іконки і курсори миші. (З тим як
використовувати ресурси ви можете прочитати у моїй статті. Прим. Перекладача) XML
документ, коли підключається в ресурсну секцію дозволяє вирішити Windows XP
яку версію comctl32.dll використовувати.

Як це зробити?


Щоб підключити цей XML маніфест у ваше застосування Ви для початку повинні
знати константи надані Microsoft. Коли ви додаєте ресурс у ваше
додаток, є номер групи і порядковий номер, пов'язаний з ресурсом. Номер
групи зазвичай називається зрозумілим ім'ям. Якщо ви подивитеся провідник ресурсів
(Resource explorer), що поставляється з Delphi у вигляді демонстраційного проекту
(Распологается {$ delphiDemos}) ви побачите групи звані "Strings" (Рядки),
"Bitmaps" (Картинки), "Icons" (Іконки) або "Cursos" (Курсори миші) – це просто
подання номер групи. Номер групи для "Manifest" (маніфесту) – 24, в
відповідно до заголовків C поширюваними Microsoft. Номер маніфесту для
визначення версії бібліотеки comctl32.dll – 1 (Також відповідно до
заголовками C поширюваними Microsoft). Ця інформація буде необхідна
коли ми будемо створювати наш новий ресурс (. RES файл) для підключення до нашого
додатком. Для створення необхідного. RES файлу нам потрібно створити файл. RC в
якому буде міститися наш XML маніфест, що належить до відповідної
групі та номером ресурсу. У zip-архіві включеному в цей документ ви побачите два
файлу:


Файл WindowsXP.RC містить інструціі для підключення WindowsXP.Manifest
(XML-документа), а саме:


Сам маніфест – XML документ містить інформацію про вашому додатку яку
ви додаєте як і інформацію містить версію бібліотеки comctl32.dll для
використання. Його зміст має бути трохи заточене під ваш додаток,
але буде виглядати приблизно так:

<? Xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
name="CiaoSoftware.Ciao.Shell.Contacts"
processorArchitecture="x86"
version="5.1.0.0"
type="win32"/>
<description>Windows Shell</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

Отже, коли у нас є ці два файли нам необхідно використовувати компілятор
ресурсів Delphi щоб скомпілювати. RC файл. У результаті чого у нас вийде
файл WindowsXP.RES який ми можемо підключити в наш додаток. Для компіляції
ресурсу введіть у командному рядку:

C:project1> brcc32 windowsxp.rx

Звичайно, я думаю що ви вставили в змінну оточення PATH директорію BIN
Delphi.


Після компіляції ви побачите Файл WindowsXP.RES в тойже директорії. Останній
крок для того, щоб ваше додаток стало WindowsXP-сумісним, це підключення
ресурсного файлу в вашу програму. Найпростіший спосіб зробити це додати
нижченаведену директиву в файл проекту або головну форму:

{$R WindowsXP.res}

Швидше за все вам доведеться помістити цю строчку відразу за директивою {$ R
*. Dfm} яка вже є у вашому додатку, відразу за пріедложеніем
implementation. Як тільки ви підключили WindowsXP.RES у ваше застосування
відкомпілюйте ваш додаток і запустіть його. Менеджер тем Windows призведе
ваш додаток до виду інших програм написаних для Windows XP.


Попередження


Microsoft попереджає всіх розробників що вони прибрали велику кількість
коду з бібліотеки comctl32.dll, і що необхідно ретельно перевіряти всі
сторони роботи компонентів перед тим як поширювати нову версію. На мою
досвіду можу сказати що можуть бути проблеми сумісності з Delphi. З іншого
боку я знайшов лише одну проблему – з компонентом TListView. Якщо ви
використовуєте TListView в режимі показу (View Style) vsReport, у вас виникнуть
проблеми з використанням властивості TColumns. Під час запуску при спробу
використання заголовків колонок із зазначенням виду показу у вас виникне помилка
ядра (Kernel Error).




Виправлення проблеми з TListView (спасибі Євгену Іванову)


Став шукати як виправити це упущення, так як і Delphi 6 з Update 1 не
допомагає впоратися з цією проблемою. Рішення полягає в наступному:


  1. Відкрити "ComCtrls.pas" і знайти "TCustomListView.UpdateColumn"
  2. Знайдемо наступний рядок.
     if FImageIndex <> -1 then
fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES;


  1. Замінюємо його на:
     if FImageIndex <> -1 then
fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES
else
mask := mask and not (LVCF_IMAGE);


  1. Зберігаємо Comctrls.pas. Тепер TListView не викликає помилку в режимі
    vsReport під Windows XP.

Автор поправки Matteo Riso.

Виправлення проблеми з TPageControl


Вирішення проблеми з установкою кольору фону clBtnFace для TTabSheet.
Як ви
знаєте TPageControl є контейнером TTabSheet: TPageControl нормально
сприймається Windows XP маніфестом, але це залишається правильним поки ви не
додасте TTabSheet …


Рішення полягає в наступному:


  1. Відкрийте модуль "ComCtrls.pas" і знайдіть рядок
    “TTabSheet.UpdateTabShowing”
  2. Ви побачите наступний текст:
procedure TTabSheet.UpdateTabShowing;
begin
SetTabShowing((FPageControl <> nil) and FTabVisible);
end;


  1. Додайте наступний рядок в цю процедуру:
SetWindowLong(handle,GWL_EXSTYLE,WS_EX_TRANSPARENT);


  1. Якщо у вашому TPageControl створено більше одного TTabSheet, можливо
    при запуску вашого додатка ви побачите всі компоненти відмальовані на першому
    аркуші (TTabSheet). Не треба впадати в паніку … Знайдіть метод
    "TPageControl.Loaded" і змініть його щоб він був схожий на наступний код:
procedure TPageControl.Loaded;
var
I: integer;
begin
inherited Loaded;
UpdateTabHighlights;
for I:=self.PageCount-1 downto 0 do
self.ActivePage:=self.Pages[I];
end;

Доданий код змушує TPageControl пройтися по всіх сторінках перед
показом. Це звісно трохи некрасиво, але працює … Якщо у вас є інші
методи вирішення цієї проблеми повідомте мені.
Автор поправки Matteo Riso.


Виправлення проблеми з TTrackBar


TTrackBar – вибачте, а яка поточна позиція?


Підказка, що показує поточне значення TTrackBar при переміщенні повзунка
зручна, тобто вам не буде необхідно додавати TLabel для цього.


  1. Відкрийте "ComCtrls.pas" і знайдіть "TTrackBar.CreateParams".
  2. Ви побачите наступний код:
procedure TTrackBar.CreateParams(var Params: TCreateParams);
const
OrientationStyle: array [TTrackbarOrientation] of DWORD = (TBS_HORZ, TBS_VERT);
TickStyles: array [TTickStyle] of DWORD = (TBS_NOTICKS, TBS_AUTOTICKS, 0);
ATickMarks: array [TTickMark] of DWORD = (TBS_BOTTOM, TBS_TOP, TBS_BOTH);
begin
[…]
with Params do
begin
Style := Style or OrientationStyle[FOrientation] or
TickStyles [FTickStyle] or ATickMarks [FTickMarks] or TBS_FIXEDLENGTH or
TBS_ENABLESELRANGE;
[…]
end;
end;


  1. Додайте умову "or TBS_TOOLTIPS" в лінію "Style: =". У кінцевому
    підсумку повинно вийти:
Style := Style or OrientationStyle[FOrientation] or
TickStyles [FTickStyle] or ATickMarks [FTickMarks] or TBS_FIXEDLENGTH or
TBS_ENABLESELRANGE or TBS_TOOLTIPS;


  1. Збережіть ComCtrls.pas і насолоджуйтеся підказкою.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*