| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415 |
- {******************************************************************************}
- { CnPack For Delphi/C++Builder }
- { 中国人自己的开放源码第三方开发包 }
- { (C)Copyright 2001-2018 CnPack 开发组 }
- { ------------------------------------ }
- { }
- { 本开发包是开源的自由软件,您可以遵照 CnPack 的发布协议来修 }
- { 改和重新发布这一程序。 }
- { }
- { 发布这一开发包的目的是希望它有用,但没有任何担保。甚至没有 }
- { 适合特定目的而隐含的担保。更详细的情况请参阅 CnPack 发布协议。 }
- { }
- { 您应该已经和开发包一起收到一份 CnPack 发布协议的副本。如果 }
- { 还没有,可访问我们的网站: }
- { }
- { 网站地址:http://www.cnpack.org }
- { 电子邮件:master@cnpack.org }
- { }
- {******************************************************************************}
- {*******************************************************}
- { }
- { 一些通用的函数 }
- { CnDockSupportProc 单元 }
- { }
- { 版权 (C) 2002,2003 鲁小班 }
- { }
- {*******************************************************}
- unit CnDockSupportProc;
- {* |<PRE>
- ================================================================================
- * 软件名称:不可视工具组件包停靠单元
- * 单元名称:一些通用的函数单元
- * 单元作者:CnPack开发组 周益波(鲁小班)
- * 备 注:本单元由原作者授权CnPack开发组移植,已保留原作者版权信息
- * 开发平台:
- * 兼容测试:PWin9X/2000/XP + Delphi 5/6/7
- * 本 地 化:该单元中的字符串均符合本地化处理方式
- * 单元标识:$Id$
- * 修改记录:2008.11.18 V1.1
- * wqyfavor 修正 D2009 下的不兼容问题
- * 2007.07.13 V1.0
- * 移植单元
- ================================================================================
- |</PRE>}
- interface
- {$I CnPack.inc}
- uses Classes, Windows, SysUtils, Graphics, Forms, Controls, Messages;
- type
- TListScanKind = (lskForward, lskBackward);
- { ---------------------------------------------------------------------------- }
- function Cn_StreamDataToString(Stream: TStream): string;
- procedure Cn_StringToStreamData(Stream: TStream; Data: string);
- { ---------------------------------------------------------------------------- }
- function Cn_FindDockFormWithName(FormName: string;
- FromDockManager: Boolean = False;
- FromList: Boolean = True;
- ScanKind: TListScanKind = lskForward): TCustomForm;
- function Cn_FindDockServerFormWithName(FormName: string;
- FromDockManager: Boolean = False;
- FromList: Boolean = True;
- ScanKind: TListScanKind = lskForward): TCustomForm;
- function Cn_FindDockClientFormWithName(FormName: string;
- FromDockManager: Boolean = False;
- FromList: Boolean = True;
- ScanKind: TListScanKind = lskForward): TCustomForm;
- function Cn_FindDockServerFromDockManager(FormName: string;
- FromList: Boolean = True;
- ScanKind: TListScanKind = lskForward): TCustomForm;
- function Cn_FindDockClientFromDockManager(FormName: string;
- FromList: Boolean = True;
- ScanKind: TListScanKind = lskForward): TCustomForm;
- function Cn_FindDockFormFromScreen(FormName: string;
- ScanKind: TListScanKind = lskForward): TCustomForm;
- { ---------------------------------------------------------------------------- }
- function Cn_GetMinOffset(TBDockSize, ControlSize: Integer; Scale: Real): Integer;
- { ---------------------------------------------------------------------------- }
- function Cn_GetNoNClientMetrics: TNONCLIENTMETRICS;
- { 获得系统的标题栏的高度 }
- function Cn_GetSysCaptionHeight: Integer;
- { 获得系统的窗体的边框 }
- function Cn_GetSysBorderWidth: Integer;
- function Cn_GetSysCaptionHeightAndBorderWidth: Integer;
- { ---------------------------------------------------------------------------- }
- { 获得活动的标题栏的开始颜色 }
- function Cn_GetActiveTitleBeginColor: TColor;
- { 获得活动的标题栏的结束颜色 }
- function Cn_GetActiveTitleEndColor: TColor;
- { 获得非活动的标题栏的开始颜色 }
- function Cn_GetInactiveTitleBeginColor: TColor;
- { 获得非活动的标题栏的结束颜色 }
- function Cn_GetInactiveTitleEndColor: TColor;
- { 获得标题栏的字体颜色,Active指示是否是获得焦点 }
- function Cn_GetTitleFontColor(Active: Boolean): TColor;
- { 获得活动的标题栏的字体颜色 }
- function Cn_GetActiveTitleFontColor: TColor;
- { 获得非活动的标题栏的字体颜色 }
- function Cn_GetInactiveTitleFontColor: TColor;
- { 获得标题栏的字体 }
- function Cn_GetTitleFont: TFont;
- { 锁住窗体 }
- procedure Cn_LockWindow(Control: TWinControl);
- { 解锁窗体 }
- procedure Cn_UnLockWindow;
- { ---------------------------------------------------------------------------- }
- { 输入一些值创建一个TWMNCHitMessage结构并且返回 }
- function Cn_CreateNCMessage(Control: TControl; Msg: Cardinal; HTFlag: Integer; Pos: TPoint): TWMNCHitMessage;
- { 交换参数Orient的值 }
- function Cn_ExchangeOrient(Orient: TDockOrientation): TDockOrientation;
- { 根据输入的Control的Align属性得到它的方向 }
- function Cn_GetControlOrient(AControl: TControl): TDockOrientation;
- { 根据输入的Control的Align属性得到它的宽度或者高度 }
- function Cn_GetControlSize(AControl: TControl): Integer;
- implementation
- uses
- Math, CnDockFormControl, CnDockGlobal;
- var
- Cn_TitleFont: TFont;
- function Cn_StreamDataToString(Stream: TStream): string;
- var
- B: Byte;
- begin
- Result := '';
- Stream.Position := 0;
- while Stream.Position < Stream.Size do
- begin
- Stream.Read(B, SizeOf(B));
- Result := Result + IntToHex(B, 2);
- end;
- end;
- procedure Cn_StringToStreamData(Stream: TStream; Data: string);
- var
- i: Integer;
- B: Byte;
- begin
- i := 1;
- while i < Length(Data) do
- begin
- B := StrToInt('$' + Copy(Data, i, 2));
- Stream.Write(B, SizeOf(B));
- Inc(i, 2);
- end;
- end;
- function Cn_FindDockFormWithName(FormName: string;
- FromDockManager: Boolean;
- FromList: Boolean;
- ScanKind: TListScanKind): TCustomForm;
- begin
- Result := Cn_FindDockClientFormWithName(FormName, FromDockManager, FromList, ScanKind);
- if Result = nil then
- Result := Cn_FindDockServerFormWithName(FormName, FromDockManager, FromList, ScanKind);
- end;
- function Cn_FindDockServerFormWithName(FormName: string;
- FromDockManager: Boolean;
- FromList: Boolean;
- ScanKind: TListScanKind): TCustomForm;
- begin
- if FromDockManager then
- Result := Cn_FindDockServerFromDockManager(FormName, FromList, ScanKind)
- else Result := Cn_FindDockFormFromScreen(FormName, ScanKind);
- end;
- function Cn_FindDockClientFormWithName(FormName: string;
- FromDockManager: Boolean;
- FromList: Boolean;
- ScanKind: TListScanKind): TCustomForm;
- begin
- if FromDockManager then
- Result := Cn_FindDockClientFromDockManager(FormName, FromList, ScanKind)
- else Result := Cn_FindDockFormFromScreen(FormName, ScanKind);
- end;
- function Cn_FindDockServerFromDockManager(FormName: string;
- FromList: Boolean;
- ScanKind: TListScanKind): TCustomForm;
- var
- i: Integer;
- begin
- case ScanKind of
- lskForward:
- begin
- for i := 0 to CnGlobalDockPresident.DockServersList.Count - 1 do
- if FormName = TCustomForm(CnGlobalDockPresident.DockServersList[i]).Name then
- begin
- Result := TCustomForm(CnGlobalDockPresident.DockServersList[i]);
- Exit;
- end;
- end;
- lskBackward:
- begin
- for i := CnGlobalDockPresident.DockServersList.Count - 1 downto 0 do
- if FormName = TCustomForm(CnGlobalDockPresident.DockServersList[i]).Name then
- begin
- Result := TCustomForm(CnGlobalDockPresident.DockServersList[i]);
- Exit;
- end;
- end;
- end;
- Result := nil;
- end;
- function Cn_FindDockClientFromDockManager(FormName: string;
- FromList: Boolean;
- ScanKind: TListScanKind): TCustomForm;
- var
- i: Integer;
- begin
- case ScanKind of
- lskForward:
- begin
- for i := 0 to CnGlobalDockPresident.DockClientsList.Count - 1 do
- if FormName = TCustomForm(CnGlobalDockPresident.DockClientsList[i]).Name then
- begin
- Result := TCustomForm(CnGlobalDockPresident.DockClientsList[i]);
- Exit;
- end;
- end;
- lskBackward:
- begin
- for i := CnGlobalDockPresident.DockClientsList.Count - 1 downto 0 do
- if FormName = TCustomForm(CnGlobalDockPresident.DockClientsList[i]).Name then
- begin
- Result := TCustomForm(CnGlobalDockPresident.DockClientsList[i]);
- Exit;
- end;
- end;
- end;
- Result := nil;
- end;
- function Cn_FindDockFormFromScreen(FormName: string;
- ScanKind: TListScanKind): TCustomForm;
- var
- i: Integer;
- begin
- case ScanKind of
- lskForward:
- begin
- for i := 0 to Screen.CustomFormCount - 1 do
- if FormName = Screen.CustomForms[i].Name then
- begin
- Result := Screen.CustomForms[i];
- Exit;
- end;
- end;
- lskBackward:
- begin
- for i := Screen.CustomFormCount - 1 downto 0 do
- if FormName = Screen.CustomForms[i].Name then
- begin
- Result := Screen.CustomForms[i];
- Exit;
- end;
- end;
- end;
- Result := nil;
- end;
- function Cn_GetMinOffset(TBDockSize, ControlSize: Integer; Scale: Real): Integer;
- begin
- if (Scale < 0) or (Scale > 1) then
- Scale := 1;
- Result := Min(TBDockSize, Round(ControlSize * Scale));
- end;
- function Cn_GetNoNClientMetrics: TNONCLIENTMETRICS;
- begin
- Result.cbSize := Sizeof(TNONCLIENTMETRICS);
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, Result.cbSize,
- @Result, 0);
- end;
- function Cn_GetSysCaptionHeight: Integer;
- begin
- Result := Cn_GetNoNClientMetrics.iCaptionHeight
- end;
- function Cn_GetSysBorderWidth: Integer;
- begin
- Result := Cn_GetNoNClientMetrics.iBorderWidth;
- end;
- function Cn_GetSysCaptionHeightAndBorderWidth: Integer;
- var NoNCM: TNONCLIENTMETRICS;
- begin
- NoNCM := Cn_GetNoNClientMetrics;
- Result := NoNCM.iBorderWidth + NoNCM.iCaptionHeight;
- end;
- function Cn_GetActiveTitleBeginColor: TColor;
- begin
- Result := GetSysColor(COLOR_ACTIVECAPTION);
- end;
- function Cn_GetActiveTitleEndColor: TColor;
- begin
- Result := GetSysColor(COLOR_GRADIENTACTIVECAPTION);
- end;
- function Cn_GetInactiveTitleBeginColor: TColor;
- begin
- Result := GetSysColor(COLOR_INACTIVECAPTION);
- end;
- function Cn_GetInactiveTitleEndColor: TColor;
- begin
- Result := GetSysColor(COLOR_GRADIENTINACTIVECAPTION);
- end;
- function Cn_GetTitleFontColor(Active: Boolean): TColor;
- begin
- if Active then
- Result := Cn_GetActiveTitleFontColor
- else Result := Cn_GetInactiveTitleFontColor;
- end;
- function Cn_GetActiveTitleFontColor: TColor;
- begin
- Result := GetSysColor(COLOR_CAPTIONTEXT);
- end;
- function Cn_GetInactiveTitleFontColor: TColor;
- begin
- Result := GetSysColor(COLOR_INACTIVECAPTIONTEXT);
- end;
- { 获得标题栏的字体 }
- function Cn_GetTitleFont: TFont;
- var
- NoNCM: TNONCLIENTMETRICS;
- begin
- Result := Cn_TitleFont;
- NoNCM := Cn_GetNoNClientMetrics;
- Result.Handle := CreateFontIndirect(NoNCM.lfCaptionFont);
- end;
- procedure Cn_LockWindow(Control: TWinControl);
- var
- Handle: HWND;
- begin
- if Control = nil then
- Handle := GetDesktopWindow
- else
- Handle := Control.Handle;
- LockWindowUpdate(Handle);
- end;
- procedure Cn_UnLockWindow;
- begin
- LockWindowUpdate(0);
- end;
- function Cn_CreateNCMessage(Control: TControl; Msg: Cardinal;
- HTFlag: Integer; Pos: TPoint): TWMNCHitMessage;
- begin
- { 下面的五条语句给TWMNCHitMessage赋值 }
- Result.Msg := Msg;
- Result.HitTest := HTFlag;
- Pos := Control.ClientToScreen(Pos);
- Result.XCursor := Pos.X;
- Result.YCursor := Pos.Y;
- end;
- function Cn_ExchangeOrient(Orient: TDockOrientation): TDockOrientation;
- begin
- case Orient of
- doHorizontal: Result := doVertical;
- doVertical: Result := doHorizontal;
- else
- Result := doNoOrient;
- end;
- end;
- function Cn_GetControlOrient(AControl: TControl): TDockOrientation;
- begin
- Assert(AControl <> nil);
- Result := doNoOrient;
- case AControl.Align of
- alClient, alNone: Result := doNoOrient;
- alLeft, alRight: Result := doVertical;
- alTop, alBottom: Result := doHorizontal;
- end;
- end;
- function Cn_GetControlSize(AControl: TControl): Integer;
- begin
- case Cn_GetControlOrient(AControl) of
- doVertical: Result := AControl.Width;
- doHorizontal: Result := AControl.Height;
- else
- raise Exception.Create(gs_CannotGetValueWithNoOrient);
- end;
- end;
- initialization
- Cn_TitleFont := TFont.Create;
- finalization
- Cn_TitleFont.Free;
- end.
|