Einzelnen Beitrag anzeigen

sebastianz1983

Registriert seit: 26. Jan 2010
Ort: Regensburg
14 Beiträge
 
#7

Re: Größenverhältnis der Form bei Größenänderung beibehalten

  Alt 26. Jan 2010, 15:00
Hi zusammen,

auch wenn der letzte Beitrag hier schon recht lange her ist, hab ich trotzdem 'ne Frage zu diesem Thema.
Der Code von SirThornberry funktioniert bei mir soweit einwandfrei. Wenn ich das ganze allerdings in eine DLL auslagern und über eine Hookfunktion realisieren möchte, geht das leider nicht. Und ich komm einfach nicht drauf, woran das liegen könnte.
Hier mal mein Code:

Delphi-Quellcode:
unit WinSizeHook;

interface

procedure StartProportionalSizing; stdcall; forward;
procedure StopProportionalSizing; stdcall; forward;

implementation
uses Windows, Forms, Dialogs, Messages, SysUtils, Math, Classes, Controls;

var
  glbSizeHook: cardinal = 0;
  glbRatio: single;


function Hook(code: Integer; W: wParam; L: lParam): LResult; stdcall;
type
  pCWPStruct = ^CWPSTRUCT;

var
  currentCWP: CWPSTRUCT;
  windowRect: TRect;
  PWindowRect: PRect;
  newSize: integer;

begin
  try
    if code >= HC_ACTION then begin
      currentCWP := pCWPStruct(L)^;

      case currentCWP.message of
        WM_ENTERSIZEMOVE: begin
          if GetWindowRect(currentCWP.hwnd, windowRect) then
            glbRatio := (windowRect.Right - windowRect.Left) / (windowRect.Bottom - windowRect.Top);
        end;

        WM_SIZING: begin
          PWindowRect := PRect(currentCWP.LParam);
          case currentCWP.WParam of
            WMSZ_BOTTOM, WMSZ_TOP,
            WMSZ_TOPLEFT, WMSZ_TOPRIGHT, WMSZ_BOTTOMLEFT, WMSZ_BOTTOMRIGHT: begin
              newSize := trunc(SimpleRoundTo((PWindowRect.Bottom - PWindowRect.Top + 1) * glbRatio, 0));
              PWindowRect.Right := PWindowRect.Left + newSize;
            end;

            WMSZ_LEFT, WMSZ_RIGHT: begin
              newSize := trunc(SimpleRoundTo((PWindowRect.Right - PWindowRect.Left + 1) / glbRatio, 0));
              PWindowRect.Bottom := PWindowRect.Top + newSize;
            end;
          end;
        end;
      end;
    end;
  except
  end;

  result := CallNextHookEx(glbSizeHook, code, w, l);
end;


procedure StartProportionalSizing;
begin
  if glbSizeHook = 0 then
    glbSizeHook := SetWindowsHookEx(WH_CALLWNDPROC, @Hook, 0, GetCurrentThreadID());
end;


procedure StopProportionalSizing();
begin
  if glbSizeHook <> 0 then
    UnhookWindowsHookEx(glbSizeHook);
end;
end.
(Kann sein, dass der Code nicht auf Anhieb funktioniert, hab meine ganzen Versuche, Debuginfos und zusätzlichen Code entfernt, bevor ich ihn hier reingestellt hab.)
Beim Debuggen werden mir die korrekten Werte für "newSize" zurückgeliefert und auch in die jeweiligen Werte in PWindowRect geschrieben, jedoch kann ich das Fenster immernoch nach Belieben in der Größe verändern, ohne dass die Proportionen eingehalten werden. Daher ist meine Vermutung, dass (im Gegensatz zu SirThornberrys Lösung via normalem Event Handler) im Hook in lParam nicht auf die tatsächlichen Werte verwiesen wird, sondern nur auf eine Kopie derselbigen.
Kann mir das einer bestätigen? Und kennt jemand eine Lösung zu diesem Problem?

Danke schonmal!
  Mit Zitat antworten Zitat