![]() |
Size Grip - ohne Statusbar
Liste der Anhänge anzeigen (Anzahl: 1)
|
Re: Size Grip - ohne Statusbar
|
Re: Size Grip - ohne Statusbar
Liste der Anhänge anzeigen (Anzahl: 1)
Ja danke Luckie, das ist eine gute Idee. Hm, leider gibt es dann bei der Benutzung des XP-Manifestes einen unschönen Effect.
Noch eine andere Idee ? |
Re: Size Grip - ohne Statusbar
Erweitere dein Formular im Interface-Teil um:
Delphi-Quellcode:
und im Implementation-Teil um:
protected
procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND; procedure WMNcHitTest(var Msg: TWMNcHitTest); message WM_NCHITTEST; procedure WMSize(var Msg: TWMSize); message WM_SIZE;
Delphi-Quellcode:
(TForm1 musst du natürlich durch den Namen deines Formulars ersetzen)
procedure TForm1.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
var rc: TRect; procedure Paint3(dc: HDC; const rc: TRect; clr: COLORREF; delta: integer); var pen, oldpen: HPen; begin pen := CreatePen(PS_SOLID, 0, clr); try oldpen := SelectObject(dc, pen); try MoveToEx(dc, rc.Right - delta, rc.Bottom - 1, nil); LineTo(dc, rc.Right, rc.Bottom - 1 - delta); inc(delta, 4); MoveToEx(dc, rc.Right - delta, rc.Bottom - 1, nil); LineTo(dc, rc.Right, rc.Bottom - 1 - delta); inc(delta, 4); MoveToEx(dc, rc.Right - delta, rc.Bottom - 1, nil); LineTo(dc, rc.Right, rc.Bottom - 1 - delta); finally SelectObject(dc, oldpen); end; finally DeleteObject(pen); end; end; begin inherited; Windows.GetClientRect(Handle, rc); rc.Left := rc.Right - 12; rc.Top := rc.Bottom - 12; Paint3(Msg.DC, rc, GetSysColor(COLOR_3DSHADOW), 2); Paint3(Msg.DC, rc, GetSysColor(COLOR_3DSHADOW), 3); Paint3(Msg.DC, rc, GetSysColor(COLOR_3DHILIGHT), 4); end; procedure TForm1.WMNcHitTest(var Msg: TWMNcHitTest); var rc: TRect; pt: TPoint; begin Windows.GetClientRect(Handle, rc); rc.Left := rc.Right - 12; rc.Top := rc.Bottom - 12; pt.x := Msg.XPos; pt.y := Msg.YPos; Windows.ScreenToClient(Handle, pt); if PtInRect(rc, pt) then Msg.Result := HTBOTTOMRIGHT else inherited; end; procedure TForm1.WMSize(var Msg: TWMSize); begin inherited; Windows.InvalidateRect(Handle, nil, TRUE); end; Das InvalidateRect bei WM_SIZE ist ein bisschen blöd, anders geht's aber irgendwie nur mit 'nem Extra-Control für das SizeGrip. |
Re: Size Grip - ohne Statusbar
Werde ich nacher gleich mal testen. thx.
:hi: |
Re: Size Grip - ohne Statusbar
Liste der Anhänge anzeigen (Anzahl: 1)
Konnte nicht umhin 'ne kleine Kompo dafür zu schreiben 8)
Benutzung ist denkbar einfach:
Delphi-Quellcode:
Source siehe Anlage oder
uses
SizeGripThemed; procedure TForm1.FormCreate(Sender: TObject); begin // ... TSizeGripThemed.Create(Self); end; ![]() Screenshot zeigt alle drei Varianten (auf die rechte untere Ecke achten). |
Re: Size Grip - ohne Statusbar
Na toll, jetzt wo ich mir selbst eine Kompo. (nach deinem Hinweis) geschrieben habe kommst Du und macht’s mir nach... äh.. vor. :zwinker:
Leider muss ich zugeben das mir Deine besser gefällt. :? Danke für diese schöne Komponente(n). :hi: // Edit: :gruebel: mach doch einen neuen Thread in Open Source damit man es besser in der Suche findet. // 2. Edit: (ausgiebig getestet) :bounce1: *juhu* ...man hab ich lange nach so etwas gesucht. |
Re: Size Grip - ohne Statusbar
Es scheint da noch ein kleines Problem zu geben (ich PM-me gerade mit turboPASCAL), also vielleicht erstmal nicht downloaden und installieren.
Mal 'ne technische Frage ... |
Re: Size Grip - ohne Statusbar
Liste der Anhänge anzeigen (Anzahl: 1)
So, neue Version fertig (den Download oben lösche ich raus).
@turboPASCAL: die Konstante SP_GRIPPER stammt aus der UxTheme.pas von Delphi, ich habe sie durch den Wert (3) ersetzt. Damit sollte man die Units auch mit der UxTheme.pas von Mike Lischke verwenden können. Die ge-theme-te Version TSizeGripThemed hat den "Vorteil", dass das Grip wirklich genau wie bei einem StatusBar gezeichnet wird, und damit je nach aktiviertem Stil unterschiedlich aussehen kann. |
Re: Size Grip - ohne Statusbar
den ganzen paint-scheiss hättest du dir sparen können:
Delphi-Quellcode:
DrawFrameControl ( DC, sender.ClientRect , DFC_SCROLL, DFCS_SCROLLSIZEGRIP );
|
Re: Size Grip - ohne Statusbar
Zitat:
Zitat:
|
Re: Size Grip - ohne Statusbar
Zitat:
die ganzen TWMPAInt usw typecasterei hat mich auch einige nerven gekostet (bei kol wird keine TMessage sondern eine tagMsg variable übergeben). Man kann es mit der "sauberen" programmierung :roll: auch übertreiben :? ein HDC(msg.lParam) hätte es auch getan |
Re: Size Grip - ohne Statusbar
Zitat:
Zitat:
Zitat:
//Nachtrag: Zu DrawFrameControl: es zeichnet immer die diagonalen Linien, könnte also höchsten meine Routine Paint3 ersetzen (was ich ggf. tun werde). |
Re: Size Grip - ohne Statusbar
Zitat:
wenn du das schaffst, gerne ;) ich brauch n SIZEGRIP für die brandneue version von ![]() |
Re: Size Grip - ohne Statusbar
Neee .. nicht in KOL einarbeiten - als API-Version implementieren.
So geht's bei mir schon mal, allerdings nur mit dem Standardlayout:
Delphi-Quellcode:
unit SizeGripHWND;
interface uses Windows, Messages; procedure SetSizeGripHook(hWnd: HWND; IsDoubleBuffered: boolean = false); procedure RemoveSizeGripHook(hWnd: HWND); implementation const SizeGripProp = 'SizeGrip'; type TWndProc = function (hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; PGripInfo = ^TGripInfo; TGripInfo = record OldWndProc: TWndProc; GripRect: TRect; DoubleBuffered: boolean; end; function SizeGripWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var Info: PGripInfo; ps: TPaintStruct; pt: TPoint; // Invalidate the current grip rectangular procedure InvalidateGrip; begin with Info^ do if (GripRect.Right > GripRect.Left) and (GripRect.Bottom > GripRect.Top) then begin if DoubleBuffered then InvalidateRect(hWnd, nil, true) else InvalidateRect(hWnd, @GripRect, true); end; end; // Update (and invalidate) the current grip rectangular procedure UpdateGrip; begin with Info^ do begin GetClientRect(hWnd, GripRect); GripRect.Left := GripRect.Right - GetSystemMetrics(SM_CXHSCROLL); GripRect.Top := GripRect.Bottom - GetSystemMetrics(SM_CYVSCROLL); end; InvalidateGrip; end; begin Info := PGripInfo(GetProp(hWnd, SizeGripProp)); if Info = nil then begin Result := DefWindowProc(hWnd, Msg, wParam, lParam); exit; end; case Msg of WM_DESTROY: begin RemoveProp(hWnd, SizeGripProp); SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@Info^.OldWndProc)); Result := CallWindowProc(@Info^.OldWndProc, hWnd, Msg, wParam, lParam); Dispose(Info); end; WM_PAINT: begin if wParam = 0 then begin wParam := BeginPaint(hWnd, ps); //try if Info^.DoubleBuffered then SendMessage(hWnd, WM_ERASEBKGND, wParam, wParam); Result := SendMessage(hWnd, WM_PAINT, wParam, lParam); //finally EndPaint(hWnd, ps); //end; end else begin DrawFrameControl(wParam, Info^.GripRect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); Result := CallWindowProc(@Info^.OldWndProc, hWnd, Msg, wParam, lParam); end; end; WM_NCHITTEST: begin pt.x := TSmallPoint(lParam).x; pt.y := TSmallPoint(lParam).y; ScreenToClient(hWnd, pt); if PtInRect(Info^.GripRect, pt) then Result := HTBOTTOMRIGHT else Result := CallWindowProc(@Info^.OldWndProc, hWnd, Msg, wParam, lParam); end; WM_SIZE: begin InvalidateGrip; Result := CallWindowProc(@Info^.OldWndProc, hWnd, Msg, wParam, lParam); UpdateGrip; end; else Result := CallWindowProc(@Info^.OldWndProc, hWnd, Msg, wParam, lParam); end; end; procedure SetSizeGripHook(hWnd: HWND; IsDoubleBuffered: boolean = false); var Info: PGripInfo; begin RemoveSizeGripHook(hWnd); New(Info); FillChar(Info^, SizeOf(TGripInfo), 0); Info^.OldWndProc := TWndProc(Pointer(GetWindowLong(hWnd, GWL_WNDPROC))); Info^.DoubleBuffered := IsDoubleBuffered; SetProp(hWnd, SizeGripProp, Cardinal(Info)); SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@SizeGripWndProc)); end; procedure RemoveSizeGripHook(hWnd: HWND); var Info: PGripInfo; begin Info := PGripInfo(GetProp(hWnd, SizeGripProp)); if Info <> nil then begin RemoveProp(hWnd, SizeGripProp); SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@Info^.OldWndProc)); Dispose(Info); end; end; end. |
Re: Size Grip - ohne Statusbar
Liste der Anhänge anzeigen (Anzahl: 1)
hut ab !
erstaunlich was du in der kurzen zeit gemacht hast. leider funktioniert's mit kol nicht recht. der grip wird nicht gepainted, und das resizen geht auch nicht ^^ einzig der cursor ändert sich wenn er sich in der ecke befindet - siehe demo //edit: wenn ich den borderstyle auf bsSingle stelle, funktioniert das resizen |
Re: Size Grip - ohne Statusbar
Das wird aber an kol liegen und nicht an Flockes Code, da dieser korrektes Delphi ist.
|
Re: Size Grip - ohne Statusbar
Isch schau Morgen noch mal ... isch bin jetscht ein bischschen angetrunken 8)
|
Re: Size Grip - ohne Statusbar
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte hier einen ähnlichen Effekt (Grip nicht sichtbar), wenn ich DoubleBuffered einstelle. Vielleicht probierst du es mal ohne.
Außerdem habe ich mal 'ne aktuelle Version der Unit angehängt. |
Re: Size Grip - ohne Statusbar
vielen dank für deine mühen!
jetzt gehts ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 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