GetThemeStream用法 [英] GetThemeStream usage

查看:557
本文介绍了GetThemeStream用法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很困惑与 GetThemeStream 函数

HRESULT GetThemeStream(
  _In_  HTHEME    hTheme,
  _In_  int       iPartId,
  _In_  int       iStateId,
  _In_  int       iPropId,
  _Out_ VOID      **ppvStream,
  _Out_ DWORD     *pcbStream,
  _In_  HINSTANCE hInst
);

如何使用此功能?哪个参数应该传递给 ppvStream

How to use this function? Which parameter I should pass to the ppvStream?

更新:

我正在尝试使用delphi,从UxTheme声明:

I'm trying to use it with delp declaration from UxTheme:

function GetThemeStream(hTheme: HTHEME; iPartId: Integer; iStateId: Integer;
  iPropId: Integer; var ppvStream: Pointer; var pcbStream: DWORD;
  hInst: HINST): HResult; stdcall;

var
  h: HTHEME;
  Res: HResult;
  PBuf, PPBuf: Pointer;
  BufSize: Cardinal;


h := OpenThemeData(Handle, 'DWMWINDOW');
if h = 0 then Exit;
PBuf := nil;
PPBuf := @PBuf;
Res := GetThemeStream(h, WP_FRAMELEFT, CBS_HOT, TMT_DISKSTREAM, PPBuf, BufSize, hInstance);
if Res <> S_OK then Exit;

这里我有BufSize = 75005,Res = S_OK,但在PBuf(nil)可能我错误的发送参数?

Here I'm have BufSize = 75005, Res = S_OK, but nothing in PBuf (nil), possible I'm incorrect send parameter?

推荐答案

正确使用此功能,感谢 Andreas Verhoeven ,程序的作者 Vista Style Builder

Correct usage of this function, thanks to Andreas Verhoeven, author of the program Vista Style Builder:

var
  hTh: HTHEME;
  hLib: HMODULE;
  DllName: string;
  Png: TPngImage;
  MS: TMemoryStream;
  BufSize: Cardinal;
  PBuf: Pointer;

hTh := OpenThemeData(...);
// DllName is path to the theme file
hLib := LoadLibraryEx(PChar(DllName), 0, LOAD_LIBRARY_AS_DATAFILE);
// Read Theme Png stream
GetThemeStream(hTh, 0, 0, TMT_DISKSTREAM, PBuf, BufSize, hLib);
// Copy data to memory stream
MS := TMemoryStream.Create;
MS.WriteBuffer(PByteArray(PBuf)^[0], BufSize);
MS.Position := 0;
// Copy memory stream to Png
Png := TPngImage.Create;
Png.LoadFromStream(MS);

更新附加示例:

var
  ThemeRectLeft,
  ThemeRectLeftInactive,
  ThemeRectMiddle,
  ThemeRectMiddleInactive,
  ThemeRectCloseRight,
  ThemeRectCloseRightInactive,
  ThemeRectCloseSingle,
  ThemeRectCloseSingleInactive,
  ThemeRectMinIco,
  ThemeRectMaxIco,
  ThemeRectRestoreIco,
  ThemeRectHelpIco,
  ThemeRectCloseIco: TRect;

var
  THEME_MIDDLE_IMAGES         : Integer =  3;
  THEME_MIDDLE_IMAGES2        : Integer =  4; // Inactive Window
  THEME_LEFT_IMAGES           : Integer =  5;
  THEME_LEFT_IMAGES2          : Integer =  6; // Inactive Window
  THEME_CLOSE_RIGHT_IMAGES    : Integer =  7;
  THEME_CLOSE_RIGHT_IMAGES2   : Integer =  8; // Inactive Window
  THEME_CLOSE_SINGLE_IMAGES   : Integer =  9;
  THEME_CLOSE_SINGLE_IMAGES2  : Integer = 10; // Inactive Window
  THEME_CLOSE_HOT_FRAME       : Integer = 11; // Win7, Vista
  THEME_HOT_FRAME             : Integer = 16; // Win7, Vista
  THEME_CLOSE_ICONS           : Integer = 12;
  THEME_HELP_ICONS            : Integer = 16; // Win7, Vista: 17
  THEME_MAX_ICONS             : Integer = 20; // Win7, Vista: 21
  THEME_MIN_ICONS             : Integer = 24; // Win7, Vista: 25
  THEME_RESTORE_ICONS         : Integer = 28; // Win7, Vista: 29
  THEME_CLOSE_SMALL_IMAGES    : Integer = 37; // Win7, Vista: 45
  THEME_CLOSE_SMALL_IMAGES2   : Integer = 38; // Win7, Vista: 46  Inactive Window
  THEME_CLOSE_SMALL_HOT_FRAME : Integer = 47; // Win7, Vista
  THEME_CLOSE_SMALL_ICONS     : Integer = 39; // Win7, Vista: 48

function LoadThemePng(var APng: TPngImage; const APathToSave: string): Boolean;
const
  ThemeRegPath = 'SOFTWARE\Microsoft\Windows\CurrentVersion\ThemeManager';
var
  hTh: HTHEME;
  hLib: HMODULE;
  DllName, Path: string;
  MS: TMemoryStream;
  BufSize: Cardinal;
  PBuf: Pointer;
  I: Integer;
  Rt: TRect;
  imgPng: TPngImage;
begin
  Result := False;
  hTh := OpenThemeData(0, 'DWMWINDOW');
  if hTh <> 0 then
  try
    // Get Library path
    SetLength(DllName, 1024);
    SHRegGetPath(HKEY_CURRENT_USER, PChar(ThemeRegPath), 'DllName', PChar(DllName), 0);
    // Open Library
    hLib := LoadLibraryEx(PChar(DllName), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hLib > 0 then
    try
      // Read Theme Png stream
      if GetThemeStream(hTh, 0, 0, TMT_DISKSTREAM, PBuf, BufSize, hLib) = S_OK then begin
        MS := TMemoryStream.Create;
        try
          MS.WriteBuffer(PByteArray(PBuf)^[0], BufSize);
          MS.Position := 0;
          APng.LoadFromStream(MS);
          Result := True;
        finally
          MS.Free;
        end;
      end;
    finally
      FreeLibrary(hLib);
    end;
    GetThemeRect(hTh, THEME_LEFT_IMAGES, 0, TMT_ATLASRECT, ThemeRectLeft);
    GetThemeRect(hTh, THEME_LEFT_IMAGES2, 0, TMT_ATLASRECT, ThemeRectLeftInactive);
    GetThemeRect(hTh, THEME_MIDDLE_IMAGES, 0, TMT_ATLASRECT, ThemeRectMiddle);
    GetThemeRect(hTh, THEME_MIDDLE_IMAGES2, 0, TMT_ATLASRECT, ThemeRectMiddleInactive);
    GetThemeRect(hTh, THEME_CLOSE_RIGHT_IMAGES,  0, TMT_ATLASRECT, ThemeRectCloseRight);
    GetThemeRect(hTh, THEME_CLOSE_RIGHT_IMAGES2,  0, TMT_ATLASRECT, ThemeRectCloseRightInactive);
    GetThemeRect(hTh, THEME_CLOSE_SINGLE_IMAGES,  0, TMT_ATLASRECT, ThemeRectCloseSingle);
    GetThemeRect(hTh, THEME_CLOSE_SINGLE_IMAGES2,  0, TMT_ATLASRECT, ThemeRectCloseSingleInactive);

    if (Win32MajorVersion = 6) and (Win32MinorVersion in [0, 1]) then begin
      GetThemeRect(hTh, THEME_MIN_ICONS + 1,     0, TMT_ATLASRECT, ThemeRectMinIco);
      GetThemeRect(hTh, THEME_MAX_ICONS + 1,     0, TMT_ATLASRECT, ThemeRectMaxIco);
      GetThemeRect(hTh, THEME_RESTORE_ICONS + 1, 0, TMT_ATLASRECT, ThemeRectRestoreIco);
      GetThemeRect(hTh, THEME_HELP_ICONS + 1,    0, TMT_ATLASRECT, ThemeRectHelpIco);
    end
    else begin
      GetThemeRect(hTh, THEME_MIN_ICONS,     0, TMT_ATLASRECT, ThemeRectMinIco);
      GetThemeRect(hTh, THEME_MAX_ICONS,     0, TMT_ATLASRECT, ThemeRectMaxIco);
      GetThemeRect(hTh, THEME_RESTORE_ICONS, 0, TMT_ATLASRECT, ThemeRectRestoreIco);
      GetThemeRect(hTh, THEME_HELP_ICONS,    0, TMT_ATLASRECT, ThemeRectHelpIco);
    end;

    GetThemeRect(hTh, THEME_CLOSE_ICONS,   0, TMT_ATLASRECT, ThemeRectCloseIco);

    if APathToSave <> '' then begin
      Path := IncludeTrailingPathDelimiter(APathToSave);
      APng.SaveToFile(Path + 'Theme_Full.png');
      for I := 1 to 99 do begin
        imgPng := TPngImage.Create;
        try
          if GetThemeRect(hTh, I, 0, TMT_ATLASRECT, Rt) = S_OK then begin
            CopyPng(APng, imgPng, Rt);
            imgPng.SaveToFile(Path + 'Theme_Img_' + IntToStr(I) + '.png');
          end;
        finally
          imgPng.Free;
        end;
      end;
    end;
  finally
    CloseThemeData(hTh);
  end;
end;

这篇关于GetThemeStream用法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆