home *** CD-ROM | disk | FTP | other *** search
- {================================================================================
- Copyright (C) 1997-2001 Mills Enterprise
-
- Unit : rmToolWin
- Purpose : This is a alternate form for all forms that use the bsSizableToolWin
- borderstyle. This window does not suffer from the M$ ALT-Tab bug.
- Date : 04-29-2001
- Author : Ryan J. Mills
- Version : 1.80
- ================================================================================}
-
- unit rmToolWin;
-
- interface
-
- {$I CompilerDefines.INC}
-
- uses windows, messages, classes, forms, Graphics;
-
- type
- TMoveSize = (msEntered, msMoving, msSizing, msExited) ;
-
- TWMSizing = packed record
- Msg: Cardinal;
- SizingSide: Longint;
- WindowRect: PRect;
- Result: Longint;
- end;
- TWMMoving = TWMSizing;
-
- TrmCustomToolWinForm = class(TCustomForm)
- private
- { Private }
- fInNCPaint: boolean;
- fActive: boolean;
- fMoveSize: TMoveSize;
- fFrameRect, fLastFrameRect, FPosRect: TRect;
- fCloseBtnDown, fCloseBtnPressed: boolean;
- fOnMove: TNotifyEvent;
- fWindowBMP: TBitmap;
- fStandardMoving: boolean;
-
- function AdjustFormFrameRect(wRect: TRect) : TRect;
- procedure wmEnterSizeMove(var msg: TMessage) ; message WM_ENTERSIZEMOVE;
- procedure wmExitSizeMove(var msg: TMessage) ; message WM_EXITSIZEMOVE;
- procedure wmMoving(var msg: TWMMoving) ; message WM_MOVING;
- procedure wmSizing(var msg: TWMSizing) ; message WM_SIZING;
- procedure wmMove(Var msg: TWMMove) ; message wm_move;
- procedure wmWindowPosChanging(var msg: TWMWindowPosChanging) ; message WM_WINDOWPOSCHANGING;
- procedure WMNCActivate(var Message: TWMNCActivate) ; message WM_NCActivate;
- procedure WMNCCalcSize(var Message: TWMNCCalcSize) ; message WM_NCCALCSIZE;
- procedure WMNCHitTest(var Message: TWMNCHitTest) ; message WM_NCHITTEST;
- procedure WMNCPaint(var Message: TMessage) ; message WM_NCPAINT;
- procedure WMNCLButtonDown(var Message: TWMNCLButtonDown) ; message WM_NCLBUTTONDOWN;
- procedure WMNCLButtonUp(var Message: TWMNCLButtonUp) ; message WM_NCLBUTTONUP;
- procedure WMNCMouseMove(var Message: TWMNCMouseMove) ; message WM_NCMOUSEMOVE;
- procedure WMLButtonUp(var Message: TWMLButtonUp) ; message WM_LBUTTONUP;
- procedure WMMouseMove(var Message: TWMMouseMove) ; message WM_MOUSEMOVE;
- procedure WMKillFocus(var msg: TWMKillFocus) ; message WM_KillFocus;
- procedure SetInternalFrameRect(const Value: TRect) ;
- procedure setncactive(const Value: boolean);
- protected
- { Protected }
- function FormCaptionRect(Screen: boolean) : TRect;
- function FormCaptionTextRect(Screen: boolean) : TRect;
- function FormBtnRect(Screen: boolean) : TRect;
- function FormFrameRect(Screen: boolean) : TRect;
- function FormClientRect(screen: boolean) : TRect;
- property InternalFrameRect: TRect read fFrameRect write SetInternalFrameRect;
- property OnMove: TNotifyEvent read fonMove write fOnMove;
- property StandardMoving: boolean read fStandardMoving write fStandardMoving default true;
- property MoveSize : TMoveSize read fMoveSize;
- property NCActive : boolean read factive write setncactive;
- public
- { Public }
- constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0) ; override;
- destructor destroy; override;
- end;
-
- TrmToolWinForm = class(TrmCustomToolWinForm)
- published
- { Published }
- property Action;
- property ActiveControl;
- property Align;
- property BiDiMode;
- property BorderWidth;
- property Caption;
- property ClientHeight;
- property ClientWidth;
- property Color;
- property Ctl3D;
- property DefaultMonitor;
- property Enabled;
- property ParentFont default False;
- property Font;
- property Height;
- property HelpFile;
- property KeyPreview;
- property Menu;
- property OldCreateOrder;
- property ParentBiDiMode;
- property PixelsPerInch;
- property PopupMenu;
- property Position;
- property PrintScale;
- property Scaled;
- property ShowHint;
- property Visible;
- property Width;
- property OnActivate;
- property OnCanResize;
- property OnClick;
- property OnClose;
- property OnCloseQuery;
- property OnContextPopup;
- property OnCreate;
- property OnDblClick;
- property OnDestroy;
- property OnDeactivate;
- property OnDragDrop;
- property OnDragOver;
- property OnHide;
- property OnHelp;
- property OnKeyDown;
- property OnKeyPress;
- property OnKeyUp;
- property OnMouseDown;
- property OnMouseMove;
- property OnMouseUp;
- property OnMouseWheel;
- property OnMouseWheelDown;
- property OnMouseWheelUp;
- property OnMove;
- property OnPaint;
- property OnResize;
- property OnShortCut;
- property OnShow;
- end;
-
- function WindowCaptionHeight: integer;
- function WindowButtonHeight: integer;
- function WindowButtonWidth: integer;
- function WindowBorderWidth: integer;
- function WindowBorderHeight: integer;
- function WindowUseGradientCaption: Boolean;
- function WindowCaptionFontName: string;
- function WindowCaptionFontSize: integer;
- function WindowCaptionFontStyle: TFontStyles;
-
-
- implementation
-
- uses rmLibrary, ExtCtrls;
-
- const
- PenSize = 3;
-
- var
- NewBrush: TBrush;
-
- function WindowCaptionHeight: integer;
- begin
- result := GetSystemMetrics(SM_CYSMCAPTION) ; //Small Caption Height
- end;
-
- function WindowButtonHeight: integer;
- begin
- result := WindowCaptionHeight - 5;
- end;
-
- function WindowButtonWidth: integer;
- begin
- result := WindowButtonHeight + 2;
- end;
-
- function WindowBorderWidth: integer;
- begin
- result := GetSystemMetrics(SM_CXSIZEFRAME); //Sizeable Frame Width
- end;
-
- function WindowBorderHeight: integer;
- begin
- result := GetSystemMetrics(SM_CYSIZEFRAME); //Sizeable Frame Height
- end;
-
- function WindowUseGradientCaption: Boolean;
- begin
- SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, @Result, 0) ;
- end;
-
- function WindowCaptionFontName: string;
- var
- wMetrics: TNONCLIENTMETRICS;
- begin
- wMetrics.cbSize := sizeof(TNONCLIENTMETRICS) ;
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(TNONCLIENTMETRICS) , @wMetrics, 0) ;
- result := wMetrics.lfSmCaptionFont.lfFaceName;
- end;
-
- function WindowCaptionFontSize: integer;
- var
- wMetrics: TNONCLIENTMETRICS;
- begin
- wMetrics.cbSize := sizeof(TNONCLIENTMETRICS) ;
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(TNONCLIENTMETRICS) , @wMetrics, 0) ;
- result := wMetrics.lfSmCaptionFont.lfHeight;
- end;
-
- function WindowCaptionFontStyle: TFontStyles;
- var
- wMetrics: TNONCLIENTMETRICS;
- begin
- wMetrics.cbSize := sizeof(TNONCLIENTMETRICS) ;
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(TNONCLIENTMETRICS) , @wMetrics, 0) ;
-
- result := [];
-
- if wMetrics.lfSmCaptionFont.lfWeight = fw_bold then
- result := result + [fsbold];
-
- if wMetrics.lfSmCaptionFont.lfItalic > 0 then
- result := result + [fsItalic];
-
- if wMetrics.lfSmCaptionFont.lfUnderline > 0 then
- result := result + [fsUnderLine];
-
- if wMetrics.lfSmCaptionFont.lfStrikeOut > 0 then
- result := result + [fsStrikeOut];
- end;
-
- procedure DrawFrameRect(FrameRect: TRect) ;
- var
- DC: hDC; { device context for the window }
- DesktopWindow: THandle;
- OldHBrush: HBrush;
- begin
- DesktopWindow := GetDesktopWindow;
- DC := GetDCEx(DesktopWindow, 0, DCX_CACHE or DCX_LOCKWINDOWUPDATE) ;
- try
- if NewBrush = nil then
- begin
- NewBrush := TBrush.Create;
- NewBrush.Bitmap := AllocPatternBitmap(clBlack, clWhite) ;
- end;
- OldHBrush := SelectObject(DC, NewBrush.Handle) ;
-
- with FrameRect do
- begin
- PatBlt(DC, Left + PenSize, Top, Right - Left - PenSize, PenSize, PATINVERT) ;
- PatBlt(DC, Right - PenSize, Top + PenSize, PenSize, Bottom - Top - PenSize, PATINVERT) ;
- PatBlt(DC, Left, Bottom - PenSize, Right - Left - PenSize, PenSize, PATINVERT) ;
- PatBlt(DC, Left, Top, PenSize, Bottom - Top - PenSize, PATINVERT) ;
- end;
-
- SelectObject(DC, OldHBrush) ;
- finally
- ReleaseDC(DesktopWindow, DC) ;
- end;
- end;
-
- { TrmToolWinForm }
-
- constructor TrmCustomToolWinForm.CreateNew(AOwner: TComponent; Dummy: Integer) ;
- begin
- inherited CreateNew(AOwner, Dummy) ;
- if csDesigning in componentstate then exit;
- fStandardMoving := true;
- fWindowBMP := tbitmap.create;
- AutoScroll := false;
- VertScrollBar.Visible := false;
- HorzScrollBar.Visible := false;
- fActive := false;
- fInNCPaint := false;
- KeyPreview := true;
- BorderStyle := bsNone;
- fCloseBtnDown := false;
- fCloseBtnPressed := false;
- end;
-
- procedure TrmCustomToolWinForm.wmEnterSizeMove(var msg: tmessage) ;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- inherited;
- FPosRect := BoundsRect;
- fMoveSize := msEntered;
- end;
-
- procedure TrmCustomToolWinForm.wmExitSizeMove(var msg: tmessage) ;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- if (fMoveSize = msMoving) then
- begin
- fMoveSize := msExited;
- if not (fStandardMoving) then
- begin
- DrawFrameRect(fLastFrameRect) ;
- SetBounds(fLastFrameRect.left, fLastFrameRect.top, width, height) ;
- msg.Result := integer(true) ;
- fLastFrameRect := Rect(0, 0, 0, 0) ;
- end
- else
- inherited;
- end
- else
- begin
- fMoveSize := msExited;
- inherited;
- end;
-
- Invalidate;
- end;
-
- procedure TrmCustomToolWinForm.wmMoving(var msg: TWMMoving) ;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- inherited;
-
- if fMoveSize = msEntered then
- fMoveSize := msMoving;
-
- if (fMoveSize = msMoving) then
- begin
- if not (fStandardMoving) then
- begin
- if not IsRectEmpty(fLastFrameRect) then
- DrawFrameRect(fLastFrameRect) ;
-
- fFrameRect := msg.WindowRect^;
-
- try
- DrawFrameRect(fFrameRect) ;
- finally
- fLastFrameRect := fFrameRect;
- end;
- end
- else
- fLastFrameRect := rect(0, 0, 0, 0) ;
- end;
- end;
-
- procedure TrmCustomToolWinForm.wmSizing(var msg: TWMSizing) ;
- var
- xofs, yofs: integer;
- wRect: TRect;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- inherited;
-
- if fMoveSize = msEntered then
- fMoveSize := msSizing;
-
- if (fMoveSize = msSizing) then
- begin
- wRect := msg.WindowRect^;
-
- if not (((wRect.left <> 0) and (wRect.top <> 0) ) and
- (((wrect.top <> top) and (wRect.bottom = height) ) or
- ((wrect.Left <> Left) and (wRect.right = width) ) ) ) then
- begin
- xofs := wRect.Left;
- yofs := wRect.Top;
- offsetrect(wRect, -xofs, -yofs) ;
- try
- wRect := AdjustFormFrameRect(wRect) ;
- finally
- offsetrect(wRect, xofs, yofs) ;
- end;
- end
- else
- begin
- wRect := rect(left, top, width, height) ;
- end;
- InternalFrameRect := wRect;
- end;
- end;
-
- procedure TrmCustomToolWinForm.wmWindowPosChanging(var msg: TWMWindowPosChanging) ;
- var
- wRect: trect;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- if fMoveSize = msMoving then
- begin
- if fStandardMoving then
- inherited
- else
- begin
- msg.WindowPos.x := left;
- msg.WindowPos.y := top;
- Msg.Result := 0
- end;
- end
- else if (fMoveSize = msSizing) then
- begin
- inherited;
-
- wrect := AdjustFormFrameRect(rect(msg.windowpos.x, msg.windowpos.y, msg.windowpos.cx, msg.windowpos.cy) ) ;
-
- msg.windowpos.x := wrect.left;
- msg.windowpos.y := wrect.top;
- msg.windowpos.cx := wrect.right;
- msg.windowpos.cy := wrect.bottom;
- end;
- end;
-
- procedure TrmCustomToolWinForm.WMNCCalcSize(var Message: TWMNCCalcSize) ;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- //Adjust the size of the clientwidth rect for the drawing of the
- //Borders
- inherited;
-
- with Message.CalcSize_Params^ do
- begin
- InflateRect(rgrc[0], -WindowBorderWidth, -WindowBorderHeight);
- rgrc[0].top := rgrc[0].top + WindowCaptionHeight;
- end;
- end;
-
- procedure TrmCustomToolWinForm.WMNCHitTest(var Message: TWMNCHitTest) ;
- var
- wpt: TPoint;
- wRect: TRect;
-
- BorderWidth, BorderHeight: integer;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- inherited;
-
- //Figure out where the hell the mouse is in relation to
- //what's on the window....
-
- BorderWidth := WindowBorderWidth;
- BorderHeight := WindowBorderHeight;
-
- wpt := Point(Message.XPos, Message.YPos) ;
- wRect := FormFrameRect(true) ;
-
- if (PtInRect(Rect(wRect.left, wRect.top, wRect.Left + 10 + borderwidth, wRect.top + borderheight) , wpt) or
- PtInRect(Rect(wRect.Left, wRect.top, wRect.Left + BorderWidth, wRect.top + 10 + borderheight) , wpt) ) then //TopLeft
- begin
- Message.Result := htTopLeft;
- end
- else if (PtInRect(Rect(wRect.right - (10 + borderwidth) , wRect.bottom - borderheight, wRect.right, wRect.bottom) , wpt) or
- PtInRect(Rect(wRect.right - BorderWidth, wRect.bottom - (10 + borderheight) , wRect.right, wRect.bottom) , wpt) ) then //BottomRight
- begin
- Message.Result := htBottomRight;
- end
- else if (PtInRect(Rect(wRect.right - (10 + borderwidth) , wRect.top, wRect.right, wRect.top + borderheight) , wpt) or
- PtInRect(Rect(wRect.right - BorderWidth, wRect.top, wRect.right, wRect.top + (10 + borderheight) ) , wpt) ) then //TopRight
- begin
- Message.Result := htTopRight;
- end
- else if (PtInRect(Rect(wRect.Left, wRect.bottom - (10 + borderheight) , wRect.left + BorderWidth, wRect.bottom) , wpt) or
- PtInRect(Rect(wRect.Left, wRect.bottom - borderheight, wRect.left + (10 + borderwidth) , wRect.bottom) , wpt) ) then //BottomRight
- begin
- Message.Result := htBottomLeft;
- end
- else if PtInRect(Rect(wRect.left + 10 + borderWidth, wRect.top, wRect.right - (10 + borderWidth) , wRect.top + borderheight) , wpt) then //Top
- begin
- Message.Result := htTop;
- end
- else if PtInRect(Rect(wRect.Left, wRect.top + 10 + borderheight, wRect.Left + BorderWidth, wRect.bottom - (10 + borderheight) ) , wpt) then //Left
- begin
- Message.Result := htLeft;
- end
- else if PtInRect(Rect(wRect.left + 10 + borderWidth, wRect.Bottom - borderheight, wRect.right - (10 + borderWidth) , wRect.Bottom) , wpt) then //bottom
- begin
- Message.Result := htBottom;
- end
- else if PtInRect(Rect(wRect.right - BorderWidth, wRect.top + 10 + borderheight, wRect.right, wRect.bottom - (10 + borderheight) ) , wpt) then //Right
- begin
- Message.Result := htRight;
- end
- else if PtInRect(FormBtnRect(true) , wpt) then //CloseButton
- begin
- Message.Result := htClose;
- end
- else if PtInRect(FormCaptionRect(true) , wpt) then //Caption
- begin
- Message.Result := htCaption;
- end
- else if PtInRect(FormClientRect(true) , wpt) then //Client
- begin
- Message.Result := htclient;
- end
- else
- Message.result := HTNOWHERE;
- end;
-
- procedure TrmCustomToolWinForm.WMNCPaint(var Message: TMessage) ;
- var
- DC: HDC;
- wRect: TRect;
- Rgn1, Rgn2, Rgn3: HRGN;
- cLeft, cRight: TColor;
- wFrameRect, wCaptionRect, wBtnRect, wCaptionTextRect, wClientRect: TRect;
-
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- //This is where the magic of the whole thing comes into play....
-
- wFrameRect := FormFrameRect(false) ;
- wCaptionRect := FormCaptionRect(false) ;
- wBtnRect := FormBtnRect(false) ;
- wCaptionTextRect := FormCaptionTextRect(false) ;
- wClientRect := FormClientRect(false) ;
-
- fInNCPaint := true;
- try
- fWindowBMP.Width := wFrameRect.right - wFrameRect.left;
- fWindowBMP.height := wFrameRect.bottom - wFrameRect.Top;
- fWindowBMP.canvas.Brush.Color := Color;
- fWindowBMP.Canvas.FillRect(wFrameRect) ;
-
- if WinOSVersion in [wosWin98, wosWinNT2k] then
- begin
- if WindowUseGradientCaption then
- begin
- if fActive or Self.Focused then
- begin
- cLeft := clActiveCaption;
- cRight := clGradientActiveCaption;
- fWindowBMP.Canvas.font.Color := clCaptionText;
- end
- else
- begin
- cLeft := clInActiveCaption;
- cRight := clGradientInactiveCaption;
- fWindowBMP.Canvas.font.Color := clInactiveCaptionText;
- end;
- GradientFill(fWindowBMP.canvas, cLeft, cRight, wCaptionRect) ;
- end
- else
- begin
- if fActive or Self.Focused then
- begin
- fWindowBMP.Canvas.brush.color := clActiveCaption;
- fWindowBMP.Canvas.font.Color := clCaptionText;
- end
- else
- begin
- fWindowBMP.Canvas.brush.color := clInActiveCaption;
- fWindowBMP.Canvas.font.Color := clInactiveCaptionText;
- end;
- fWindowBMP.Canvas.fillrect(wCaptionRect) ;
- end;
- end
- else
- begin
- if fActive or Self.Focused then
- begin
- fWindowBMP.Canvas.brush.color := clActiveCaption;
- fWindowBMP.Canvas.font.Color := clCaptionText;
- end
- else
- begin
- fWindowBMP.Canvas.brush.color := clInActiveCaption;
- fWindowBMP.Canvas.font.Color := clInactiveCaptionText;
- end;
- fWindowBMP.Canvas.fillrect(wCaptionRect) ;
- end;
- fWindowBMP.Canvas.Pen.Color := clBtnFace;
- fWindowBMP.Canvas.MoveTo(wCaptionRect.Left, wCaptionRect.Bottom - 1) ;
- fWindowBMP.Canvas.LineTo(wCaptionRect.Right, wCaptionRect.Bottom - 1) ;
-
- fWindowBMP.Canvas.font.name := WindowCaptionFontName;
- fWindowBMP.Canvas.font.height := WindowCaptionFontSize;
- fWindowBMP.Canvas.Brush.Style := bsClear;
- fWindowBMP.Canvas.Font.Style := WindowCaptionFontStyle;
-
- wRect := wCaptionTextRect;
- DrawText(fWindowBMP.Canvas.handle, pchar(caption) , length(caption) , wRect, DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS) ;
- DrawFrameControl(fWindowBMP.canvas.handle, wBtnRect, DFC_Caption, DFCS_CAPTIONCLOSE) ;
-
- wRect := wFrameRect;
- if Parent = nil then
- begin
- Frame3D(fWindowBMP.Canvas, wRect, cl3DLight, cl3DDkShadow, 1) ;
- Frame3D(fWindowBMP.Canvas, wRect, clBtnHighlight, clBtnShadow, 1) ;
- end
- else
- begin
- Frame3D(fWindowBMP.Canvas, wRect, clBtnface, clBtnface, 2) ;
- end;
- Frame3D(fWindowBMP.Canvas, wRect, clBtnface, clBtnface, 2) ;
-
- Rgn1 := CreateRectRgn(wFrameRect.Left, wFrameRect.Top, wFrameRect.Right, wFrameRect.Bottom) ;
-
- GetWindowRgn(handle, Rgn1) ;
-
- Rgn2 := CreateRectRgn(wClientRect.Left, wClientRect.Top, wClientRect.Right, wClientRect.Bottom) ;
- Rgn3 := CreateRectRgn(0, 0, width, height) ;
- CombineRgn(Rgn3, Rgn1, Rgn2, Rgn_XOR) ;
- try
- if Rgn3 <> 0 then
- SetWindowRgn(handle, Rgn3, false) ;
-
- DC := GetWindowDC(Handle) ;
- try
- BitBlt(DC, 0, 0, fWindowBMP.width, fWindowBMP.height, fWindowBMP.Canvas.Handle, 0, 0, SRCCOPY) ;
- finally
- ReleaseDC(Handle, DC) ;
- end;
-
- finally
- SetWindowRgn(handle, 0, false) ;
- DeleteObject(Rgn1) ;
- DeleteObject(Rgn2) ;
- DeleteObject(Rgn3) ;
- end;
- finally
- fInNCPaint := false;
- end;
- Message.result := 0;
- end;
-
- function TrmCustomToolWinForm.FormFrameRect(Screen: boolean) : TRect;
- begin
- if Screen then
- result := BoundsRect
- else
- begin
- if fMoveSize = msSizing then
- begin
- result := InternalFrameRect;
- offsetrect(result, -result.left, -result.Top) ;
- end
- else
- result := rect(0, 0, width, height) ;
- end;
- end;
-
- function TrmCustomToolWinForm.FormCaptionRect(screen: boolean) : TRect;
- begin
- result := FormFrameRect(screen) ;
- InflateRect(result, -WindowBorderWidth, -WindowBorderHeight) ;
- Result.Bottom := Result.top + WindowCaptionHeight;
- end;
-
- function TrmCustomToolWinForm.FormCaptionTextRect(Screen: boolean) : TRect;
- begin
- result := FormCaptionRect(screen) ;
- Result.left := Result.Left + 2;
- Result.right := Result.right - WindowButtonWidth - 2;
- end;
-
- function TrmCustomToolWinForm.FormBtnRect(screen: boolean) : TRect;
- begin
- Result := FormCaptionRect(screen) ;
- Result.Right := Result.Right - 2;
- Result.Left := Result.Right - WindowButtonWidth;
- Result.top := Result.top + 2;
- Result.bottom := Result.top + WindowButtonHeight;
- end;
-
- function TrmCustomToolWinForm.FormClientRect(screen: boolean) : TRect;
- var
- wRect: TRect;
- begin
- if screen then
- wRect := rect(ClientOrigin.x, ClientOrigin.y, ClientOrigin.x + clientwidth, ClientOrigin.y + clientheight)
- else
- begin
- wRect := ClientRect;
- OffsetRect(wRect, WindowBorderWidth, WindowBorderheight + WindowCaptionHeight) ;
- end;
- result := wRect;
- end;
-
- procedure TrmCustomToolWinForm.WMNCLButtonDown(var Message: TWMNCLButtonDown) ;
- var
- DC: HDC;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- DC := GetWindowDC(handle) ;
- try
- if Message.HitTest = htClose then
- begin
- SendCancelMode(Self) ;
- MouseCapture := true;
- DrawFrameControl(DC, FormBtnRect(false) , DFC_Caption, DFCS_CAPTIONCLOSE or DFCS_PUSHED) ;
- fCloseBtnPressed := true;
- Message.Result := 0;
- end
- else
- inherited;
- finally
- if DC <> 0 then
- ReleaseDC(handle, DC) ;
- end;
- end;
-
- procedure TrmCustomToolWinForm.WMNCLButtonUp(var Message: TWMNCLButtonUp) ;
- var
- DC: HDC;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- DC := GetWindowDC(handle) ;
- try
- DrawFrameControl(DC, FormBtnRect(false) , DFC_Caption, DFCS_CAPTIONCLOSE) ;
- if fCloseBtnPressed and (Message.HitTest = htClose) then
- begin
- Message.Result := 0;
- close;
- end
- else
- inherited;
- finally
- fCloseBtnPressed := false;
- if DC <> 0 then
- ReleaseDC(handle, DC) ;
- end;
- end;
-
- procedure TrmCustomToolWinForm.WMNCMouseMove(var Message: TWMNCMouseMove) ;
- var
- DC: HDC;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- try
- DC := GetWindowDC(handle) ;
-
- try
- if fCloseBtnPressed then
- begin
- if Message.HitTest = htClose then
- DrawFrameControl(DC, FormBtnRect(false) , DFC_Caption, DFCS_PUSHED or DFCS_CAPTIONCLOSE)
- else
- DrawFrameControl(DC, FormBtnRect(false) , DFC_Caption, DFCS_CAPTIONCLOSE) ;
- message.result := 0;
- end
- else
- inherited;
- finally
- if DC <> 0 then
- ReleaseDC(handle, DC) ;
- end;
- except
- //for some reason we occasionally get a Range Checking error here.
- end;
-
- end;
-
- procedure TrmCustomToolWinForm.WMLButtonUp(var Message: TWMLButtonUp) ;
- var
- DC: HDC;
- pt: TPoint;
- WasBtnPressed: boolean;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- WasBtnPressed := fCloseBtnPressed;
- fCloseBtnPressed := false;
- MouseCapture := false;
- DC := GetWindowDC(handle) ;
- try
- DrawFrameControl(DC, FormBtnRect(false) , DFC_Caption, DFCS_CAPTIONCLOSE) ;
- pt := clienttoscreen(point(message.XPos, Message.YPos) ) ;
- if WasBtnPressed and ptInRect(FormBtnRect(true) , pt) then
- begin
- Message.Result := 0;
- close;
- end
- else
- inherited;
- finally
- if DC <> 0 then
- ReleaseDC(handle, DC) ;
- end;
- end;
-
- procedure TrmCustomToolWinForm.WMMouseMove(var Message: TWMMouseMove) ;
- var
- DC: HDC;
- pt: TPoint;
- begin
- if csDesigning in ComponentState then
- begin
- inherited;
- exit;
- end;
-
- DC := GetWindowDC(handle) ;
- try
- if fCloseBtnPressed then
- begin
- pt := clienttoscreen(point(message.XPos, Message.YPos) ) ;
- if ptInRect(FormBtnRect(true) , pt) then
- DrawFrameControl(DC, FormBtnRect(false) , DFC_Caption, DFCS_PUSHED or DFCS_CAPTIONCLOSE)
- else
- DrawFrameControl(DC, FormBtnRect(false) , DFC_Caption, DFCS_CAPTIONCLOSE) ;
- message.result := 0;
- end
- else
- inherited;
- finally
- if DC <> 0 then
- ReleaseDC(handle, DC) ;
- end;
- end;
-
- procedure TrmCustomToolWinForm.WMNCActivate(var Message: TWMNCActivate) ;
- begin
- inherited;
- //Your supposed to pass the handle of the region to paint according to the Win32 API
- //But because I'm handling the NCPainting myself, I figure that I can skip passing the
- //handle of the rgn. Mostly because I'm not paying attention to it in the first place.
- fActive := Message.active;
- SendMessage(self.handle, wm_ncPaint, 0, 0) ;
- end;
-
- procedure TrmCustomToolWinForm.WMKillFocus(var msg: TWMKillFocus) ;
- begin
- inherited;
- fActive := false;
- SendMessage(self.handle, wm_ncPaint, 0, 0) ;
- end;
-
- function TrmCustomToolWinForm.AdjustFormFrameRect(wRect: TRect) : TRect;
- var
- fixed: boolean;
- wPosRect: TRect;
- begin
- wPosRect := fPosRect;
-
- fixed := false;
-
- if wRect.right <= 40 + (WindowButtonWidth + (WindowBorderWidth * 2) + 6) then
- begin
- wRect.right := 40 + (WindowButtonWidth + (WindowBorderWidth * 2) + 6) ;
- fixed := true;
- end;
-
- if wRect.bottom <= (WindowCaptionHeight + (WindowBorderWidth * 2) ) then
- begin
- wRect.bottom := (WindowCaptionHeight + (WindowBorderWidth * 2) ) ;
- fixed := true;
- end;
-
- if fixed then
- begin
- if wRect.left > wPosRect.left then
- wRect.left := wPosRect.right - wRect.right;
-
- if wRect.top > wPosRect.Top then
- wRect.top := wPosRect.bottom - wRect.bottom;
- end;
- result := wRect;
- end;
-
- procedure TrmCustomToolWinForm.SetInternalFrameRect(const Value: TRect) ;
- begin
- fFrameRect := Value;
- end;
-
- procedure TrmCustomToolWinForm.wmMove(var msg: TwmMove) ;
- begin
- inherited;
- if assigned(fonMove) then
- fOnMove(self) ;
- end;
-
- destructor TrmCustomToolWinForm.destroy;
- begin
- fWindowBMP.free;
- inherited;
- end;
-
- procedure TrmCustomToolWinForm.setncactive(const Value: boolean);
- begin
- factive := Value;
- SendMessage(self.handle, wm_ncPaint, 0, 0) ;
- end;
-
- initialization
- NewBrush := TBrush.Create;
- NewBrush.Bitmap := AllocPatternBitmap(clBlack, clWhite) ;
-
- finalization
- if assigned(NewBrush) then
- NewBrush.free;
- end.
-
-