From 5daf16f5cd5fb72edf5b94c67f1bb0f9e2921f35 Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 10 Jan 2004 18:00:42 +0000 Subject: [PATCH] fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow git-svn-id: trunk@5043 - --- designer/designerprocs.pas | 13 +++-- lcl/extctrls.pp | 4 +- lcl/include/control.inc | 5 +- lcl/include/intfbaselcl.inc | 11 ++++ lcl/include/lclintf.inc | 10 ++++ lcl/include/lclintfh.inc | 8 ++- lcl/interfaces/gtk/gtkwinapi.inc | 94 +++++++++++++++++++------------ lcl/interfaces/gtk/gtkwinapih.inc | 6 +- 8 files changed, 106 insertions(+), 45 deletions(-) diff --git a/designer/designerprocs.pas b/designer/designerprocs.pas index 79cc2ecb52..772f0afced 100644 --- a/designer/designerprocs.pas +++ b/designer/designerprocs.pas @@ -288,9 +288,15 @@ end; function TDesignerDeviceContext.GetDCOrigin: TPoint; // returns the DC origin in screen coordinates +var + CurFormClientOrigin: TPoint; + CurFormOrigin: TPoint; begin if not (ddcDCOriginValid in FFlags) then begin - GetWindowOrgEx(FDC,@FDCOrigin); + CurFormClientOrigin:=FormClientOrigin; + CurFormOrigin:=FormOrigin; + FDCOrigin.X:=CurFormOrigin.X-CurFormClientOrigin.X; + FDCOrigin.Y:=CurFormOrigin.Y-CurFormClientOrigin.Y; Include(FFlags,ddcDCOriginValid); end; Result:=FDCOrigin; @@ -323,10 +329,7 @@ var FormClientOrig, DCOrig: TPoint; begin if not (ddcFormOriginValid in FFlags) then begin - FormClientOrig:=FormClientOrigin; - DCOrig:=DCOrigin; - FFormOrigin.X:=DCOrig.X-FormClientOrig.X; - FFormOrigin.Y:=DCOrig.Y-FormClientOrig.Y; + GetDCOriginRelativeToWindow(FDC,FForm.Handle,FFormOrigin); Include(FFlags,ddcFormOriginValid); end; Result:=FFormOrigin; diff --git a/lcl/extctrls.pp b/lcl/extctrls.pp index a6665c9f79..0bc12e0b10 100644 --- a/lcl/extctrls.pp +++ b/lcl/extctrls.pp @@ -732,7 +732,6 @@ type procedure SetBevelWidth(const Value: TBevelWidth); procedure SetBorderWidth(const Value: TBorderWidth); procedure SetBorderStyle(const Value: TControlBorderStyle); - //procedure WMWindowPosChanged(var Message: TLMWindowPosChanged); message LM_WINDOWPOSCHANGED; protected procedure AdjustClientRect(var Rect: TRect); override; function GetText: TCaption; override; @@ -837,6 +836,9 @@ end. { $Log$ + Revision 1.88 2004/01/10 18:00:42 mattias + fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow + Revision 1.87 2004/01/03 23:14:59 mattias default font can now change height and fixed gtk crash diff --git a/lcl/include/control.inc b/lcl/include/control.inc index 15d8384870..04e2ebbf22 100644 --- a/lcl/include/control.inc +++ b/lcl/include/control.inc @@ -2479,7 +2479,7 @@ begin then raise EInvalidOperation.CreateFmt('Control ''%s'' has no parent window', [Name]); Result := Parent.GetDeviceContext(WindowHandle); - SetWindowOrgEx(Result, Left, Top, nil); + MoveWindowOrgEx(Result, Left, Top); IntersectClipRect(Result, 0, 0, Width, Height); end; @@ -2613,6 +2613,9 @@ end; { ============================================================================= $Log$ + Revision 1.164 2004/01/10 18:00:42 mattias + fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow + Revision 1.163 2004/01/06 17:58:06 mattias fixed setting TRadioButton.Caption for gtk diff --git a/lcl/include/intfbaselcl.inc b/lcl/include/intfbaselcl.inc index 44e3cad220..b6e958b2c8 100644 --- a/lcl/include/intfbaselcl.inc +++ b/lcl/include/intfbaselcl.inc @@ -154,6 +154,14 @@ begin Result := false; end; +function TInterfaceBase.GetDCOriginRelativeToWindow(PaintDC: HDC; + WindowHandle: HWND; var OriginDiff: TPoint): boolean; +begin + OriginDiff.X:=0; + OriginDiff.Y:=0; + Result:=true; +end; + function TInterfaceBase.GetDesignerDC(WindowHandle: HWND): HDC; begin Result:=GetDC(WindowHandle); @@ -494,6 +502,9 @@ end; { ============================================================================= $Log$ + Revision 1.9 2004/01/10 18:00:42 mattias + fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow + Revision 1.8 2004/01/09 20:03:13 mattias implemented new statusbar methods in gtk intf diff --git a/lcl/include/lclintf.inc b/lcl/include/lclintf.inc index c07125e7d2..44de48b227 100644 --- a/lcl/include/lclintf.inc +++ b/lcl/include/lclintf.inc @@ -156,6 +156,13 @@ begin Result := InterfaceObject.GetCmdLineParamDescForInterface; end; +function GetDCOriginRelativeToWindow(PaintDC: HDC; WindowHandle: HWND; + var OriginDiff: TPoint): boolean; +begin + Result := InterfaceObject.GetDCOriginRelativeToWindow(PaintDC,WindowHandle, + OriginDiff); +end; + function GetDesignerDC(WindowHandle: HWND): HDC; begin Result := InterfaceObject.GetDesignerDC(WindowHandle); @@ -478,6 +485,9 @@ end; { ============================================================================= $Log$ + Revision 1.8 2004/01/10 18:00:42 mattias + fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow + Revision 1.7 2004/01/09 20:03:13 mattias implemented new statusbar methods in gtk intf diff --git a/lcl/include/lclintfh.inc b/lcl/include/lclintfh.inc index 94981000d8..cd21bb6d66 100644 --- a/lcl/include/lclintfh.inc +++ b/lcl/include/lclintfh.inc @@ -60,6 +60,7 @@ function GetBitmapRawImageDescription(Bitmap: HBITMAP; Desc: PRawImageDescriptio function GetCaretRespondToFocus(handle: HWND; var ShowHideOnFocus: boolean): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function GetClientBounds(handle : HWND; var ARect: TRect) : Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function GetCmdLineParamDescForInterface: string; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} +function GetDCOriginRelativeToWindow(PaintDC: HDC; WindowHandle: HWND; var OriginDiff: TPoint): boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function GetDesignerDC(WindowHandle: HWND): HDC; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function GetDeviceRawImageDescription(DC: HDC; Desc: PRawImageDescription): boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function GetDeviceSize(DC: HDC; var p: TPoint): boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} @@ -80,8 +81,8 @@ function InvalidateFrame(aHandle : HWND; ARect : pRect; bErase : Boolean; Border function LoadStockPixmap(StockID: longint) : HBitmap; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} -function LclCheckMenuItem(AMenuItem: TComponent): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} -function LclEnableMenuItem(AMenuItem: TComponent): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} +function LClCheckMenuItem(AMenuItem: TComponent): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} +function LClEnableMenuItem(AMenuItem: TComponent): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function MoveWindowOrgEx(dc : hdc; dX,dY : Integer): boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} @@ -147,6 +148,9 @@ procedure RaiseLastOSError; { ============================================================================= $Log$ + Revision 1.8 2004/01/10 18:00:42 mattias + fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow + Revision 1.7 2004/01/09 20:03:13 mattias implemented new statusbar methods in gtk intf diff --git a/lcl/interfaces/gtk/gtkwinapi.inc b/lcl/interfaces/gtk/gtkwinapi.inc index 1df6d002f5..6b32946950 100644 --- a/lcl/interfaces/gtk/gtkwinapi.inc +++ b/lcl/interfaces/gtk/gtkwinapi.inc @@ -4157,6 +4157,57 @@ begin end; end; +{------------------------------------------------------------------------------ + function TgtkObject.GetDCOriginRelativeToWindow(PaintDC: HDC; + WindowHandle: HWND; var OriginDiff: TPoint): boolean; + + Returns the origin of PaintDC relative to the window handle. + Example: + A PaintDC of a TButton at 20,10 with a DC Offset of 0,0 on a form and the + WindowHandle is the form. + Then OriginDiff will be the the difference between the Forms client origin + and the PaintDC will be 20,10. + ------------------------------------------------------------------------------} +function TgtkObject.GetDCOriginRelativeToWindow(PaintDC: HDC; + WindowHandle: HWND; var OriginDiff: TPoint): boolean; + + procedure InvalidDrawable; + begin + {$IFDEF RaiseExceptionOnNilPointers} + RaiseException('TGTKObject.GetDCOriginRelativeToWindow Window=nil'); + {$ENDIF} + writeln('TgtkObject.GetDCOriginRelativeToWindow:', + ' WARNING: PaintDC ',HexStr(Cardinal(PaintDC),8),' without gdkwindow.', + ' Widget=',HexStr(Cardinal(TDeviceContext(PaintDC).wnd),8)); + end; + +var + DCOrigin: TPoint; + DCScreenOrigin: TPoint; + WindowScreenOrigin: TPoint; + Widget: PGtkWidget; +begin + Result := false; + OriginDiff := Point(0,0); + If not IsValidDC(PaintDC) then exit; + with TDeviceContext(PaintDC) do begin + DCOrigin:=GetDCOffset(TDeviceContext(PaintDC)); + if Drawable=nil then + InvalidDrawable; + gdk_window_get_origin(PGdkWindow(Drawable), + @(DCScreenOrigin.X), @(DCScreenOrigin.Y)); + inc(DCScreenOrigin.X,DCOrigin.X); + inc(DCScreenOrigin.Y,DCOrigin.Y); + Widget:=GetFixedWidget(PGtkWidget(WindowHandle)); + if Widget=nil then Widget:=PGtkWidget(WindowHandle); + gdk_window_get_origin(PGdkWindow(Widget^.window), + @(WindowScreenOrigin.X), @(WindowScreenOrigin.Y)); + OriginDiff.X:=DCScreenOrigin.X-WindowScreenOrigin.X; + OriginDiff.Y:=DCScreenOrigin.Y-WindowScreenOrigin.Y; + Result := true; + end; +end; + {------------------------------------------------------------------------------ Function: GetDesignerDC Params: none @@ -5352,49 +5403,20 @@ end; Params: none Returns: Nothing - Returns the x- and y-coordinates of the window origin for the - specified device context. + Returns the current offset of the DC. ------------------------------------------------------------------------------} function TgtkObject.GetWindowOrgEx(dc : hdc; P : PPoint): Integer; - - procedure InvalidDrawable; - begin - {$IFDEF RaiseExceptionOnNilPointers} - RaiseException('TGTKObject.GetWindowOrgEx Window=nil'); - {$ENDIF} - writeln('TgtkObject.GetWindowOrgEx:', - ' WARNING: DC ',HexStr(Cardinal(DC),8),' without gdkwindow.', - ' Widget=',HexStr(Cardinal(TDeviceContext(DC).wnd),8)); - end; - -var - DCOrigin: TPoint; begin -// gdk_window_get_deskrelative_origin(pgtkwidget(TDeviceContext(DC).hwnd)^.window, @P.X, @P.Y); -//write('[TgtkObject.GetWindowOrgEx] ',p.x,' ',p.y); -// gdk_window_get_root_origin(pgtkwidget(TDeviceContext(DC).hwnd)^.window, @P.X, @P.Y); -//write(' / ',p.x,' ',p.y); Result := 0; if P=nil then exit; P^ := Point(0,0); - If IsValidDC(DC) then + If not IsValidDC(DC) then exit; with TDeviceContext(DC) do begin - DCOrigin:=GetDCOffset(TDeviceContext(DC)); - if Drawable<>nil then begin - BeginGDKErrorTrap; - gdk_window_get_origin(PGdkWindow(Drawable), @(P^.X), @(P^.Y)); - EndGDKErrorTrap; - inc(P^.X,DCOrigin.X); - inc(P^.Y,DCOrigin.Y); - Result := 1; - end else begin - InvalidDrawable; - end; + P^:=GetDCOffset(TDeviceContext(DC)); + Result:=1; end; -//writeln(' / ',p.x,' ',p.y); end; - {------------------------------------------------------------------------------ Function: GetWindowRect Params: none @@ -8009,8 +8031,7 @@ end; Function TgtkObject.SetWindowOrgEx(DC : HDC; NewX, NewY : Integer; OldPoint: PPoint) : Boolean; - Sets the x-coordinates and y-coordinates of the window origin for the - specified device context. + Sets the DC offset for the specified device context. ------------------------------------------------------------------------------} Function TgtkObject.SetWindowOrgEx(DC : HDC; NewX, NewY : Integer; OldPoint: PPoint) : Boolean; @@ -9100,6 +9121,9 @@ end; { ============================================================================= $Log$ + Revision 1.313 2004/01/10 18:00:42 mattias + fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow + Revision 1.312 2004/01/10 00:46:46 mattias fixed DestroyComponent diff --git a/lcl/interfaces/gtk/gtkwinapih.inc b/lcl/interfaces/gtk/gtkwinapih.inc index 25c335e67b..3f6e979db1 100644 --- a/lcl/interfaces/gtk/gtkwinapih.inc +++ b/lcl/interfaces/gtk/gtkwinapih.inc @@ -97,10 +97,11 @@ Function GetClipRGN(DC : hDC; RGN : hRGN) : Longint; override; Function GetCmdLineParamDescForInterface: string; override; function GetCursorPos(var lpPoint: TPoint): Boolean; override; function GetDC(hWnd: HWND): HDC; override; +function GetDCOriginRelativeToWindow(PaintDC: HDC; WindowHandle: HWND; var OriginDiff: TPoint): boolean; override; +function GetDesignerDC(WindowHandle: HWND): HDC; override; function GetDeviceCaps(DC: HDC; Index: Integer): Integer; Override; function GetDeviceRawImageDescription(DC: HDC; Desc: PRawImageDescription): boolean; override; function GetDeviceSize(DC: HDC; var p: TPoint): boolean; override; -function GetDesignerDC(WindowHandle: HWND): HDC; override; function GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: BitmapInfo; Usage: UINT): Integer; Override; function GetFocus: HWND; override; function GetFontLanguageInfo(DC: HDC): DWord; override; @@ -213,6 +214,9 @@ Function WindowFromPoint(Point : TPoint) : HWND; override; { ============================================================================= $Log$ + Revision 1.83 2004/01/10 18:00:42 mattias + fixed GetWindowOrgEx, added GetDCOriginRelativeToWindow + Revision 1.82 2003/12/30 21:05:13 micha fix gtk interface due to lcl interface change (from vincent