![]() |
SubClassed Control
Liste der Anhänge anzeigen (Anzahl: 65533)
Projekt entfernt..
|
AW: SubClassed ScrollBar
Da keiner antwortet tue ich es selbst ;)
Neue Version Oben nun werden die Bitmaps gerendert gruss |
AW: SubClassed ScrollBar
Fertig!
HScroll und Sizer addiert.. gruss |
AW: SubClassed ScrollBar
:thumb:
Toll! Läuft unter XP ohne Probleme. Ist auch eine super Idee, den Quelltext im Memo der Exe unterzubringen! :-D |
AW: SubClassed ScrollBar
Zitat:
also MouseWheel usw.. gruss |
AW: SubClassed ScrollBar
Wie sieht es aus, mit größenänderung des Hauptfensters? Wenn man das Fenster in der größe ändert, dann bleiben die Bars noch im Ausgangs zustand...
|
AW: SubClassed ScrollBar
Zitat:
Wenn die Memo sich beim resitz des Fensters vergrößert setzt sich natürlich die Scrollbar an die richtige position so wie es sein muss ;) Das habe ich schon abgefangen. gruss |
AW: SubClassed ScrollBar
Email ist angekommen - ich schau's mir gerade an.
Zu Deinen Bemerkungen: Ja - geht alles klar. Da hast Du mein vollstes Verständnis! |
AW: SubClassed ScrollBar
Zitat:
gruss |
AW: SubClassed ScrollBar
Liste der Anhänge anzeigen (Anzahl: 1)
Problem gefunden/gelöst:
Delphi-Quellcode:
Allerdings habe ich noch einen kleinen Fehler gefunden:
function THookedScrollbar.StoreHorizontal(WinHandle: HWND): Boolean;
begin //... Result:=HScrBar.rgstate[0] and STATE_SYSTEM_INVISIBLE=0; end; function THookedScrollbar.StoreVertical(WinHandle: HWND): Boolean; begin //... Result:=VScrBar.rgstate[0] and STATE_SYSTEM_INVISIBLE=0; end; Anhang 34538 Es sieht so aus, als ob die Scrollbar um jeweils einen Pixel nach rechts und unter verschoben wäre. Könnte das sein? P.S.: Das ist ja ein richtig umfangreiches Projekt und einer Menge Arbeit, die da drin steckt. :shock: Ganz tolle Arbeit! :hello: |
AW: SubClassed ScrollBar
Zitat:
werde es mal einbauen und schaun ob es geht. ;) Mit Quelltext geht es doch besser :) als mit ner :glaskugel: EDIT: Was hast mit State gemacht? Auf der Basis wird es ja nicht mehr gebraucht.. Oder? ;) gruss |
AW: SubClassed ScrollBar
Nö. Ist unter den Tisch gefallen... :lol:
|
AW: SubClassed ScrollBar
Zitat:
Naja kleine Probleme findet man immer noch irgend wo. Hab mal mit meiner Screenlupe geschaut unter Win7 stimmen die Koordinaten exakt. Zitat:
Danke für die Blumen.. Jup das macht sich nicht von alleine und als Hobby Schreiber hab ich das schon gut hinbekommen denk ich mal. EDIT: Solltest du vielleicht noch ändern! Es macht keinen Sinn den Rect zu kopieren wenn die ScrollBar nicht aktiv ist.
Delphi-Quellcode:
function THookedScrollbar.StoreHorizontal(WinHandle: HWND): Boolean;
var State: Boolean; begin // Lese aktuelle Bar Parameter HScrBar.cbSize := SizeOf(HScrBar); GetScrollBarInfo(WinHandle, integer(OBJID_HSCROLL), HScrBar); State := HScrBar.rgstate[0] and STATE_SYSTEM_INVISIBLE = 0; if State then // kopiere den aktuellen Rect zur späteren bearbeitung CopyRect(HorzRect, HScrBar.rcScrollBar); Result := State; end; gruss |
AW: SubClassed ScrollBar
Zitat:
Zitat:
P.S.: Ja - da hast Du Recht. Hab' die Änderung übernommen. |
AW: SubClassed ScrollBar
Zitat:
Denke das ist normal die ScrollBars sind wohl etwas Größer ausgefallen. Zitat:
PS: Du kannst aber mit GetOS prüfen welches OS verwendet wird und dem entsprechend die Function ResizeScrollBarPos erweitern. Alles was mehr als WinXp ist so belassen.. gruss |
AW: SubClassed ScrollBar
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Anhang 34539 Damit offenbart sich ein Problem: Deine Scrollbars funktionieren nur dann richtig, wenn nicht irgendwer seinen Rechner "umgestellt" hat. Wäre es da nicht eventuell günstiger, die Darstellung nicht über Bilder zu realisieren, sondern direkt zu zeichnen? Oder eventuell über SVG-Bilder, die sich besser skalieren lassen? |
AW: SubClassed ScrollBar
Zitat:
Hatte da noch nie probleme bei der Skalierung. Man müßte halt dann noch irgendwie abfragen wie die aktuelle positionen im System eingestellt sind. Da muss ich mich aber erst mal reindenken und im NET mal nachblättern wie ich das realisieren kann. Das skalieren ist dann das kleinst problem. Denke das ich dann aber die Stretchblitter Methode von GDI+ verwenden werde. Aktuell ist sie ja von GDI. PS: Denke das ist über den Rect der Originalen ScrollBar zu ermitteln. Da muss man nicht im System rumwurschteln. gruss |
AW: SubClassed ScrollBar
Zitat:
|
AW: SubClassed ScrollBar
Zitat:
Die Standard einstellung ist 16x16 pixel ..den Rect prüfen und dann hochrechnen also wenn die höhe 20 dann müssen die Down und Up Button ebend auf 20x20 hochskaliert werden. Einfach * ScaleFactor gruss |
AW: SubClassed ScrollBar
Quelltext in DLL gekapselt alles andere oben.
gruss |
AW: SubClassed ScrollBar
Neue Version mit mehreren Komponenten auf der Form hochgeladen.
gruss |
AW: SubClassed ScrollBar
Nun Open Source!
Viel Spass damit. gruss |
AW: SubClassed ScrollBar
Auch wenn da nicht gerade viele Meinungen kommen.
Werde das teil mal um ComboBoxen erweitern und zu Ctrl_Hook umbenennen. Hab im moment eh nix zu tun. Muss das Frame und das Bitmap noch Rendern dann passt das schon :) gruss |
AW: SubClassed ScrollBar
Zitat:
|
AW: SubClassed ScrollBar
Zitat:
Sieht jetzt in etwa so aus!
Delphi-Quellcode:
Kann man dann wie vorher auch mit ComboBox, DriveCombobox usw.. machen.
ScrbMemoHook: IHookedScrollbar;
ComboHook : IHookedCombo; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var FilePath: string; begin ScrbMemoHook := HookedScroolBar_Create; if assigned(ScrbMemoHook) then begin FilePath := ExtractFilePath(ParamStr(0)); // Memo1 // Vertikale ScrollBar Images ScrbMemoHook.VTrack := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\VTrack.png'); ScrbMemoHook.VBtnUp := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\VBtnUp.png'); ScrbMemoHook.VThumb := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\VThumb.png'); ScrbMemoHook.VBtnDown := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\VBtnDown.png'); // Horizontale ScrollBar Images ScrbMemoHook.HTrack := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\HTrack.png'); ScrbMemoHook.HBtnLeft := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\HBtnLeft.png'); ScrbMemoHook.HThumb := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\HThumb.png'); ScrbMemoHook.HBtnRight := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\HBtnRight.png'); ScrbMemoHook.Sizer := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\Sizer.png'); ScrbMemoHook.SetScrollBarObj(Memo1); ScrbMemoHook.Connect; end; ComboHook := HookedCombo_Create; if assigned(ComboHook) then begin ComboHook.ComboImg := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\Combo.png'); ComboHook.FrameColor := $FCAC65; ComboHook.FrameHighLite := $FFE9D6; ComboHook.SetComboParentObj(self); ComboHook.Connect; end; end; Nur in diesen Fall erstelle ich eine Collection also enumeriere alle Controls die eine Combo enthalten und verarbeite die in einem Rutsch. Deshalb übergebe ich diesmal als Object 'self' das erleichtert mir das parsen. gruss |
AW: SubClassed Control
Neue Version oben ..
Verwendung auf eigene Gefahr! gruss |
AW: SubClassed Control
Ich finde das Ding auch schick - auch wenn ich nicht denke, dass ich es benutzen werde, gibt einfach nichts von mir wo es reinpassen würde.
Für das Open-Source gibt es übrigens :thumb::thumb::thumb: ! |
AW: SubClassed Control
Zitat:
Ein paar kleine Sachen werden da wohl noch im argen sein. Aber das kann ja jeder oder einer selber fixen wenn er was findet. Bin nur Hobby Schreiber :) PS: Auch wenn da Hook steht mit Hook hat es im eigentlichen Sinne nichts zu tun. gruss |
AW: SubClassed Control
ne neue MouseWheel für ScrollBars addiert.
Wenn ich in der nächsten zeit noch Bock hab dann implementiere ich noch die Checkboxen gruss |
AW: SubClassed Control
Hallo,
ich hab mir das eben angeschaut, also erstmal ... GEIL :-) echt hammergeil, das such ich eigentlich schon ne ganze weile, ich wollte in meinem Player die Playliste schwarz machen, aber wegen den Scrollbars sieht das sche... aus, aber mit dem hier würde es jetzt endlich gehen. Allerdings hab ich das hier eben unter Win7 64 angesehen und habe auch hier den 1 pixel nach rechts verschoben, aber meine Einstellungen im Windows für die Scrollbars ist auf standart. Gibt es hierzu schon einen fix? Kann man evtl die größe der scrollbar auslesen und die von dir daran anpassen? Auf jeden Fall mal Kompliment, tolle Arbeit!!! Gruß tom |
AW: SubClassed Control
Zitat:
Zitat:
Alternativ könnte man ja noch anstelle von Bitblt StretchBlt verwenden. PS: Alternativ (vieleicht hab ich mein Bitmap zu klein gemacht) Kannst das ja mal prüfen. gruss |
AW: SubClassed Control
Einwas ist aber noch falsch.
Delphi-Quellcode:
Und zwar die bösen globalen Variablen. :warn:
function HookedCombo_Create: IHookedCombo; stdcall;
procedure HookedCombo_Destroy; stdcall; var HookedCombo: IHookedCombo; CloseHandle: HWND; implementation HookedCombo_Destroy kann also immer nur das zuletzt erstelle Control freigeben. Entweder du gibst dieser Prozedur das richtige Handle mit, oder ... du nutzt doch eh Interfaces. Also laß' einfach diese Funktion und die beiden Variablen weg. Die Komponenten wird doch zusammen mit dem im Interface liegenden Objekt freigegeben. Nutze stattdessen TInterfacedObject als Vorfahre, dann hat man im Hauptprogramm noch die Kontrolle und kann darüber das SubclassesControl freigeben, indem man den Interfacezeiger freigibt. Dazu muß dann natürlich im Hauptprogramm immer dieser Zeiger gespeichert werden/bleiben. Und auch im Hauptprogramm gehören diese Variablen nicht global, sondern z.B. als private Felder in die Form-Klasse.
Delphi-Quellcode:
Statt den vielen Variablen könnte man auch eine TInterfaceList verwenden, dazu dann noch eine Funktion, welche die Components der Form durchgeht, alle passenden Kombonenten sucht, für alle die SubclassedObjects erstellt und sie in der TInterfaceList speichert, welcher mit der Form dann freigegeben wird.
type
TForm1 = class(TForm) Memo1: TMemo; ... private { Private-Deklarationen } ScrbMemoHook : IHookedScrollbar; ScrbMemoHook2 : IHookedScrollbar; ComboHook : IHookedCombo; public { Public-Deklarationen } end; [add]
Delphi-Quellcode:
(siehe Signatur)
type
TSubclassedList = class(TComponent) List: TInterfaceList; constructor Create(Owner: TComponent); override; destructor Destroy; override; end; constructor TSubclassedList.Create(Owner: TComponent); begin inherited; List := TInterfaceList.Create; end; destructor TSubclassedList.Destroy; begin List.Free; inherited; end; procedure FindSubclassed(Comp: TWinControl; Config: TStrings; L: TSubclassedList = nil); var i: Integer; S: IHookedScrollbar; C: IHookedCombo; begin if Config.Values['Path'] = '' then Config.Values['Path'] := ExtractFilePath(ParamStr(0)); if not Assigned(L) then L := TSubclassedList.Create(Comp); for i := 0 to Comp.ControlCount - 1 do begin if Comp.Controls[i] is TCustomMemo then begin S := HookedScroolBar_Create; L.List.Add(S); // Vertikale ScrollBar Images if Config.Values['VTrack'] > '' then S.VTrack := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VTrack']); if Config.Values['VBtnUp'] > '' then S.VBtnUp := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VBtnUp']); if Config.Values['VThumb'] > '' then S.VThumb := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VThumb']); if Config.Values['VBtnDown'] > '' then S.VBtnDown := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VBtnDown']); // Horizontale ScrollBar Images if Config.Values['HTrack'] > '' then S.HTrack := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HTrack']); if Config.Values['HBtnLeft'] > '' then S.HBtnLeft := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HBtnLeft']); if Config.Values['HThumb'] > '' then S.HThumb := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HThumb']); if Config.Values['HBtnRight'] > '' then S.HBtnRight := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HBtnRight']); // Size Images if Config.Values['Sizer'] > '' then S.Sizer := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['Sizer']); // S.SetScrollBarObj(Comp.Controls[i]); S.Connect; end else if Comp.Controls[i] is TCustomCombo then begin // Comboox C := HookedCombo_Create; L.List.Add(C); if Config.Values['ComboImg'] > '' then C.ComboImg := C.CreateImageFromFile(Config.Values['Path'] + Config.Values['ComboImg']); if Config.Values['FrameColor'] > '' then C.FrameColor := StringToColor(Config.Values['FrameColor']); if Config.Values['FrameHighLite'] > '' then C.FrameHighLite := StringToColor(Config.Values['FrameHighLite']); //if Config.Values['FrameStyle'] > '' then C.FrameStyle := StringToXxx(Config.Values['FrameStyle']); C.SetComboParentObj(Comp.Controls[i]); C.Connect; end; FindSubclassed(Comp.Controls[i], Config, L); end; end; procedure TForm1.FormCreate(Sender: TObject); var Config: TStringList; begin Config := TStringList.Create; try Config.Values['Path'] := ExtractFilePath(ParamStr(0)) + 'ScrollBarSkin\'; // Vertikale ScrollBar Images Config.Values['VTrack'] := 'VTrack.png'; Config.Values['VBtnUp'] := 'VBtnUp.png'; Config.Values['VThumb'] := 'VThumb.png'; Config.Values['VBtnDown'] := 'VBtnDown.png'; // Horizontale ScrollBar Images Config.Values['HTrack'] := 'HTrack.png'; Config.Values['HBtnLeft'] := 'HBtnLeft.png'; Config.Values['HThumb'] := 'HThumb.png'; Config.Values['HBtnRight'] := 'HBtnRight.png'; // Size Images Config.Values['Sizer'] := 'Sizer.png'; // Comboox Config.Values['ComboImg'] := 'Combo.png'; Config.Values['FrameColor'] := '$FED3AC'; Config.Values['FrameHighLite'] := '$666666'; Config.Values['FrameStyle'] := 'FrameFlat'; // FindSubclassed(Self, Config); finally Config.Free; end; end; [add] Tut mir Leid das jetzt so hart sagen zu müssen, aber das Teil ist das reinste Speichergrab. So
Delphi-Quellcode:
gibt man jedenfalls keine Komonente ala TBitmap frei.
if assigned(VTrack) then VTrack := nil;
Wobei, wie schon gesagt, hier eh fast keine Komponenten freigegeben werden, da HookedScroolBar_Destroy nur beim Letzen wirkt. |
AW: SubClassed Control
Danke für die Infos :)
Wenn ich bock habe da noch was in der nächsten zeit zu berichtigen werde ich die von dir vorgeschlagenen Aspekte mit berücksichtigen. Zitat:
Ich denke das Control's ala HWND (also Nonvcl erstellte Windows) von Windows grundsätzlich selbst freigegeben werden. Warum dann die Arbeit machen diese in einer Collection zusammen zu fassen ? War so schon schwer genug .. Der Ansatz ist vorhanden und kann dann vom User soweit er es verwenden will und Fehler findet selbst korrigiert werden. gruss |
AW: SubClassed Control
Hab mal ne neue version hochgeladen.
Wenn jemand Bock hat kann er mir mal mitteilen ob die Speicherlecks jetzt beseitigt sind. Vorrangig erstmal die für die ComboBoxen. FastMM zeigt mir zumindest nichts mehr an. Hab die Function von himitsu mal mit eingebunden. gruss |
AW: SubClassed Control
Neuerungen siehe oben.
gruss |
AW: SubClassed Control
gibt es das noch irgendwo zum herunterladen?
|
AW: SubClassed Control
Leider nein, da einige Leute hier meinen sich nicht an Urheberrechte halten zu müssen
habe ich alle meine Projekte hier entfernt. Es sollte aber kein Problem sein so etwas selbst zu programmieren. gruss |
AW: SubClassed Control
Habe noch ne Checkbox addiert da ich diese für mein aktuelles Projekt benötigte.
Ich möchte darum bitten die Header nicht zu entfernen.. wenn ihr was verbessert addiert eure Änderungen dazu. Für NonVcl muss man diese Funktionen deaktivieren.
Delphi-Quellcode:
Anschließend diese Funktion erweitern.
procedure SetCheckBoxParentObj(ParentObj: TWinControl);
procedure SetCheckBoxObj(CtrlObj: TWinControl);
Delphi-Quellcode:
procedure Connect;
Delphi-Quellcode:
procedure Connect(ParentHandle: HWND; CtrlHandle: HWND);
Man übergibt dann das ParentHandle = Form -> Handle Und dazu das des Controls bsp. Checkbox -> Handle Aber Achtung diese Änderungen müssen dann natürlich auch im Interface geschehen.. 3D Text mit Schatten wie im Anhang zu sehen ist in diesen Projekt nicht verfügbar. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 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