AGB  ·  Datenschutz  ·  Impressum  







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

Size Grip - ohne Statusbar

Ein Thema von turboPASCAL · begonnen am 21. Sep 2005 · letzter Beitrag vom 31. Okt 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 13:35
Zitat von retnyg:
den ganzen paint-scheiss hättest du dir sparen können
Lass mich dir zunächst zu deiner ausgezeichneten Wortwahl gratulieren 8)

Zitat von retnyg:
DrawFrameControl ( DC, sender.ClientRect , DFC_SCROLL, DFCS_SCROLLSIZEGRIP );
Danke für den Hinweis, an DrawFrameControl hatte ich in diesem Zusammenhang überhaupt nicht gedacht. Ich mache noch ein paar Tests und schreibe dann mehr...
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#12

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 13:45
Zitat von Flocke:
Zitat von retnyg:
den ganzen paint-scheiss hättest du dir sparen können
Lass mich dir zunächst zu deiner ausgezeichneten Wortwahl gratulieren 8)
ich bin etwas frustriert weil ich versucht habe deine unit für KOL zu übersetzen und ich doch einige mühe mit deinem (extrem VCL-lastigen und umständlichen) quellcode hatte. ein resultat habe ich nicht, da KOL kein Inherited unterstützt. Ausserdem habe ich keine Möglichkeit gefunden, die windowproc des parents zu hooken.
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 auch übertreiben
ein HDC(msg.lParam) hätte es auch getan
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 14:30
Zitat von retnyg:
Zitat von Flocke:
Zitat von retnyg:
den ganzen paint-scheiss hättest du dir sparen können
Lass mich dir zunächst zu deiner ausgezeichneten Wortwahl gratulieren 8)
ich bin etwas frustriert weil ich versucht habe deine unit für KOL zu übersetzen und ich doch einige mühe mit deinem (extrem VCL-lastigen und umständlichen) quellcode hatte.
Es tut mir sehr leid, aber es ist eine VCL-Komponente, daher würde ich den Quellcode nicht nur als VCL-lastig bezeichnen. Ich habe nie vorgesehen, dass der Code für KOL verwendet wird (das ich außerdem noch nicht einmal installiert habe).

Zitat von retnyg:
Ausserdem habe ich keine Möglichkeit gefunden, die windowproc des parents zu hooken.
Da wird es wohl nur die gute alte Methode geben, die WNDPROC zu ersetzen. Wenn du bis morgen Zeit hast, dann kann ich dir sowas schreiben.

Zitat von retnyg:
Man kann es mit der "sauberen" programmierung auch übertreiben
Nein, nie

//Nachtrag:

Zu DrawFrameControl: es zeichnet immer die diagonalen Linien, könnte also höchsten meine Routine Paint3 ersetzen (was ich ggf. tun werde).
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#14

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 15:55
Zitat von Flocke:
Da wird es wohl nur die gute alte Methode geben, die WNDPROC zu ersetzen. Wenn du bis morgen Zeit hast, dann kann ich dir sowas schreiben.
du willst dich bis morgen in KOL einarbeiten ?
wenn du das schaffst, gerne
ich brauch n SIZEGRIP für die brandneue version von Hier im Forum suchenleetMP3, an der ich gerade code ( wird übrigens ein hammer )
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 17:09
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#16

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 18:37
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
Angehängte Dateien
Dateityp: exe leetmp3_831.exe (32,0 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 22:38
Das wird aber an kol liegen und nicht an Flockes Code, da dieser korrektes Delphi ist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

Re: Size Grip - ohne Statusbar

  Alt 30. Okt 2005, 23:30
Isch schau Morgen noch mal ... isch bin jetscht ein bischschen angetrunken 8)
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

Re: Size Grip - ohne Statusbar

  Alt 31. Okt 2005, 14:31
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.
Angehängte Dateien
Dateityp: pas sizegriphwnd_673.pas (3,1 KB, 45x aufgerufen)
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#20

Re: Size Grip - ohne Statusbar

  Alt 31. Okt 2005, 20:53
vielen dank für deine mühen!

jetzt gehts
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz