2011九月19
在win7上获取256*256的图标
ExtractIconEx和ExtractIcon只能提取32*32大小的图标,如何在win7下提取256*256大小的图标呢?
答案是:PrivateExtractIcons
但这个API在delphi中没有声明,可以静态声明:
{$IFDEF UNICODE}
function PrivateExtractIcons(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer; phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall ; external 'user32.dll' name 'PrivateExtractIconsW';
{$ELSE}
function PrivateExtractIcons(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer; phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall ; external 'user32.dll' name 'PrivateExtractIconsA';
{$ENDIF}
也可以动态加载:
/// <author>
/// Code by Siow http://vshui.com
///</author>
/// <summary>
/// 提取大于32*32的图标
/// </summary>
function ExtractIcons(exeFilename: string; icoSize: Integer; var hIcon: THandle; nIconIndex:
Integer = 0): Boolean;
const
{$ifdef UNICODE}
ExtractProcName='PrivateExtractIconsW';
{$else}
ExtractProcName='PrivateExtractIconsA';
{$endif}
type
TExtractFunc = function(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer;
phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall;
var
nIconId: DWORD;
PrivateExtractIcons: TExtractFunc;
hDll: THandle;
begin
result := False;
hDll := LoadLibrary('user32.dll');
if (hDll < 4) then exit;
try
PrivateExtractIcons := GetProcAddress(hDll, ExtractProcName);
if not Assigned(PrivateExtractIcons) then
exit;
if PrivateExtractIcons(PChar(exeFilename),
nIconIndex, icoSize, icoSize, @hIcon, @nIconId, 1, LR_SHARED) <> 0
then
result := true;
finally
FreeLibrary(hDll);
end;
end;
例子:
var
s: string;
hIco: THandle;
begin
s := 'C:\Program Files\Internet Explorer\iexplore.exe';
if ExtractIcons(s, 256, hIco, 0) then
try
DrawIconEx(Canvas.Handle, 0, 256, hIco, 256, 256, 0, 0, DI_NORMAL);
finally
DestroyIcon(hIco);
end;
OK,256*256大小的ICON完美地画出来了。
存疑:
256*256 128*128 48*48 32*32 16*16几个尺寸的图标都能很好地画出来,
唯有64*64大小的图标画出来有很明显的锯齿,感觉一点都不平滑,不知道为什么,
请知道的童鞋不吝赐教,感谢万分。
| anyShare分享到: | |
| |
文章作者:微水网
本文地址:http://vshui.com/archives/247
版权所有 © 转载时必须以链接形式注明作者和原始出处!
