是否可以在运行时更改模态和非模态表单的标题栏中的表单图标?

时间:2012-02-08 13:19:26

标签: delphi delphi-2010

使用Delphi 2010.

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

示例:

程序ChangeFormIcon(AForm:TForm; AIcon:TBitmap;

欢迎所有其他建议

感谢名单

1 个答案:

答案 0 :(得分:4)

这样的事情应该做你想要的。我假设您正在使用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;