Componentes.Terceros.DevExp.../internal/x.44/1/ExpressBars 5/Sources/dxBarCommon.pas
2009-06-29 12:09:02 +00:00

221 lines
7.7 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressBars common }
{ }
{ Copyright (c) 1998-2009 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSBARS AND ALL ACCOMPANYING VCL }
{ CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
unit dxBarCommon;
interface
uses
Windows, dxCommon, dxBar;
procedure DrawCloseButton(DC: HDC; var ARect: TRect; Selected, Pressed, Flat: Boolean;
ACorner: TdxCorner);
procedure dxBarPopupNCCalcSize(Handle: HWND; var ARect: TRect;
var Corner: TdxCorner; Combo: TdxBarItem; AllowResizing: Boolean); // obsolete
procedure dxBarPopupNCPaint(Handle: HWND; AllowResizing, Flat,
MouseAboveCloseButton, CloseButtonIsTracking: Boolean;
var CloseButtonRect, GripRect: TRect; Corner: TdxCorner);
implementation
uses
Classes;
// TODO: !!! use PainterClass
// dxDropDownNCHeight ?
procedure DrawCloseButton(DC: HDC; var ARect: TRect; Selected, Pressed, Flat: Boolean;
ACorner: TdxCorner);
const
Borders: array[Boolean] of Longint = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
States: array[Boolean] of Longint = (0, DFCS_PUSHED);
var
Delta, SX, SY: Integer;
Rgn1, Rgn2: HRGN;
ClipRgnExists: Boolean;
begin
SX := GetSystemMetrics(SM_CXSIZE);
Delta := 1;//Byte(SX = 18);
SY := GetSystemMetrics(SM_CXSIZE) + Delta;
with ARect do
begin
if ACorner in [coTopRight, coBottomRight] then
Right := Left + SX
else
Left := Right - SX;
Top := (Top + Bottom - SY) div 2;
if ACorner in [coBottomLeft, coBottomRight] then Inc(Top, Delta);
Bottom := Top + SY;
end;
InflateRect(ARect, -1, -2);
if Selected and not Flat then
DrawEdge(DC, ARect, Borders[Pressed], BF_RECT)
else
FrameRect(DC, ARect, GetSysColorBrush(COLOR_BTNFACE));
InflateRect(ARect, -1, -1);
FrameRect(DC, ARect, GetSysColorBrush(COLOR_BTNFACE));
Rgn1 := CreateRectRgn(0, 0, 0, 0);
ClipRgnExists := GetClipRgn(DC, Rgn1) = 1;
with ARect do
Rgn2 := CreateRectRgn(Left + 1, Top + 1, Right - 1, Bottom - 1);
SelectClipRgn(DC, Rgn2);
DeleteObject(Rgn2);
InflateRect(ARect, 1, 1);
if SX <> 22 then Inc(ARect.Top, Delta);
DrawFrameControl(DC, ARect, DFC_CAPTION,
DFCS_CAPTIONCLOSE or DFCS_FLAT or States[Pressed and not Flat]);
if SX <> 22 then Dec(ARect.Top, Delta);
if ClipRgnExists then
SelectClipRgn(DC, Rgn1)
else
SelectClipRgn(DC, 0);
DeleteObject(Rgn1);
end;
{
TODO:?
function dxBarDropDownNCHeight: Integer;
begin
Result := dxDropDownNCHeight;
end;}
procedure dxBarPopupNCCalcSize(Handle: HWND; var ARect: TRect;
var Corner: TdxCorner; Combo: TdxBarItem; AllowResizing: Boolean); // obsolete
var
R: TRect;
AControl: TdxBarWinControl;
begin
InflateRect(ARect, -1, -1);
if AllowResizing and
(Combo.CurItemLink <> nil) and (Combo.CurItemLink.Control <> nil) then
begin
GetWindowRect(Handle, R);
AControl := TdxBarWinControl(Combo.CurItemLink.Control);
MapWindowPoints(0, AControl.Parent.Handle, R, 2);
Corner := GetCornerForRects(AControl.WindowRect, R);
with ARect do
if Corner in [coBottomLeft, coBottomRight] then
Dec(Bottom, dxDropDownNCHeight)
else
Inc(Top, dxDropDownNCHeight);
end;
end;
procedure dxBarPopupNCPaint(Handle: HWND; AllowResizing, Flat,
MouseAboveCloseButton, CloseButtonIsTracking: Boolean;
var CloseButtonRect, GripRect: TRect; Corner: TdxCorner);
var
R, CR: TRect;
B: Integer;
BorderBrush: HBRUSH;
DC: HDC;
AStyle: Longint;
begin
DC := GetWindowDC(Handle);
try
GetWindowRect(Handle, R);
CloseButtonRect := R;
GripRect := R;
GetClientRect(Handle, CR);
MapWindowPoints(0, Handle, R, 2);
B := -R.Left;
OffsetRect(CR, -R.Left, -R.Top);
OffsetRect(R, -R.Left, -R.Top);
if Flat then
BorderBrush := GetSysColorBrush(COLOR_BTNSHADOW)
else
BorderBrush := GetSysColorBrush(COLOR_WINDOWFRAME);
FrameRect(DC, R, BorderBrush);
if not AllowResizing then
begin
SetRectEmpty(CloseButtonRect);
SetRectEmpty(GripRect);
Exit;
end;
InflateRect(R, -B, -B);
if Corner in [coBottomLeft, coBottomRight] then
begin
R.Top := R.Bottom - dxDropDownNCHeight + 1;
FillRect(DC, Rect(R.Left, R.Top - 1, R.Right, R.Top), BorderBrush);
end
else
begin
R.Bottom := R.Top + dxDropDownNCHeight - 1;
FillRect(DC, Rect(R.Left, R.Bottom, R.Right, R.Bottom + 1), BorderBrush);
end;
CR := R;
DrawSizeGrip(DC, CR, Corner);
with CR do
ExcludeClipRect(DC, Left, Top, Right, Bottom);
InflateRect(CR, 2, 2);
if CR.Top < R.Top then CR.Top := R.Top;
if CR.Bottom > R.Bottom then CR.Bottom := R.Bottom;
OffsetRect(CR, GripRect.Left, GripRect.Top);
GripRect := CR;
CR := R;
DrawCloseButton(DC, CR, MouseAboveCloseButton or CloseButtonIsTracking,
MouseAboveCloseButton and CloseButtonIsTracking, Flat, Corner);
with CR do
ExcludeClipRect(DC, Left, Top, Right, Bottom);
with CloseButtonRect do OffsetRect(CR, Left, Top);
CloseButtonRect := CR;
FillRect(DC, R, COLOR_BTNFACE + 1);
if Corner in [coBottomLeft, coBottomRight] then
begin
AStyle := GetWindowLong(Handle, GWL_STYLE);
if (AStyle and WS_HSCROLL <> 0) and (AStyle and WS_VSCROLL <> 0) then
with R do
begin
Left := Right - GetSystemMetrics(SM_CXVSCROLL);
Bottom := Top - 1;
Top := Bottom - GetSystemMetrics(SM_CYHSCROLL);
FillRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
end;
end;
finally
ReleaseDC(Handle, DC);
end;
end;
end.