diff options
author | Graeme Geldenhuys <graemeg@gmail.com> | 2011-01-10 23:44:33 +0200 |
---|---|---|
committer | Graeme Geldenhuys <graeme@mastermaths.co.za> | 2011-01-11 09:45:29 +0200 |
commit | 9a622052b07b1605fe4cf4465404df11f0fd12da (patch) | |
tree | 91c246ed6dcebeab0ed90d3576af08f97042409e /src | |
parent | 912541f487ef8356352a452c005097623df0cf00 (diff) | |
download | fpGUI-9a622052b07b1605fe4cf4465404df11f0fd12da.tar.xz |
fixes Alignment and Anchor calculation even before we have a window handle
Updated the following methods by rather checking the ComponentState,
than the HasHandle result. Why? Because we want alignment and anchor
calculations to work, even before we have a window handle. Something
that happens often when using a Frame-type design for the UI.
* HandleMove()
* HandleResize()
* UpdateWindowPosition()
Due to removing the HasHandle check in UpdateWindowPosition, we had
to do the HasHandle check in each backend code instead. We don't want
to trigger API calls when we don't have a window handle yet.
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/fpg_base.pas | 19 | ||||
-rw-r--r-- | src/corelib/fpg_widget.pas | 6 | ||||
-rw-r--r-- | src/corelib/gdi/fpg_gdi.pas | 19 | ||||
-rw-r--r-- | src/corelib/x11/fpg_x11.pas | 20 |
4 files changed, 30 insertions, 34 deletions
diff --git a/src/corelib/fpg_base.pas b/src/corelib/fpg_base.pas index 214744e9..2fb97580 100644 --- a/src/corelib/fpg_base.pas +++ b/src/corelib/fpg_base.pas @@ -1211,9 +1211,7 @@ procedure TfpgWindowBase.HandleMove(x, y: TfpgCoord); begin if FTop <> y then begin - // if we don't have a handle we are still setting up, so actual value and - // previous value must be the same. - if HasHandle then + if not (csLoading in ComponentState) then FPrevTop := FTop else FPrevTop := y; @@ -1223,9 +1221,7 @@ begin if FLeft <> x then begin - // if we don't have a handle we are still setting up, so actual value and - // previous value must be the same. - if HasHandle then + if not (csLoading in ComponentState) then FPrevLeft := FHeight else FPrevLeft := x; @@ -1238,9 +1234,7 @@ procedure TfpgWindowBase.HandleResize(AWidth, AHeight: TfpgCoord); begin if FWidth <> AWidth then begin - // if we don't have a handle we are still setting up, so actual value and - // previous value must be the same. - if HasHandle then + if not (csLoading in ComponentState) then FPrevWidth := FWidth else FPrevWidth := AWidth; @@ -1250,9 +1244,7 @@ begin if FHeight <> AHeight then begin - // if we don't have a handle we are still setting up, so actual value and - // previous value must be the same. - if HasHandle then + if not (csLoading in ComponentState) then FPrevHeight := FHeight else FPrevHeight := AHeight; @@ -1305,8 +1297,7 @@ end; procedure TfpgWindowBase.UpdateWindowPosition; begin - if HasHandle then - DoUpdateWindowPosition; + DoUpdateWindowPosition; end; procedure TfpgWindowBase.MoveWindow(const x: TfpgCoord; const y: TfpgCoord); diff --git a/src/corelib/fpg_widget.pas b/src/corelib/fpg_widget.pas index e13806be..7c728380 100644 --- a/src/corelib/fpg_widget.pas +++ b/src/corelib/fpg_widget.pas @@ -371,14 +371,14 @@ begin {$IFDEF CStackDebug} itf := DebugMethodEnter('TfpgWidget.DoUpdateWindowPosition - ' + ClassName + ' ('+Name+')'); {$ENDIF} -// writeln('DoUpdateWindowPosition - ', Classname); +// writeln('TfpgWidget.DoUpdateWindowPosition - ' + Classname + ' ('+Name+')'); dw := FWidth - FPrevWidth; dh := FHeight - FPrevHeight; if IsContainer and FSizeIsDirty then begin {$IFDEF CStackDebug} - DebugLn(Format('w: %d h: %d', [dw, dh])); + DebugLn(Format(' Alignment deltas w: %d h: %d', [dw, dh])); {$ENDIF} HandleAlignments(dw, dh); end; @@ -1334,7 +1334,7 @@ begin itf := DebugMethodEnter('TfpgWidget.MoveAndResize'); DebugLn(Format('Class:%s t:%d l:%d w:%d h:%d', [Classname, ATop, ALeft, AWidth, aHeight])); {$ENDIF} - if not (csLoading in ComponentState) {HasHandle} then + if not (csLoading in ComponentState) then begin if (ALeft <> FLeft) or (ATop <> FTop) then HandleMove(ALeft, ATop); diff --git a/src/corelib/gdi/fpg_gdi.pas b/src/corelib/gdi/fpg_gdi.pas index 6d1ff0c7..9eb9f952 100644 --- a/src/corelib/gdi/fpg_gdi.pas +++ b/src/corelib/gdi/fpg_gdi.pas @@ -1976,14 +1976,17 @@ procedure TfpgGDIWindow.DoUpdateWindowPosition; var bx, by: integer; begin - FSkipResizeMessage := True; - GetWindowBorderDimensions(Self, bx, by); - Windows.SetWindowPos( - WinHandle, HWND_TOP, - FLeft, FTop, FWidth + bx, FHeight + by, - SWP_NOZORDER);// or SWP_NOREDRAW); - Windows.InvalidateRect(WinHandle, nil, True); - FSkipResizeMessage := False; + if HasHandle then + begin + FSkipResizeMessage := True; + GetWindowBorderDimensions(Self, bx, by); + Windows.SetWindowPos( + WinHandle, HWND_TOP, + FLeft, FTop, FWidth + bx, FHeight + by, + SWP_NOZORDER);// or SWP_NOREDRAW); + Windows.InvalidateRect(WinHandle, nil, True); + FSkipResizeMessage := False; + end; end; { TfpgGDICanvas } diff --git a/src/corelib/x11/fpg_x11.pas b/src/corelib/x11/fpg_x11.pas index 8ae27ec1..ab41dc6b 100644 --- a/src/corelib/x11/fpg_x11.pas +++ b/src/corelib/x11/fpg_x11.pas @@ -2348,17 +2348,19 @@ var w: longword; h: longword; begin - if FWidth > 1 then - w := FWidth - else - w := 1; - if FHeight > 1 then - h := FHeight - else - h := 1; + if HasHandle then + begin + if FWidth > 1 then + w := FWidth + else + w := 1; + if FHeight > 1 then + h := FHeight + else + h := 1; - if FWinHandle > 0 then XMoveResizeWindow(xapplication.display, FWinHandle, FLeft, FTop, w, h); + end; end; procedure TfpgX11Window.DoSetMouseCursor; |