![]() |
ListView_SetBkImage funktioniert nicht mit VCL-Listview
Hallo Delphi-Gemeinde!
Der Aufruf von ListView_SetBkImage liefert mir bei nem VCL-Listview als Rückgabewert FALSE. Mist! Exakt derselbe Code arbeitet in nem NonVCL Projekt, in dem ich das kleine süsse Listview zu Fuss erstelle, völlig klaglos. WM_EraseBkGnd hab ich entsprechend gepatch und damit die VCL-Verschlimmbesserung überlistet. Daran liegt es also nicht. Ich hab auch diverseste Einstellungskombinationen im OI ausprobiert. Natürlich ohne Erfolg, sonst würd ich ja nicht nachfragen. *ggg* Welcher Wissende weiss Rat? Ich geh derweil duschen.
Delphi-Quellcode:
Vielen Dank schon mal
...
Var LVBK:TLVBKImage; Begin ... LVBK.ulFlags:=LVBKIF_STYLE_TILE + LVBKIF_SOURCE_URL; LVBK.pszImage:='C:\Test.bmp'; If ListView_SetBkImage(hLV,@LVBK) Then ListView_SetTextBkColor(hLV,CLR_NONE); OLLI |
Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
Moin!
Ich habs. Hilf Dir selbst, dann hilft Dir Gott. *ggg* Gott zum Grusse ... |
Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
Hallo OLLI_T,
herzlich Glückwunsch. Wie sieht die Lösung denn aus ? |
Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
Zitat:
|
Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
So, ich wollt's auch mal ausprobieren, komme aber nicht weiter. In der MSDn steht geschrieben das man, um das Bk-Image zu verwenden den Default(Message)Handler aufrufen soll.
Delphi-Quellcode:
In dem Listviewfenster wird nun überhaubt nichts gezeichnet.
type
TfrmMain = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } LVOldWndProc: TWndMethod; procedure ListViewSetBKImage; procedure LVWindowProc(var Msg: TMessage); public { Public-Deklarationen } end; var frmMain: TfrmMain; implementation {$R *.dfm} uses ShellAPI, CommCtrl, ComObj; procedure TfrmMain.FormCreate(Sender: TObject); begin ListViewSetBKImage; LVOldWndProc := ListView1.WindowProc; ListView1.WindowProc := LVWindowProc; end; procedure TfrmMain.ListViewSetBKImage; var LVBkImg: TLVBkImage; FFilename: String; FTile: Boolean; FXOffsetPercent, FYOffsetPercent: Integer; begin FFilename := 'C:\Windows\Angler.bmp'; FTile := FALSE; FXOffsetPercent := 0; FYOffsetPercent := 0; if assigned(ListView1) and ListView1.HandleAllocated then begin if FFilename <> '' then LVBkImg.ulFlags := LVBKIF_SOURCE_URL else LVBkImg.ulFlags := LVBKIF_SOURCE_NONE; if FTile then LVBkImg.ulFlags := LVBkImg.ulFlags or LVBKIF_STYLE_TILE else LVBkImg.ulFlags := LVBkImg.ulFlags or LVBKIF_STYLE_NORMAL; LVBkImg.hbm := 0; // Bitmap.Handle (HBitmap) LVBkImg.pszImage := PChar(FFilename); LVBkImg.cchImageMax := Length(FFilename); LVBkImg.xOffsetPercent := FXOffsetPercent; LVBkImg.yOffsetPercent := FYOffsetPercent; ListView_SetBkImage(ListView1.Handle, @LVBkImg); //ListView_SetBKColor(ListView1.Handle,CLR_NONE); end; end; procedure TfrmMain.LVWindowProc(var Msg: TMessage); begin Case Msg.Msg of WM_ERASEBKGND: DefaultHandler(Msg); else LVOldWndProc(Msg); end; end; Was habe ich falsch gemacht ? :gruebel: Die selbe Frage gibt es (nun) auch hier: ![]() |
Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
In zwischen habe ich mal eine andere Variante versucht:
Delphi-Quellcode:
Dieses Beispiel erstellt dynamisch ein ListView was ich aber nicht möchte. Mein Ziel ist es im der Unit selbst ein ListView zu verändern ohne eine extra Kombo.
unit Unit1;
{$DEFINE WINDOWSXPSTYLE} {$IFDEF WINDOWSXPSTYLE} {$R WinXP.Res} {$ENDIF} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TMyListView = class(TListView) protected procedure WndProc(var Message: TMessage); override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } ListView1: TMyListView; IL: TImageList; procedure LVBGImage; public { Public declarations } end; var Form1: TForm1; implementation uses ComObj, CommCtrl, ShellAPI; {$R *.dfm} // const in CommCtrl: // LVBKIF_SOURCE_NONE = 0; // Nix // LVBKIF_SOURCE_HBITMAP = 1; // HBitmap source // LVBKIF_SOURCE_URL = 2; // Path to Bitmap // LVBKIF_SOURCE_MASK = 3; // BitmapMaske ? // LVBKIF_STYLE_NORMAL = 0; // ??? // LVBKIF_STYLE_TILE = 16; // Gekachelt // LVBKIF_STYLE_MASK = 16; // ??? procedure TMyListView.WndProc(var Message: TMessage); begin if Message.Msg = WM_ERASEBKGND then DefaultHandler(Message) else inherited WndProc(Message); end; procedure TForm1.LVBGImage; var LVBKImage : TLVBKIMAGE; begin FillChar(LVBKImage, SizeOf(LVBKImage), 0); LVBKImage.ulFlags := LVBKIF_SOURCE_URL or LVBKIF_STYLE_TILE; LVBKImage.pszImage := PChar('c:\windows\angler.bmp'); // Bmp, Gif, Png, Jpg 's LVBKImage.hbm := 0; LVBKImage.xOffsetPercent := 0; LVBKImage.yOffsetPercent := 0; ListView_SetBkImage(ListView1.Handle, @LVBKImage); //ListView_SetBKColor(ListView1.Handle, CLR_NONE); end; procedure TForm1.FormCreate(Sender: TObject); var i: Byte; Icon : TIcon; begin // Icon & Imagelist bauen... Icon := TIcon.Create; Icon.Handle := ExtractIcon(HInstance, 'SHELL32.DLL', 6); IL := TImageList.Create(Self); IL.Width := 32; IL.Height := 32; IL.AddIcon(Icon); Icon.Free; // Listview erstellen ListView1 := TMyListView.Create(Self); // Listview füllen with ListView1 do begin Parent := Self; Left := 5; Top := 5; Width := 250; Height := 200; With ListView1.Columns.Add do Caption := 'First'; With ListView1.Columns.Add do Caption := 'Sub'; ViewStyle := vsReport; //ViewStyle := vsIcon; LargeImages := IL; end; LVBGImage; for i := 0 to 24 do with ListView1.Items.Add do begin Caption := format('%s%x',[Chr(Ord('A') + i), i]); ImageIndex := 0; SubItems.Add(format('%5.5d', [i])); end; end; procedure TForm1.FormDestroy(Sender: TObject); begin ListView1.Free; IL.Free; end; end. Wer kann helfen ? // Edit: Der Absendenbutton ist nicht der Vorschauknopf... :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz