AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListView.OnDrawItem

Ein Thema von WojTec · begonnen am 15. Nov 2010 · letzter Beitrag vom 17. Nov 2010
Antwort Antwort
WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#1

Re: TListView.OnDrawItem

  Alt 17. Nov 2010, 09:33
Form:
Delphi-Quellcode:
object Form20: TForm20
  Left = 0
  Top = 0
  Caption = 'Form20'
  ClientHeight = 202
  ClientWidth = 331
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object lvRecentFiles: TListView
    Left = 8
    Top = 8
    Width = 225
    Height = 175
    Columns = <
      item
        Caption = 'Recent files'
        Width = 221
      end>
    ColumnClick = False
    DoubleBuffered = True
    Groups = <
      item
        Header = 'Recent files'
        GroupID = 0
        State = [lgsNormal]
        HeaderAlign = taLeftJustify
        FooterAlign = taLeftJustify
        TitleImage = -1
        ExtendedImage = -1
      end>
    Items.ItemData = {
      03C60000000300000000000000FFFFFFFFFFFFFFFF0000000000000000000000
      001F43003A005C00570069006E0064006F00770073005C007300790073007400
      65006D00330032005C005300680065006C006C00330032002E0064006C006C00
      00000000FFFFFFFFFFFFFFFF0000000000000000000000000B43003A005C0062
      006F006F0074002E0069006E00690000000000FFFFFFFFFFFFFFFF0000000000
      000000000000001258003A005C006E006F006E00650078006900730074006500
      6E0074002E00640061007400}

    OwnerDraw = True
    GroupView = True
    ReadOnly = True
    RowSelect = True
    ParentDoubleBuffered = False
    ShowColumnHeaders = False
    TabOrder = 0
    ViewStyle = vsReport
    OnCustomDraw = lvRecentFilesCustomDraw
    OnCustomDrawItem = lvRecentFilesCustomDrawItem
    OnDrawItem = lvRecentFilesDrawItem
  end
end
Source:
Delphi-Quellcode:
unit Unit20;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, UxTheme;

type
  TForm20 = class(TForm)
    lvRecentFiles: TListView;
    procedure lvRecentFilesDrawItem(Sender: TCustomListView; Item: TListItem;
      Rect: TRect; State: TOwnerDrawState);
    procedure lvRecentFilesCustomDraw(Sender: TCustomListView;
      const ARect: TRect; var DefaultDraw: Boolean);
    procedure lvRecentFilesCustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    Theme: hTheme;
  public
    { Public declarations }
  end;

var
  Form20: TForm20;

implementation

{$R *.dfm}

procedure TForm20.FormCreate(Sender: TObject);
begin
  SetWindowTheme(lvRecentFiles.Handle, 'Explorer', nil);
  Theme := OpenThemeData(0, 'ListView');
end;

procedure TForm20.FormDestroy(Sender: TObject);
begin
  CloseThemeData(Theme);
end;

procedure TForm20.lvRecentFilesCustomDraw(Sender: TCustomListView;
  const ARect: TRect; var DefaultDraw: Boolean);
//var
// StateId: Integer;
begin
// StateId := LIS_SELECTED; // LIS_SELECTEDNOTFOCUS // LIS_NORMAL
// DrawThemeBackground(
// Theme,
// lvRecentFiles.Canvas.Handle,
// LVP_LISTITEM,
// StateId,
// ARect,
// nil
// );
  DefaultDraw := True;
end;

procedure TForm20.lvRecentFilesCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  DefaultDraw := True;
end;

procedure TForm20.lvRecentFilesDrawItem(Sender: TCustomListView;
  Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var
  R: TRect;
  S: string;
begin
  S := Item.Caption;

  with lvRecentFiles, lvRecentFiles.Canvas do
  begin
    if FileExists(S) then
      Font.Color := clWindowText
    else
      Font.Color := clGrayText
    ;

    R := Classes.Rect(Rect.Left + 6, Rect.Top + 3, Rect.Right, Rect.Bottom - 2);
    TextRect(R, S, [tfEndEllipsis]);
  end;
end;

end.
Group header has selection, items not

Screen attached.
Angehängte Grafiken
Dateityp: jpg listview.jpg (19,2 KB, 68x aufgerufen)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: TListView.OnDrawItem

  Alt 17. Nov 2010, 14:42
One thing I immediately spotted:
Delphi-Quellcode:
procedure TForm20.FormCreate(Sender: TObject);
begin
  SetWindowTheme(lvRecentFiles.Handle, 'Explorer', nil);
  Theme := OpenThemeData(0, 'ListView');
end;
has to be
Delphi-Quellcode:
procedure TForm20.FormCreate(Sender: TObject);
begin
  SetWindowTheme(lvRecentFiles.Handle, 'Explorer', nil);
  Theme := OpenThemeData(lvRecentFiles.Handle, 'ListView');
end;
Because, as I said, you have to manually activate the "explorer style" for each window by calling SetWindowTheme. If you do this for a specific window, but then open the theme data of a different window handle (0), of course it won't work.

Not saying, that this is the only issue (might be, might not be), but at least it's one reason why it can't work. If it doesn't work after changing this, try to set DefaultDraw to False because it's possible that the default drawing routine overdraws the background again (I don't know about that and I'm too lazy to look it up in the VCL sources).

Also, I don't know what the difference between OnDrawItem and OnCustomDrawItem is, and in which order they are called. But I would suggest moving the DrawThemedBackground -code to the OnDrawItem routine.

Geändert von Namenloser (17. Nov 2010 um 18:28 Uhr)
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#3

Re: AW: TListView.OnDrawItem

  Alt 17. Nov 2010, 18:07
Now working Thanks so much!

Delphi-Quellcode:
    Brush.Style := bsClear;
    FillRect(Rect);

    if odSelected in State then
    begin
      DrawThemeBackground(Theme, lvRecentFiles.Canvas.Handle,
        LVP_LISTITEM, LIS_SELECTED, Rect, nil
      );
    end;
Yes, OnCustom* are not required, just OnDrawItem is needed. This cod I putten between font color and text render. And now I have list liki in Delphi
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.
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