我有一个有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!
在我看来,由于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机制只会干扰.
| 归档时间: |
|
| 查看次数: |
2584 次 |
| 最近记录: |