Hi
Niemand zwingt Dich, ein Windows-Manifest zu benutzen.
Das kann man auf der allerersten Seite der Projekt-Einstellungen ausschalten.
Das hat außerdem den Vorteil, dass nieman mehr Deine schöne App mit hässlichen Themes verunstalten kann.
Winni
Hi
Naja hat halt funktioniert, aber wenn du es schon so formulierst dann gehe ich mal davon aus ich sollte es lieber nicht so machen. Grund ist wohl das die Images bei jedem Neuzeichnen erzeugt und freigegeben werden was wohl auf die Leistung geht? Jedenfalls habe ich die Hilfsimages rausgeschmissen und dafür Bitmaps genommen. Ich hoffe das dies besser ist.Und bei TMultiButton.DrawTheButton und noch bei ein paar anderen Methoden verwendest du ein Hilfs-TImage. Muss das sein, in der Draw-Methode so ein schweres Control zu verwenden?
Also da hab ich jetzt ziemlich viel herum probiert und konnte keinen Unterschied zu einer normalen ImageList feststellen. Meine Beobachtungen waren folgende:TImageIndexPropertyEditor.ListDrawValue zeichnet die Bilder mit absoluten Koordinaten und mit der auflösungsunabhängigen Draw-Methode der ImageList. Ich könnte mir vorstellen, dass die Bilder dann im Objekt-Inspektor in der IDE nicht richtig skalieren.
Ich habe mir jetzt mal den TMultiButton auf Win10 (96ppi) und Win7 (144ppi) installiert und sehe genau das Problem, das ich erwartet habe (vielleicht nicht gut genug beschrieben): Das Bitmap ist in der Combobox des Objektinspektors in beiden Fällen gleich groß, entsprechend seiner 96ppi-Größe, es wird nicht skaliert.
Ich glaube, das geht relativ einfach:
Naja, das ist unschön, aber eher nebensächlich. Wichtiger ist, dass man die Bilder in jeden Button neu eintragen muss.
Leider fehlt mir an der Stelle noch irgend ein Baustein den ich nicht finden kann. Bei mir wird im OI unter ImageIndex nur -1 angezeigt obwohl in der ImageList die auf der Form liegt und bei Images ausgewählt ist eine Png geladen ist. Gebe ich im OI bei ImageIndex einfach mal eine 0 ein wird die Png gezeichnet.ImageIndex solltest du aber als TImageIndex deklarieren (statt als Integer), denn dann wird automatisch der vorhandene ImageList-PropertyEditor verwendet.
Code: Alles auswählen
unit TestImage;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ImgList,
ExtCtrls;
type
{ TTestImage }
TTestImage = class(TCustomControl)
private
FImageIndex: TImageIndex;
FImageList: TImageList;
procedure SetImageIndex(AValue: TImageIndex);
procedure SetImageList(AValue: TImageList);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
published
property ImageIndex : TImageIndex read FImageIndex write SetImageIndex default -1;
property Images : TImageList read FImageList write SetImageList;
end;
procedure Register;
implementation
procedure Register;
begin
{$I testimage_icon.lrs}
RegisterComponents('Standard',[TTestImage]);
end;
{ TTestImage }
procedure TTestImage.SetImageIndex(AValue: TImageIndex);
begin
if FImageIndex=AValue then Exit;
FImageIndex:=AValue;
end;
procedure TTestImage.SetImageList(AValue: TImageList);
begin
if FImageList=AValue then Exit;
FImageList:=AValue;
end;
constructor TTestImage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TTestImage.Destroy;
begin
inherited Destroy;
end;
procedure TTestImage.Paint;
var aImage : TImage;
begin
inherited Paint;
canvas.Brush.Color:=clWhite;
canvas.FillRect(0,0,width,height);
aImage := TImage.Create(nil);
Images.DrawForControl(canvas,2,2,FImageIndex,16,aImage,true);
aImage.Free;
end;
end.