TImageList und Resolutions

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

TImageList und Resolutions

Beitrag von Sieben »

Ich habe jetzt mal versucht, für meine Sortierpfeile unterschiedliche Auflösungen bereitzustellen. Eingelesen werden die aus einer .res-Datei, und nach Lektüre der Doku ("InsertMask: Inserts a transparent image into the image resolutions at the specified position") meinte ich, es könnte so gehen:

Code: Alles auswählen

  Bmp := TBitmap.Create;
  try
    Bmp.LoadFromResourceName(hInstance, bmSortAsc);
    FSortIndicators := TImageList.CreateSize(Bmp.Width, Bmp.Height);
    FSortIndicators.RegisterResolutions([10, 12, 16]);
    Idx := FSortIndicators.AddMasked(Bmp, clFuchsia);
    Bmp.LoadFromResourceName(hInstance, bmSortAsc+'12');
    FSortIndicators.InsertMasked(Idx, Bmp, clFuchsia);
    Bmp.LoadFromResourceName(hInstance, bmSortAsc+'16');
    FSortIndicators.InsertMasked(Idx, Bmp, clFuchsia);
    Bmp.LoadFromResourceName(hInstance, bmSortDesc);
    Idx := FSortIndicators.AddMasked(Bmp, clFuchsia);
    Bmp.LoadFromResourceName(hInstance, bmSortDesc+'12');
    FSortIndicators.InsertMasked(Idx, Bmp, clFuchsia);
    Bmp.LoadFromResourceName(hInstance, bmSortDesc+'16');
    FSortIndicators.InsertMasked(Idx, Bmp, clFuchsia);
  finally
    Bmp.Free;
  end;
  FSortIndicators.BkColor := FixedColor; 
also dass an der angegebenen ImageIndex-Position neue Auflösungen eingefügt werden. Dem ist aber nicht so, Count ist beim zweiten Aufruf von 'Idx :=' bereits 3 und am Ende 6. Auch das nachträglich eingefügte RegisterResolutions() ändert daran nichts. Daraufhin habe ich mir angesehen, wie der ImageListenEditor das macht und kam dabei zu folgendem:

Code: Alles auswählen

  Bmp := TBitmap.Create;
  try
    Bmp.LoadFromResourceName(hInstance, bmSortAsc);
    FSortIndicators := TImageList.CreateSize(Bmp.Width, Bmp.Height);
    FSortIndicators.RegisterResolutions([10, 12, 16]);
    Idx := FSortIndicators.AddMasked(Bmp, clFuchsia);
    Bmp.LoadFromResourceName(hInstance, bmSortAsc+'12');
    FSortIndicators.Replace(Idx, Bmp, nil, False);
    Bmp.LoadFromResourceName(hInstance, bmSortAsc+'16');
    FSortIndicators.Replace(Idx, Bmp, nil, False);
    Bmp.LoadFromResourceName(hInstance, bmSortDesc);
    Idx := FSortIndicators.AddMasked(Bmp, clFuchsia);
    Bmp.LoadFromResourceName(hInstance, bmSortDesc+'12');
    FSortIndicators.Replace(Idx, Bmp, nil, False);
    Bmp.LoadFromResourceName(hInstance, bmSortDesc+'16');
    FSortIndicators.Replace(Idx, Bmp, nil, False);
  finally
    Bmp.Free;
  end;
  FSortIndicators.BkColor := FixedColor; 
also einem (wenig intuitiven) Replace(), um neue Auflösungen hinzuzufügen. Erste Tests scheinen jetzt tatsächlich auch das zu ergeben , was ich erwartet hatte. Blöderweise weiß ich nicht so recht, wie ich jetzt auch mal höhere Auflösungen testen kann, beim Zeichnen gehe ich jedenfalls so vor:

Code: Alles auswählen

  var ImgRes: TScaledImageListResolution;
    //...
      with FSortIndicators do
        ImgRes := ResolutionForPPI[Width, Font.PixelsPerInch, GetCanvasScaleFactor];
      //...
      ImgRes.Draw(Canvas, Pt.X, Pt.Y, Integer(not FSortAsc)); 
Kann ich jetzt davon ausgehen, dass auch die hinzugefügten Auflösungen entsprechend der Erstauflösung 'maskiert' sind, trotz nil als drittem Parameter? Oder sollte ich statt des obigen Codes lieber drei Bmp-Instanzen erzeugen und auf einmal per AddMultipleResolutions hinzufügen? Was gilt es sonst noch zu beachten?

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TImageList und Resolutions

Beitrag von Sieben »

Kann ich jetzt davon ausgehen, dass auch die hinzugefügten Auflösungen entsprechend der Erstauflösung 'maskiert' sind, trotz nil als drittem Parameter?
Nein. Der zweite Code mit Replace ist zwar grundsätzlich richtig, aber du Trottel hast offenbar übersehen, dass es auch ReplaceMasked gibt, das man natürlich auch verwenden sollte, wenn man schon mit AddMasked anfängt...

Antworten