Windows 7任务栏中的模糊Delphi表单图标

Kou*_*der 2 delphi delphi-xe2

在此输入图像描述我有一个有2个表格的申请表,每个表格和申请表都有单独的图标.在Form1BitBtn1.Click Form2上显示 - 非模式和Form1BitBtn2.Click Form1已关闭.在Form2BitBtn1.Click Form2已关闭,Form2BitBtn2.Click Form1已关闭.它工作正常.但问题是在Windows 7任务栏中,Form1图标是模糊的,另一个问题是当使用Form1BitBtn1显示Form2时.单击该应用程序仅显示Form1图标但不显示Form2图标.请帮我.

这是我的项目文件的下载链接是" http://hotfile.com/dl/140219264/04ce49c/Delphi_XE2_Form_Handler.7z.html "

我的代码如下:

unit KoushikHalder01;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls,
  Vcl.ComCtrls;
type
  TForm01 = class(TForm)
    BitBtn01: TBitBtn;
    BitBtn02: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure BitBtn01MouseEnter(Sender: TObject);
    procedure BitBtn02MouseEnter(Sender: TObject);
    procedure BitBtn01MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BitBtn02MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BitBtn01MouseLeave(Sender: TObject);
    procedure BitBtn02MouseLeave(Sender: TObject);
    procedure BitBtn02Click(Sender: TObject);
    procedure BitBtn01Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form01: TForm01;

implementation

{$R *.dfm}

uses KoushikHalder02;

procedure TForm01.BitBtn01Click(Sender: TObject);
begin
   Doublebuffered := True;
   Form02.Show;
   if Form01.Visible = true then Form01.BringToFront;
end;

procedure TForm01.BitBtn01MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   BitBtn01.Font.Color :=10379745;
end;

procedure TForm01.BitBtn01MouseEnter(Sender: TObject);
begin
   BitBtn01.Font.Color :=16711825;
end;

procedure TForm01.BitBtn01MouseLeave(Sender: TObject);
begin
   BitBtn01.Font.Color :=15756035;
end;

procedure TForm01.BitBtn02Click(Sender: TObject);
begin
  Form01.Close;
end;

procedure TForm01.BitBtn02MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   BitBtn02.Font.Color :=10379745;
end;

procedure TForm01.BitBtn02MouseEnter(Sender: TObject);
begin
   BitBtn02.Font.Color :=16711825;
end;

procedure TForm01.BitBtn02MouseLeave(Sender: TObject);
begin
   BitBtn02.Font.Color :=15756035;
end;

procedure TForm01.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Doublebuffered := True;
end;

procedure TForm01.FormCreate(Sender: TObject);
begin
   Doublebuffered := True;
end;

procedure TForm01.FormHide(Sender: TObject);
begin
   Doublebuffered := True;
end;

procedure TForm01.FormShow(Sender: TObject);
begin
   Doublebuffered := True;
end;

end.
Run Code Online (Sandbox Code Playgroud)

小智 7

我知道如何解决这个问题......而且很简单.不要为Form1.Icon提供图标.

提供您的图标信息

项目>选项>应用程序>应用程序图标设置>加载图标.

请务必为您的图标选择最佳分辨率.

运行应用程序和shazan!


Dav*_*nan 6

在我看来,由于VCL框架中的设计缺陷,这里发生了什么.底层的Windows框架不会为每个顶级窗口维护一个,而是两个图标.这些图标通过窗口类(请参阅参考资料WNDCLASSEX)或通过WM_SETICON消息与窗口相关联.

VCL框架始终调用WM_SETICON传递ICON_BIG,因此仅分配大图标.对于Windows 7,任务栏上使用大图标,窗口标题栏上使用小图标.在具有较小任务栏的早期版本的Windows上,任务栏上使用了小图标.对于100%字体缩放,大图标为32px,小图标为16px.对于大字体,所需的图标大小会更改.

现在,如果应用程序仅提供所需图标之一,则系统将在需要绘制尚未提供的图标大小时缩放所提供的图标.如果您只提供一个大图标,通常,生成的缩放小图标看起来很好.如果你只提供一个小图标,那么它就难以扩展,通常会发生的是小图标(显示在标题栏上)看起来很好,但是大图标是像素化的.

事实上,发生在你身上的不是这些问题.VCL代码意味着您始终在Windows中为大图标指定.但是,你显然提供了一个小图标,几乎可以肯定是16px.这与调用相同WM_SETICON,ICON_SMALL并且32px图标是像素化的.

最简单的解决方案是使用32px图标,Form.Icon或者Application.Icon,无论您在何处设置图标.这在大多数情况下都可以正常工作.

但是,如果您的应用程序运行时字体缩放处于活动状态,那么您将再次遇到像素化.通过字体缩放,可以增加两个图标大小.为了正确处理这个问题,您必须向底层Windows框架提供正确大小的图标.如果没有,则会出现像素化.您可以通过致电查找图标大小GetSystemMetrics.

SmallIconSize := GetSystemMetrics(SM_CXSMICON);
LargeIconSize := GetSystemMetrics(SM_CXICON);
Run Code Online (Sandbox Code Playgroud)

现在通常只需要提供一个大图标并依靠内置的缩放来生成小图标.如果你真的关心视觉效果,你当然应该使用专为这么小的尺寸准备的图标.缩小到16px的32px图标在视觉上不如熟练的视觉设计师生成的16px图标有效.要使VCL使用您提供的小图标需要额外的工作.特别是你需要发送WM_SETICONfor ICON_SMALL.在我的代码库中,我这样做,实际上完全避免使用TForm.Icon并调用WM_SETICON两个图标大小.为了获得正确执行此操作所需的细粒度控制,VCL机制只会干扰.