|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Замена кнопок системного меню
Здравствуйте.
Мне нужно на моей форме заменить все системные кнопки в заголовке окна своими. Т.е. сделав 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
|
||||
|
||||
WP_CLOSEBUTTON = 18;
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
Результат как я уже писал не тот, который предполагалось. Во скрин:
|
#4
|
|||
|
|||
Нашел в сети код, он выдает кусок темы, где есть нужные кнопки:
Код:
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
|
||||
|
||||
Вы достали скины кнопок, из этого рисунка установщик тем вытягивает на системные баттоны нужные фрагменты, копируйте куски по определённым координатам, а затем вешайте их на свои с соответствующей системной функцией - просто если вы выбрали стиль BorderIcons := [], они не прячутся при показе формы, кнопок этих не создаётся физически, и весь функционал для их двойников придётся делать исключительно "ручками"
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
||||
|
||||
А встроенные в дельфи механизмы скинов не подходят для решения задачи? Там и систем меню и всё всё всё модифицируется по нужному шаблону. Плюс эта хренотень платформонезависимая.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
|||
|
|||
Спасибо. Посмотрю встроенные скины
|