Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.09.2016, 18:00
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 32
Версия Delphi: RAD XE10
Репутация: 10
По умолчанию Замена кнопок системного меню

Здравствуйте.
Мне нужно на моей форме заменить все системные кнопки в заголовке окна своими. Т.е. сделав BorderIcons := [], мне нужно добавить свои.
До добавления пока не дошел. В версиях Windows до 10 все нормально, а вот в Windows 10 не получается получить данные кнопок из текущей темы (тема стандартная).

Код:
uses Vcl.Themes;
..
procedure TForm18.Button1Click(Sender: TObject);
var
  Details: TThemedElementDetails;
begin
  Details := StyleServices.GetElementDetails(twSmallCloseButtonNormal);
    { Special state for buttons drawn on a not active caption }
    if (GetForegroundWindow <> Handle)
      and (Details.State = 1) then
      Details.State := 5;
    StyleServices.DrawElement(Image1.Canvas.Handle, Details, Rect(0, 0, 32, 32))
end;

Пробую получить изображение кнопки Close. Получаю не совсем то, что надо. Видно на рисунке.



Переписал на API. Результат тот же.

Код:
uses Winapi.UxTheme;
...
procedure TForm18.Button1Click(Sender: TObject);
var
  Details: TThemedElementDetails;
  hTheme: THandle;
  RRect: TRect;
  ClipRect: PRect;
begin
  hTheme := OpenThemeData(Handle, 'Window');
  Details.State := 1;
  Details.Part := 19;
  RRect := Rect(0, 0, 32, 32);
  ClipRect := @RRect;
  Image1.Canvas.FillRect(RRect);
  DrawThemeBackground(hTheme, Image1.Canvas.Handle, Details.Part,
      Details.State, RRect, ClipRect);
  CloseThemeData (hTheme);
end;

Остальные кнопки тоже какие-то из старый версий Windows. Вопрос, как получить правильные изображения кнопок и их расположение?

Последний раз редактировалось xteam777, 04.09.2016 в 18:32.
Ответить с цитированием
  #2  
Старый 05.09.2016, 13:57
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

WP_CLOSEBUTTON = 18;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 05.09.2016, 17:21
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 32
Версия Delphi: RAD XE10
Репутация: 10
По умолчанию

Результат как я уже писал не тот, который предполагалось. Во скрин:
Ответить с цитированием
  #4  
Старый 05.09.2016, 18:42
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 32
Версия Delphi: RAD XE10
Репутация: 10
По умолчанию

Нашел в сети код, он выдает кусок темы, где есть нужные кнопки:
Код:
function EnumStreamProc(hModule: HMODULE; AType, AName: PChar; Params: LPARAM): BOOL; stdcall;
var
  Id: NativeInt;
begin
  PNativeInt(Params)^ := Integer(AName);
  Result := False;
end;

function GetStyleResourceId(AModule: HMODULE): Integer;
begin
  Result := 0;
  EnumResourceNames(AMODULE, 'STREAM', @EnumStreamProc, LPARAM(@Result));
end;


procedure TForm18.Button2Click(Sender: TObject);
var
  hLib: HMODULE;
  ResId: Integer;
  RS: TResourceStream;
  Png: TPngImage;
begin
  hLib := LoadLibraryEx(PChar('C:\Windows\Resources\Themes\Aero\aero.msstyles'),
                        0, LOAD_LIBRARY_AS_DATAFILE);
  ResId := GetStyleResourceId(hLib);
  RS := TResourceStream.CreateFromID(hLib, ResId, 'STREAM');
  Png := TPngImage.Create;
  Png.LoadFromStream(RS);
  Image1.Picture.Assign(Png);
  Image1.Picture.SaveToFile('Win10Theme.bmp');
end;



Значит, все таки нужные изображения есть. Вопрос как и оттуда достать

Последний раз редактировалось xteam777, 05.09.2016 в 19:14.
Ответить с цитированием
  #5  
Старый 06.09.2016, 10:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,026
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вы достали скины кнопок, из этого рисунка установщик тем вытягивает на системные баттоны нужные фрагменты, копируйте куски по определённым координатам, а затем вешайте их на свои с соответствующей системной функцией - просто если вы выбрали стиль BorderIcons := [], они не прячутся при показе формы, кнопок этих не создаётся физически, и весь функционал для их двойников придётся делать исключительно "ручками"
Ответить с цитированием
  #6  
Старый 06.09.2016, 16:01
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,503
Версия Delphi: XE10
Репутация: выкл
По умолчанию

А встроенные в дельфи механизмы скинов не подходят для решения задачи? Там и систем меню и всё всё всё модифицируется по нужному шаблону. Плюс эта хренотень платформонезависимая.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 12.09.2016, 07:41
xteam777 xteam777 вне форума
Прохожий
 
Регистрация: 14.03.2016
Сообщения: 32
Версия Delphi: RAD XE10
Репутация: 10
По умолчанию

Спасибо. Посмотрю встроенные скины
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2020

ВКонтакте   Facebook   Twitter