Irgendwie zerhaut es mir die Skalieung wenn ich die EXE auf WIn7/64 mit 96DPI (100%) übersetze und dann auf einem Win10/64 192DPI (200%) ausführe.
Bei 100% (Win7) sieht es gut aus, das Icon hat die korrekte Größe. Jedoch bei 200% (Win10) wird das Icon 2x vergrößert, so dass es so aus sieht als ob es doppelt so groß ist.
Das zweite:
Wenn ich nun das gleiche Projekt unter Win10 (200%) öffne und einmalig eine kleine Änderung im Formular mache, dann hat Lazarus das erkannt dass mit 192DPI übersetzt werden soll. Dann werden die Icons im Treeview auch in der richtigen Größe gezeichnet. Jedoch sind die nun mit clFuchsia vermischt. Das liegt daran, dass das Bild ein clFuchsia als Background hat, das korrekt in TImageList als Transparent erkannt wird, aber bei 192 DPI erfolgt die Berechnung in der falschen Reihenfolge, also erst vergrößern, dann Transparenz raus rechnen. richtig wäre erst transparenz raus rechnen und dann vergrößern.
Kann das jemand nachvollziehen wie ich das meine?
Lazarus 2.0.12.
Der Quellcode:
Code: Alles auswählen
Procedure TForm1.FormShow(Sender: TObject);
Var n: TTreeNode;
Begin
AddImagesTV();
ScaleImageList(imgL, DesignTimePPI);
n := tvL.Items.Add(Nil, 'Node1');
n.ImageIndex := 0;
n.SelectedIndex := 0;
n := tvL.Items.Add(Nil, 'Node2');
n.ImageIndex := 1;
n.SelectedIndex := 1;
n := tvR.Items.Add(Nil, 'Node1');
n.ImageIndex := 0;
n.SelectedIndex := 0;
n := tvR.Items.Add(Nil, 'Node2');
n.ImageIndex := 1;
n.SelectedIndex := 1;
end;
procedure TForm1.AddImagesTV();
Var bm: TBitmap;
i, iW: Integer;
Begin // Kopiert Bilder für TTreeView
imgR.Clear;
imgR.Width := imgL.Width;
imgR.Height := imgL.Height;
iW := imgL.Width;
bm := TBitmap.Create;
For i := 0 To 1 Do
Begin
bm.Width := iW;
bm.Height := iW;
imgL.GetBitmap(i, bm);
imgR.AddMasked(bm, FPColorToTColor(bm.Canvas.Colors[0, imgL.Height - 1]));
End;
FreeAndNil(bm);
End;
Demo: Die Bilder sind alle im ZIP, auch das 16x16 Bild das in TImageList eingefügt wurde.