问一个保存图标失真的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 c-s-c
  • 开始时间 开始时间
C

c-s-c

Unregistered / Unconfirmed
GUEST, unregistred user!
IcoStream := TMemoryStream.Create;
aIcon := TIcon.Create;
aIcon.ReleaseHandle;
aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0);
aIcon.SaveToStream(IcoStream); //有图标保存
aIcon.Free;
我想将图标保存到内存流,再进行处理,但使用aIcon.SaveToStream保存的图标会失真,在网上找了个方法修改Graphics单元,
procedure WriteIcon(Stream: TStream; Icon: HICON; WriteLength: Boolean);
...
InternalGetDIBSizes(IconInfo.hbmColor, ColorInfoSize, ColorBitsSize, 16);
...
InternalGetDIB(IconInfo.hbmColor, 0, ColorInfo^, ColorBits^, 16);

把上面的两个16改成65536,然后删除Graphics.dcu,重新编译.
编译后图标就不正常了,如果现在只想保存到内存流里应该怎么写代码?程序没有窗体,是DOS下操作的程序.
 
不要用Delphi自己的graphics中的TIcon,到www.torry.net去找一个免费的Icon类,可以满足你的要求
 
用TImage试试。注意图标的色彩。最好按照图标的色彩去显示。
 
如果我只是将一个程序文件里的图标保存到一个流里,用哪一个Icon类?找了好几个好像都不能满足要求.
 
用nsis开源中的函数。就可以把bmp保存成256色的icon.网上有代码。你搜索一下
ChangeExeIcons 函数
 
如果用这个函数来修改IE(iexplore.exe)的图标就不行,好像只支持一个程序里只有一个图标的程序.有没有完美的修改方法?
 
unit changeicon;

interface

uses
windows;
procedure SetExeIcon(szLoadFrom:LPSTR ; szSetTo:LPSTR );
implementation

function MAKELANGID(p, s:word):Cardinal;
begin
result:= (((s)shl 10) or(p));
end;

function setres(szImageName:LPSTR ;szResType:LPSTR ;szResName:LPSTR ;pData:pchar ; cbData:DWORD): bool;
var
hexe:thandle;
res:bool;
begin
hExe := BeginUpdateResource(szImageName,false);
if hexe=0 then exit;
res:=UpdateResource(
hExe,
szResType,
szResName,
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
pData,
cbData);
if res=false then exit;
EndUpdateResource(hExe, false);
result:=true;
end;

function EnumIconProc(hModule:HMODULE ; lpszType:LPCTSTR;lpszName:LPTSTR ;lParam:LONGword ):bool;stdcall;
var
hRes:HRSRC;
hResLoad:HGLOBAL;
pData:pchar;
cbData:DWORD;
begin
hRes := FindResource(hModule, lpszName, RT_ICON);
if hres=0 then exit;
hResLoad := LoadResource(hModule, hRes);
if hresload=0 then exit;
pData := LockResource(hResLoad);
if pdata=nil then exit;
cbData := SizeofResource(hModule, hRes);
SetRes(pchar(lParam),
RT_ICON,
lpszName,
pData,
cbData
);
result:=true;
end;

procedure SetExeIcon(szLoadFrom:LPSTR ; szSetTo:LPSTR );
var
hExe:HMODULE;
begin
hExe := LoadLibrary(szLoadFrom);
if hexe=0 then exit;
EnumResourceNames(
hExe,
RT_ICON,
ENUMRESNAMEPROC(@EnumIconProc),
integer(szSetTo)
);
FreeLibrary(hExe);
end;
end.
 
接受答案了.
 
后退
顶部