![]() |
Design von visuellen Objekten ändern
Hallo,
ich wollt wissen wie man z.B. die farbe und design von objekten ändern kann. Also als Beispiel: Ich benutze ein listbox und möchte die scrollbar an der seite verändern, eigentlich möchte ich es mit einem bild füllen, doch mir würde es auch reichen wenn ich weiß wie man die Farbe änder kann. Ich hoffe ihr könnt mir weiter helfen. |
Re: Design von visuellen Objekten ändern
AFAIK benutzt das einen API Aufruf, und da kannst du nicht so einfach die Farbe ändern. Dazu musst du schon eine eigene Klasse basteln.
|
Re: Design von visuellen Objekten ändern
Heißt das ich muss eine eigene Listbox erstellen?
Ich kenn mich da nicht so gut aus, wie Aufwändig ist es denn ne eigene Klasse zu schreiben? Ich will ja nur die scrollbar an der seite verändern, gibt es da eine möglichkeit die klasse zu kopieren oder so was. |
Re: Design von visuellen Objekten ändern
Zitat:
Delphi-Quellcode:
Das sollte so in etwa gehen...
type
TMyListBox = class(TListBox) public procedure RePaint; override; end; implementation procedure TMyListBox.RePaint; override; begin inherited RePaint; Self.Canvas.Rectangle(Width-20,0,Width,Height); end; Die 20 steht hier für die Breite des ScrollBalkens |
Re: Design von visuellen Objekten ändern
Ja, das ist SEHR aufwendig.
Du musst halt Ereignisse, Eigenschaften, Methoden usw. definieren. Aber du kannst ja auch mal schauen, ob du irgendwo ne fertige Koponente findest. |
Re: Design von visuellen Objekten ändern
Oh, gut Ich dachte schon ich muss ein neues Objekt erstellen.
Und wie macht man das, dass sich (das Bild) wie der scrollbalken bewegt. Bevor ich es noch vergesse: Danke glkgereon, dass du so schnell antworten konntest, hätte nicht gedacht das so schnell geht. |
Re: Design von visuellen Objekten ändern
Du musst per API herausfinden, wie weit die Scrollbox gescrollt ist und maximal gescrollt werden kann, und nach diesen Werten dann einen Scrollbalken zeichnen.
|
Re: Design von visuellen Objekten ändern
Zitat:
Ehrlich gesagt weiss ich gar nicht ob das geht. afaik wird die Listbox doch mithilfe eines WinApi-Typs erzeugt...Und da an Werte wie zB die Position des ScrollBalkens dranzukommen....Keine Ahnung Ich räume mal das Feld, für unsre Spezialisten :) Mein Code da oben kann nur was drüberzeichnen ;) |
Re: Design von visuellen Objekten ändern
Das geht irgendwie mit ListBox.Perform. Ich wühl mal kurz in alten Beiträgen.
|
Re: Design von visuellen Objekten ändern
u nd wie macht man das :?
|
Re: Design von visuellen Objekten ändern
Ich bin mir nicht sicher, ob das geht:
Delphi-Quellcode:
procedure TMyListbox.Repaint; override;
var Pnt: TPoint; begin inherited Repaint; Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt)); Canvas.Brush.Color:=clSkyBlue; Canvas.rectangle(Width-10,0,Width,Height); Canvas.Brush.Color:=clBlue; //In Pnt.Y steht drin, wie weit das Teil gescrollt ist. Aber wie der Rest gezeichnet wird, weiß ich //nicht. end; |
Re: Design von visuellen Objekten ändern
Zitat:
|
Re: Design von visuellen Objekten ändern
Zitat:
Delphi-Quellcode:
procedure TMyListbox.Repaint; override;
var Pnt: TPoint; H: Integer; begin inherited Repaint; H:=Round( Height / Count * (Height / ItemHeight)); //Höhe des Scrollbalkens. Richtig? Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt)); Canvas.Brush.Color:=clSkyBlue; Canvas.Rectangle(Width-10,Pnt.Y,Width,Pnt.Y+H); Canvas.Brush.Color:=clBlue; //In Pnt.Y steht drin, wie weit das Teil gescrollt ist. Aber wie der Rest gezeichnet wird, weiß ich //nicht. end; |
Re: Design von visuellen Objekten ändern
Ja, so könnte es gehen.
|
Re: Design von visuellen Objekten ändern
Sorry das ich nicht frühere antworten konnte war gestern so müde.
Ich habe jetzt das ausprobiert was hier steht, doch Delphi erkennt die Anweisung 'override' nicht und meint das 'EM_GETSCROLLPOS' ein undefinierter Bezeichner ist. Hier der Code:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyListBox = class(TListBox) public procedure RePaint; override; end; type TForm1 = class(TForm) ListBox1: TListBox; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TMyListbox.Repaint;override; var Pnt: TPoint; H: Integer; begin inherited Repaint; H:=Round( Height / Count * (Height / ItemHeight)); //Höhe des Scrollbalkens. Richtig? Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt)); Canvas.Brush.Color:=clSkyBlue; Canvas.Rectangle(Width-10,Pnt.Y,Width,Pnt.Y+H); Canvas.Brush.Color:=clBlue; //In Pnt.Y steht drin, wie weit das Teil gescrollt ist. Aber wie der Rest gezeichnet wird, weiß ich //nicht. end; end. |
Re: Design von visuellen Objekten ändern
Repaint sorgt nur dafür, dass das Control neugezeichnet wird. Du musst die WM_PAINT-Message abfangen.
|
Re: Design von visuellen Objekten ändern
ich kenn mich da nicht so gut aus kans5t du es näher beschreiben :oops:
|
Re: Design von visuellen Objekten ändern
Ah, :idea: ich glaub du meinst EM_GETSCROLLPOS durch WM_PAINT ersetzen
oder ist es ganz falsch? Ich habs mal aus probiert aber es geht gar nicht, den er erkennt die override anweisung nicht. |
Re: Design von visuellen Objekten ändern
HiHo,
Was du derzeit versuchst zu machen ist, die Repaint-Prozedur einer Listbox zu überschreiben. Khabar... der mit dem unbeschreiblichen Namen sagt, dass du aber auf die Windows-Message WM_PAINT (Forensuche) reagieren solltest. Mit deinem jetzigen Code hat das eher weniger zu tun. MfG, hanselmansel |
Re: Design von visuellen Objekten ändern
ich habe jetzt gesucht und auch einieges gefunden doch nichts was mir weiter hilft, wie fängt man die Wm_paint messages ab.
|
Re: Design von visuellen Objekten ändern
Ich glaube so:
procedure OnPaint; message WM_PAINT; (Weiß ich aber nicht genau.) |
Re: Design von visuellen Objekten ändern
Kennt ihr ein tutorial zu wm_paint, wo alles schritt für schritt erklärt ist.
Denn ich glaub ich bin nicht der einzige der das Design der objekte ändern möchte. :roll: Und es würde mir weiter helfen den ich kenn mich nicht mit Delphi nicht so gut aus (Grundlagen ausgeschlossen). |
Re: Design von visuellen Objekten ändern
Dann fängst du mit sowas kompliziertem an? Nimm halt fürs erste lieber die VCL-Listbox her, oder muss der Scrollbalken unbedingt so aussehen?
|
Re: Design von visuellen Objekten ändern
Ich will ja nicht übertreiben aber ich glaub ich kenn mich mit delphi gut genug aus jetzt mit was neues anzufangen.
Ich will ja mein wissen immer erweitern. Ich hab auch einige Programme geschrieben, doch nun will ich programme haben, die ihr eigenes Design haben. Ich hoffe du kanst es verstehen 3_of_8 |
Re: Design von visuellen Objekten ändern
Du sagtest gerade eben, du kennst dich mit Delphi noch nicht so gut aus.
Natürlich KANN ich das verstehen, aber damit DU verstehen kannst, wie das mit den Ereignissen funzt, solltest du mal versuchen, eine eigene Klasse zu schreiben. Oder du schaust dir die Beispiel-Kompos an, die Delphi dabei hat. |
Re: Design von visuellen Objekten ändern
Um eine Windows-Botschaftsmethode zu behandeln, musst du eine Methode mit der message-Direktive deklarieren:
Delphi-Quellcode:
Wobei du auch die Code-Completion benutzen kannst (Strg + Space), dann musst du nur noch den Namen der Message eingeben.
type
TMyListBox = ... private procedure WMPaint(var Message: TWMPaint); message WM_PAINT; |
Re: Design von visuellen Objekten ändern
Ich meinte eigentlich: ich kenn mich mit delphi in verbindung mit windows nicht aus, ich weiß das es am besten ist eine eigene klasse zu estellen doch, ich glaub es ist zu aufwändig, weil ich eh nur kleinigkeiten ändern will zB. Farbe und nicht die funktionen.
Ich möcht ein programm haben das nicht wie windows aussieht, doch die funktionen gleich sind. Hier: Scrollbalken. Ich habe selbst nach einem tutorial zu wmpaint gesucht, doch hab nichts gefunden. |
Re: Design von visuellen Objekten ändern
Zitat:
|
Re: Design von visuellen Objekten ändern
Sendet eigentlich das prog die daten oder fordert windows sie auf?
nach dem Quelltext von Khabarakh sieht es so aus alls ob die listbox es senden würde. |
Re: Design von visuellen Objekten ändern
Die VCL-Komponenten basieren auf API Aufrufen, die Windows anweisen, an einer bestimmten Stelle deines Fensters eine Listbox zu machen.
Windows sendet dann an die Listbox ab und zu Messages (WM_PAINT, WM_SCROLLirgendwas), und in der procedure flump(var Message: TWMPaint); message WM_PAINT; wird dann darauf reagiert, wenn Windows gerade eine WM_PAINT Message an die Listbox sendet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 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