Windows 10 закрыть, свернуть и развернуть кнопки
чтобы нарисовать тематическую кнопку, я использую этот код:
var
h: HTHEME;
begin
if UseThemes then begin
SetWindowTheme(Handle, 'explorer', nil);
h := OpenThemeData(Handle, 'WINDOW');
if h <> 0 then
try
DrawThemeBackground(h, Canvas.Handle, WP_CLOSEBUTTON, GetAeroState, ClientRect, nil);
finally
CloseThemeData(h);
end;
end
else
DrawFrameControl(Canvas.Handle, ClientRect, DFC_CAPTION, DFCS_CAPTIONCLOSE or GetClassicState)
end;
этот код работает нормально, но окрашенная кнопка выглядит как из темы Windows 7, даже в Windows 8 или 10. Это можно нарисовать кнопку закрытия с помощью темы Windows 10 или 8?
2 ответов
один из способов решить этот вопрос: ручной синтаксический анализ active *.msstyles по. Обычно это aero.msstyles по. Растровое изображение для различных элементов управления окна, хранящихся в разделе потока. Для Windows 7 ResId = 971, Windows 8: Id = 1060, Windows 10: Id = 1194. Но это ручная работа и это рисунки разные.
обновление:
Я нашел, что даже для одной версии Windows (тестировалось на 8) мы можем иметь разные значения идентификатора ресурса для это растровое изображение (png изображение), и теперь я могу предоставить код для получения идентификатора ресурса на любой Windows (протестирован на 7,8,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;
var
hLib: HMODULE;
ResId: Integer;
RS: TResourceStream;
Png: TPngImage;
begin
hLib := LoadLibraryEx(PChar(GetWindowsPath + '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);
...
end;
обновление 2:
найдено не взломан метод с помощью официального api:
var
h: HTHEME;
Rect: TRect;
PBuf, PPBuf: Pointer;
BufSize: Cardinal;
Buf: array[0..1024*1024] of Byte;
h := OpenThemeData(Handle, 'DWMWINDOW');
if h <> 0 then
try
GetThemeRect(h, WP_MINCAPTION, MNCS_ACTIVE, TMT_ATLASRECT, Rect);
PBuf := @Buf[0];
PPBuf := @PBuf;
GetThemeStream(h, WP_MINCAPTION, MNCS_ACTIVE, TMT_ATLASRECT, PBuf, BufSize, hInstance);
finally
CloseThemeData(h);
end;
Я могу получить Rect для свернутой кнопки, но не понимаю, как использовать GetThemeStream? Следует ли использовать PBuf или PPBuf?
работоспособное решение для получения растровых изображений из темы:
var
h: HTHEME;
Rect: TRect;
BufSize: Cardinal;
h := OpenThemeData(Handle, 'DWMWINDOW');
if h <> 0 then
try
GetThemeRect(h, WP_MINCAPTION, MNCS_ACTIVE, TMT_ATLASRECT, Rect);
...
GetThemeStream(...);
finally
CloseThemeData(h);
end;
и как использовать GetThemeStream, описанный здесь:использование GetThemeStream, большое спасибо Андреасу Верховену, автору программы Vista Style Builder