Delphi 是否可以在运行时更改模式窗体和非模式窗体标题栏中的窗体图标?

Delphi 是否可以在运行时更改模式窗体和非模式窗体标题栏中的窗体图标?,delphi,delphi-2010,Delphi,Delphi 2010,使用Delphi2010 我正在寻找(可能)一个函数或过程,它可以传递一个TForm&a图像(TImage或TBitmap),它可以更改表单图标,或者覆盖当前图标,或者在特定位置写入新图标,必要时调整标题。必须同时使用模态和非模态形式 例如: 程序变更表(AForm:TForm;AIcon:TBitmap 欢迎所有其他建议 Thanx像这样的东西应该可以满足您的需要。我假设您正在使用32bpp位图,可能是alpha混合。如果您想使用基于遮罩的透明度,则需要重新编写代码以创建适当的遮罩位图 pro

使用Delphi2010

我正在寻找(可能)一个函数或过程,它可以传递一个TForm&a图像(TImage或TBitmap),它可以更改表单图标,或者覆盖当前图标,或者在特定位置写入新图标,必要时调整标题。必须同时使用模态和非模态形式

例如:

程序变更表(AForm:TForm;AIcon:TBitmap

欢迎所有其他建议


Thanx

像这样的东西应该可以满足您的需要。我假设您正在使用32bpp位图,可能是alpha混合。如果您想使用基于遮罩的透明度,则需要重新编写代码以创建适当的遮罩位图

procedure CopyBitmapToIcon(Bitmap: TBitmap; Icon: TIcon);
var
  MonoBitmap: HBITMAP;
  IconInfo: TIconInfo;
  IconHandle: HICON;
begin
  MonoBitmap := CreateBitmap(Bitmap.Width, Bitmap.Height, 1, 1, 0);
  Try
    FillChar(IconInfo, SizeOf(IconInfo), 0);
    IconInfo.fIcon := True;
    IconInfo.hbmMask := MonoBitmap;
    IconInfo.hbmColor := Bitmap.Handle;
    IconHandle := CreateIconIndirect(IconInfo);
    if IconHandle=0 then begin
      RaiseLastOSError;
    end;
    Icon.Handle := IconHandle;
  Finally
    DeleteObject(MonoBitmap);
  End;
end;

procedure TMyForm.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
  Icon: TIcon;
begin
  Icon := Self.Icon;
  Bitmap := TBitmap.Create;
  try
    Bitmap.PixelFormat := pf32bit;
    Bitmap.SetSize(Icon.Width, Icon.Height);
    Bitmap.Canvas.Brush.Style := bsSolid;
    Bitmap.Canvas.Brush.Color := clRed;
    Bitmap.Canvas.FillRect(Rect(0, 0, Icon.Width, Icon.Height));
    CopyBitmapToIcon(Bitmap, Icon);
  finally
    Bitmap.Free;
  end;
end;

类似这样的操作应该可以满足您的需要。我假设您使用的是32bpp位图,可能是alpha混合。如果您希望使用基于遮罩的透明度,则需要重新编写代码以创建适当的遮罩位图

procedure CopyBitmapToIcon(Bitmap: TBitmap; Icon: TIcon);
var
  MonoBitmap: HBITMAP;
  IconInfo: TIconInfo;
  IconHandle: HICON;
begin
  MonoBitmap := CreateBitmap(Bitmap.Width, Bitmap.Height, 1, 1, 0);
  Try
    FillChar(IconInfo, SizeOf(IconInfo), 0);
    IconInfo.fIcon := True;
    IconInfo.hbmMask := MonoBitmap;
    IconInfo.hbmColor := Bitmap.Handle;
    IconHandle := CreateIconIndirect(IconInfo);
    if IconHandle=0 then begin
      RaiseLastOSError;
    end;
    Icon.Handle := IconHandle;
  Finally
    DeleteObject(MonoBitmap);
  End;
end;

procedure TMyForm.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
  Icon: TIcon;
begin
  Icon := Self.Icon;
  Bitmap := TBitmap.Create;
  try
    Bitmap.PixelFormat := pf32bit;
    Bitmap.SetSize(Icon.Width, Icon.Height);
    Bitmap.Canvas.Brush.Style := bsSolid;
    Bitmap.Canvas.Brush.Color := clRed;
    Bitmap.Canvas.FillRect(Rect(0, 0, Icon.Width, Icon.Height));
    CopyBitmapToIcon(Bitmap, Icon);
  finally
    Bitmap.Free;
  end;
end;