Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Control neu zeichnen? (https://www.delphipraxis.net/45315-control-neu-zeichnen.html)

alcaeus 4. Mai 2005 01:21


Control neu zeichnen?
 
Hallo allerseits,

nachdem ich es endlich geschafft habe, die kleinen Pfeilchen in die ListView zu bekommen, stehe ich vor einem kleineren Problem: Nachdem die Groesse einer Column veraendert wurde, verschwindet das Bildchen, und ich stehe vor dem Problem, dass ich es neu zeichnen muss (wer haette das gedacht :zwinker:). Ich habe versucht es im OnCustomDraw, bei WMPaint oder auch bei PaintWindow neu zu zeichnen, aber nein, jedesmal nachdem ich die Groesse der Column veraendert habe, war das Icon wieder weg :roll:
Kann mir jemand sagen, welche Message ich abfangen muss, um das Bitmap wieder auf die Column zeichnen zu koennen?

Thanx and Greetz
alcaeus

bernau 4. Mai 2005 08:03

Re: Control neu zeichnen?
 
Zitat:

nachdem ich es endlich geschafft habe, die kleinen Pfeilchen in die ListView zu bekommen
Wo und wie hast du es denn geschafft. Wenn du mir sagst, wo du es eingebaut hast, kann ich dir evtl. sagen wo der Code hinkommt.

alcaeus 4. Mai 2005 08:07

Re: Control neu zeichnen?
 
Im Moment zeichne ich die Pfeilchen im ColumnClick mit diesem Code:
Delphi-Quellcode:
procedure TSortListView.DrawSortImage;
var
   Buf: array[0..MAX_PATH-1] of Char;
   HDItem: THDItem;
begin
   if not FShowSortImages then
      exit;
   if FHeader = 0 then
      FHeader := ListView_GetHeader(Self.Handle);
   HDItem.Mask := HDI_FORMAT or HDI_IMAGE or HDI_ORDER or HDI_TEXT or HDI_WIDTH;

   HDItem.pszText := Buf;
   HDItem.cchTextMax := SizeOf(Buf);

   Header_GetItem(FHeader, FLastSorted, HDItem);

   HDItem.Mask := HDItem.Mask or HDI_BITMAP;
   HDItem.fmt := HDItem.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT;

   if FSortDir = sdAscending then
      HDItem.hbm := FAscImage.Handle
   else
      HDItem.hbm := FDescImage.Handle;

   Header_SetItem(FHeader, FLastSorted, HDItem);
end;
Die Pfeile bleiben waehrend des Resizen der Columns schoen brav da wo sie hingehoeren, und werden auch mitgeschoben, aber sobald ich mit dem Resizen aufhoere, wird anscheinend der Header neu gezeichnet und das Pfeilchen ist weg.

Greetz
alcaeus

bernau 4. Mai 2005 08:16

Re: Control neu zeichnen?
 
Jetzt müsste ich nur noch wissen, wo du die Procedure "DrawSortImage" aufrufst. ;-)

Edit: Ich gehe davon aus, das du TSortListView von TListView abgeleitet hast. Oder?

alcaeus 4. Mai 2005 08:19

Re: Control neu zeichnen?
 
Zitat:

Zitat von alcaeus
Im Moment zeichne ich die Pfeilchen im ColumnClick mit diesem Code:

Mehr kann ich da nicht sagen. Wenn es dir hilft, gibts noch den Source der dir sagt wie ich ueberhaupt in die ColumnClick-Routine komme in der gezeichnet wird:
Delphi-Quellcode:
inherited Create(AOwner);
inherited OnColumnClick := ColumnClick;
inherited OnCompare := Compare;
Aber wie gesagt...im ColumnClick (also beim Klick auf eine Spalte).
Und wenn du den Code auch noch willst, dann bitte:
Delphi-Quellcode:
procedure TSortListView.ColumnClick(Sender: TObject;
   Column: TListColumn);
begin
   ClearSortImage;
   if Assigned(OnColumnClick) then
      OnColumnClick(Sender, Column);
   FColumnToSort := Column.Index;

   if FColumnToSort = FLastSorted then
   begin
      FSortDir := TSortDir(1-Ord(FSortDir));
   end
   else
   begin
      FSortDir := sdAscending;
   end;
   FLastSorted := FColumnToSort;
   (Sender as TCustomListView).AlphaSort;
  DrawSortImage;
end;
Der ClearSortImage-Aufruf sorgt nur dafuer, dass das alte Bildchen geloescht wird.

Greetz
alcaeus

[edit]
Zitat:

Zitat von bernau
Ich gehe davon aus, das du TSortListView von TListView abgeleitet hast. Oder?

Jup, konnte mich nicht zwischen TListView und TCustomListView entscheiden :stupid:
[/edit]

marabu 4. Mai 2005 08:21

Re: Control neu zeichnen?
 
Hallo,

den Indikator für die Spaltensortierung setze ich stets über listColumn.ImageIndex - jetzt schäme ich mich fast ein wenig.

Grüße vom marabu

Schreibfehler: ImageIndex, nicht ItemIndex - war schon klar denke ich.

bernau 4. Mai 2005 08:27

Re: Control neu zeichnen?
 
Evtl hilft es, wenn die Procedure UpdateColumns überschreibst und dort DrawSortImage aufrufst.


Delphi-Quellcode:
Procedure UpdateColumns;override;


Procedure TSortListview.UpdateColumns;
begin
  inherited;
  DrawSortImage;
end;

(nicht getestet)

alcaeus 4. Mai 2005 08:29

Re: Control neu zeichnen?
 
Nope. override ging nicht, da die Methode in der Vorgaengerklasse als static deklariert ist, also habe ich reintroduce genommen. Doch da, kein Ergebnis. Danke trotzdem

Greetz
alcaeus

bernau 4. Mai 2005 08:49

Re: Control neu zeichnen?
 
Zitat:

Zitat von alcaeus
Nope. override ging nicht, da die Methode in der Vorgaengerklasse als static deklariert ist.

Ups. Habe ich übersehen daß die Methode statisch ist.


Normalerweise sollte Paint überschrieben werden. Geht aber nur bei Objecten, die von TCustomControl abgeleitet sind.

Evtl. Repaint überscheiben. Oder nachschauen, wie Paint in TCustomControl implementiert ist.

Mephistopheles 4. Mai 2005 11:51

Re: Control neu zeichnen?
 
Schonmal versucht den Header (also nur das Headercontrol, das gehört ja eigentlich nicht zum ListView) zu subclassen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz