📄 toolctrlseh.pas
字号:
if W < 8 then PWid := 1;
W := ElRect.Left + W div 2 - PWid div 2 + Ord(Pressed) ;//- Ord(not Active and Flat);
H := ElRect.Top + (ElRect.Bottom - ElRect.Top) div 2 - PWid div 2 + Ord(Pressed);
if not Enabled then
begin
Inc(W);Inc(H);
Brush := GetSysColorBrush(COLOR_BTNHILIGHT);
SaveBrush := SelectObject(DC, Brush);
PatBlt(DC, W, H, PWid, PWid, PATCOPY);
PatBlt(DC, W - InterP - PWid, H, PWid, PWid, PATCOPY);
PatBlt(DC, W + InterP + PWid, H, PWid, PWid, PATCOPY);
Dec(W);Dec(H);
SelectObject(DC, SaveBrush);
Brush := GetSysColorBrush(COLOR_BTNSHADOW);
end else
Brush := GetSysColorBrush(COLOR_BTNTEXT);
SaveBrush := SelectObject(DC, Brush);
PatBlt(DC, W, H, PWid, PWid, PATCOPY);
PatBlt(DC, W - InterP - PWid, H, PWid, PWid, PATCOPY);
PatBlt(DC, W + InterP + PWid, H, PWid, PWid, PATCOPY);
SelectObject(DC, SaveBrush);
end;
procedure DrawOneButton(DC: HDC; Style:TDrawButtonControlStyleEh;
ARect: TRect; Enabled, Flat, Active, Down, DownDirection: Boolean);
var Rgn, SaveRgn: HRgn;
r:Integer;
Flags:Integer;
IsClipRgn:Boolean;
DRect:TRect;
// Brush: HBRUSH;
begin
DRect := ARect;
LPtoDP(DC,DRect,2);
IsClipRgn := Flat and Active;
r := 0; SaveRgn := 0;
if IsClipRgn then
begin
SaveRgn := CreateRectRgn(0,0,0,0);
r := GetClipRgn(DC, SaveRgn);
with DRect do
Rgn := CreateRectRgn(Left+1, Top+1, Right-1, Bottom-1);
SelectClipRgn(DC, Rgn);
DeleteObject(Rgn);
end;
if Flat then
if not Active {and not (Style=bcsUpDownEh)}
then InflateRect(ARect,2,2)
else InflateRect(ARect,1,1);
Flags := DownFlags[Down] or FlatFlags[Flat] or EnabledFlags[Enabled];
case Style of
bcsDropDownEh: DrawFrameControl(DC, ARect, DFC_SCROLL, Flags or DFCS_SCROLLCOMBOBOX);
bcsEllipsisEh: DrawEllipsisButton(DC, ARect, Enabled, Active, Flat, Down);
bcsUpDownEh: DrawFrameControl(DC, ARect, DFC_SCROLL, Flags or IsDownFlags[DownDirection]);
end;
if Flat then
if not Active {and not (Style=bcsUpDownEh)}
then InflateRect(ARect,-2,-2)
else InflateRect(ARect,-1,-1);
if IsClipRgn then
begin
if r = 0
then SelectClipRgn(DC, 0)
else SelectClipRgn(DC, SaveRgn);
DeleteObject(SaveRgn);
if Down
then DrawEdge(DC, ARect, BDR_SUNKENOUTER, BF_RECT)
else DrawEdge(DC, ARect, BDR_RAISEDINNER, BF_RECT)
end;
end;
type
PPoints = ^TPoints;
TPoints = array[0..0] of TPoint;
TButtonBitmapInfoEh = record
Size:TPoint;
BitmapType: TDrawButtonControlStyleEh;
Flat:Boolean;
case TDrawButtonControlStyleEh of
bcsDropDownEh, bcsEllipsisEh, bcsUpDownEh: (Pressed, Active, Enabled, DownDirect:Boolean);
bcsCheckboxEh: (State: TCheckBoxState);
end;
{ TButtonsBitmapCache }
TButtonBitmapInfoBitmapEh = record
BitmapInfo: TButtonBitmapInfoEh;
Bitmap: TBitmap;
end;
PButtonBitmapInfoBitmapEh = ^TButtonBitmapInfoBitmapEh;
TButtonsBitmapCache = class(TList)
private
function Get(Index: Integer): PButtonBitmapInfoBitmapEh;
// procedure Put(Index: Integer; const Value: PButtonBitmapInfoBitmapEh);
public
procedure Clear; override;
function GetButtonBitmap(ButtonBitmapInfo: TButtonBitmapInfoEh):TBitmap;
property Items[Index: Integer]: PButtonBitmapInfoBitmapEh read Get {write Put}; default;
end;
var ButtonsBitmapCache: TButtonsBitmapCache;
procedure ClearButtonsBitmapCache;
begin
ButtonsBitmapCache.Clear;
end;
function RectSize(ARect:TRect):TSize;
begin
Result.cx := ARect.Right-ARect.Left;
Result.cy := ARect.Bottom-ARect.Top;
end;
procedure PaintButtonControlEh(DC: HDC; ARect:TRect;ParentColor:TColor;
Style:TDrawButtonControlStyleEh; DownButton:Integer;
Flat,Active,Enabled:Boolean; State: TCheckBoxState);
var
Rgn, SaveRgn: HRgn;
HalfRect, DRect: TRect;
ASize: TSize;
r: Integer;
Brush: HBRUSH;
IsClipRgn: Boolean;
BitmapInfo: TButtonBitmapInfoEh;
Bitmap: TBitmap;
begin
SaveRgn := 0; r := 0;
FillChar(BitmapInfo,Sizeof(BitmapInfo),#0);
BitmapInfo.BitmapType := Style;
BitmapInfo.Flat := Flat;
if Style = bcsCheckboxEh then
begin
ASize := RectSize(ARect);
if ASize.cx < ASize.cy then
begin
ARect.Top := ARect.Top + (ASize.cy - ASize.cx) div 2;
ARect.Bottom := ARect.Bottom - (ASize.cy - ASize.cx) div 2 - (ASize.cy - ASize.cx) mod 2;
end else if ASize.cx > ASize.cy then
begin
ARect.Left := ARect.Left + (ASize.cx - ASize.cy) div 2;
ARect.Right := ARect.Right - (ASize.cx - ASize.cy) div 2 - (ASize.cx - ASize.cy) mod 2;
end;
if Flat then InflateRect(ARect,-1,-1);
if UseButtonsBitmapCache then
begin
BitmapInfo.Size := Point(ARect.Right-ARect.Left,ARect.Bottom-ARect.Top);
BitmapInfo.State := State;
Bitmap := ButtonsBitmapCache.GetButtonBitmap(BitmapInfo);
StretchBlt(DC, ARect.Left, ARect.Top, ARect.Right - ARect.Left,
ARect.Bottom - ARect.Top, Bitmap.Canvas.Handle, 0, 0,
Bitmap.Width, Bitmap.Height, cmSrcCopy);
end else
DrawCheck(DC,ARect,State,Enabled,Flat);
if Flat then
begin
InflateRect(ARect,1,1);
Brush := CreateSolidBrush(ColorToRGB(ParentColor));
FrameRect(DC, ARect, Brush);
DeleteObject(Brush);
end;
end else
begin
BitmapInfo.Active := Active;
BitmapInfo.Enabled := Enabled;
IsClipRgn := Flat and not Active;
if IsClipRgn then
begin
DRect := ARect;
LPtoDP(DC,DRect,2);
InflateRect(ARect,-1,-1);
if not UseButtonsBitmapCache then
begin
SaveRgn := CreateRectRgn(0,0,0,0);
r := GetClipRgn(DC, SaveRgn);
with DRect do
Rgn := CreateRectRgn(Left+1, Top+1, Right-1, Bottom-1);
SelectClipRgn(DC, Rgn);
DeleteObject(Rgn);
end;
end;
if Style = bcsUpDownEh then
begin
if IsClipRgn then InflateRect(ARect,1,1);
HalfRect := ARect;
with HalfRect do
Bottom := Top + (Bottom-Top) div 2;
if IsClipRgn then InflateRect(HalfRect,-1,-1);
if UseButtonsBitmapCache then
begin
BitmapInfo.Size := Point(HalfRect.Right-HalfRect.Left,HalfRect.Bottom-HalfRect.Top);
BitmapInfo.Pressed := DownButton=1;
BitmapInfo.DownDirect := False;
Bitmap := ButtonsBitmapCache.GetButtonBitmap(BitmapInfo);
StretchBlt(DC, HalfRect.Left, HalfRect.Top, HalfRect.Right - HalfRect.Left,
HalfRect.Bottom - HalfRect.Top, Bitmap.Canvas.Handle, 0, 0,
Bitmap.Width, Bitmap.Height, cmSrcCopy);
end else
DrawOneButton(DC, Style, HalfRect, Enabled, Flat, Active, DownButton=1, False);
if IsClipRgn then InflateRect(HalfRect,1,1);
HalfRect.Bottom := ARect.Bottom;
with HalfRect do
Top := Bottom - (Bottom-Top) div 2;
if IsClipRgn then InflateRect(HalfRect,-1,-1);
if UseButtonsBitmapCache then
begin
BitmapInfo.Size := Point(HalfRect.Right-HalfRect.Left,HalfRect.Bottom-HalfRect.Top);
BitmapInfo.Pressed := DownButton=2;
BitmapInfo.DownDirect := True;
Bitmap := ButtonsBitmapCache.GetButtonBitmap(BitmapInfo);
StretchBlt(DC, HalfRect.Left, HalfRect.Top, HalfRect.Right - HalfRect.Left,
HalfRect.Bottom - HalfRect.Top, Bitmap.Canvas.Handle, 0, 0,
Bitmap.Width, Bitmap.Height, cmSrcCopy);
end else
DrawOneButton(DC, Style, HalfRect, Enabled, Flat, Active, DownButton=2, True);
if IsClipRgn
then InflateRect(ARect,-1,-1);
if ((ARect.Bottom-ARect.Top) mod 2 = 1) or (IsClipRgn) then
begin
HalfRect := ARect;
HalfRect.Top := (HalfRect.Bottom + HalfRect.Top) div 2;
HalfRect.Bottom := HalfRect.Top;
if (ARect.Bottom-ARect.Top) mod 2 = 1 then Inc(HalfRect.Bottom);
if IsClipRgn then InflateRect(HalfRect,0,1);
Brush := CreateSolidBrush(ColorToRGB(ParentColor));
FillRect(DC, HalfRect,Brush);
DeleteObject(Brush);
end;
end else if UseButtonsBitmapCache then
begin
BitmapInfo.Size := Point(ARect.Right-ARect.Left,ARect.Bottom-ARect.Top);
BitmapInfo.Pressed := DownButton<>0;
Bitmap := ButtonsBitmapCache.GetButtonBitmap(BitmapInfo);
StretchBlt(DC, ARect.Left, ARect.Top, ARect.Right - ARect.Left,
ARect.Bottom - ARect.Top, Bitmap.Canvas.Handle, 0, 0,
Bitmap.Width, Bitmap.Height, cmSrcCopy);
end else
DrawOneButton(DC, Style, ARect, Enabled, Flat, Active, DownButton<>0, True);
if IsClipRgn then
begin
InflateRect(ARect,1,1);
if not UseButtonsBitmapCache then
begin
if r = 0
then SelectClipRgn(DC, 0)
else SelectClipRgn(DC, SaveRgn);
DeleteObject(SaveRgn);
end;
Brush := CreateSolidBrush(ColorToRGB(ParentColor));
FrameRect(DC, ARect, Brush);
DeleteObject(Brush);
end;
end;
end;
function GetDefaultFlatButtonWidth:Integer;
var
DC: HDC;
SysMetrics: TTextMetric;
begin
DC := GetDC(0);
GetTextMetrics(DC, SysMetrics);
ReleaseDC(0, DC);
Result := Round(SysMetrics.tmHeight / 3 * 2);
if Result mod 2 = 1 then Inc(Result);
if Result > GetSystemMetrics(SM_CXVSCROLL)
then Result := GetSystemMetrics(SM_CXVSCROLL);
end;
{$DEBUGINFO OFF}
function VarEquals(const V1, V2: Variant): Boolean;
var i:Integer;
begin
Result := not (VarIsArray(V1) xor VarIsArray(V2));
if not Result then Exit;
Result := False;
try
if VarIsArray(V1) and VarIsArray(V2) and
(VarArrayDimCount(V1) = VarArrayDimCount(V2)) and
(VarArrayLowBound(V1,1) = VarArrayLowBound(V2,1)) and
(VarArrayHighBound(V1,1) = VarArrayHighBound(V2,1))
then
for i := VarArrayLowBound(V1,1) to VarArrayHighBound(V1,1) do
begin
Result := V1[i] = V2[i];
if not Result then Exit;
end
else
Result := V1 = V2;
except
end;
end;
{$DEBUGINFO ON}
function TButtonsBitmapCache.GetButtonBitmap(ButtonBitmapInfo: TButtonBitmapInfoEh):TBitmap;
var i: Integer;
BitmapInfoBitmap: PButtonBitmapInfoBitmapEh;
begin
if ButtonBitmapInfo.Size.X < 0 then ButtonBitmapInfo.Size.X := 0;
if ButtonBitmapInfo.Size.Y < 0 then ButtonBitmapInfo.Size.Y := 0;
for i := 0 to Count-1 do
if CompareMem(@ButtonBitmapInfo,Items[i],SizeOf(TButtonBitmapInfoEh)) then
begin
Result := Items[i].Bitmap;
Exit;
end;
New(BitmapInfoBitmap);
Add(BitmapInfoBitmap);
BitmapInfoBitmap.BitmapInfo := ButtonBitmapInfo;
BitmapInfoBitmap.Bitmap := TBitmap.Create;
BitmapInfoBitmap.Bitmap.Width := ButtonBitmapInfo.Size.X;
BitmapInfoBitmap.Bitmap.Height := ButtonBitmapInfo.Size.Y;
case ButtonBitmapInfo.BitmapType of
bcsCheckboxEh:
DrawCheck(BitmapInfoBitmap.Bitmap.Canvas.Handle,
Rect(0,0,ButtonBitmapInfo.Size.X,ButtonBitmapInfo.Size.Y),
ButtonBitmapInfo.State,
True,
ButtonBitmapInfo.Flat
);
bcsEllipsisEh, bcsUpDownEh, bcsDropDownEh:
DrawOneButton(BitmapInfoBitmap.Bitmap.Canvas.Handle,ButtonBitmapInfo.BitmapType,
Rect(0,0,ButtonBitmapInfo.Size.X,ButtonBitmapInfo.Size.Y),
ButtonBitmapInfo.Enabled, ButtonBitmapInfo.Flat,
ButtonBitmapInfo.Active, ButtonBitmapInfo.Pressed,
ButtonBitmapInfo.DownDirect);
end;
Result := BitmapInfoBitmap.Bitmap;
end;
function TButtonsBitmapCache.Get(Index: Integer): PButtonBitmapInfoBitmapEh;
begin
Result := inherited Items[Index];
end;
{procedure TButtonsBitmapCache.Put(Index: Integer; const Value: PButtonBitmapInfoBitmapEh);
begin
inherited Items[Index] := Value;
end;}
procedure TButtonsBitmapCache.Clear;
var i: Integer;
begin
for i := 0 to Count-1 do
begin
Items[i].Bitmap.Free;
Dispose(Items[i]);
end;
inherited Clear;
end;
procedure GetFieldsProperty(List: TList; DataSet: TDataSet;
Control: TComponent; const FieldNames: String);
var
Pos: Integer;
Field: TField;
FieldName: String;
begin
Pos := 1;
while Pos <= Length(FieldNames) do
begin
FieldName := ExtractFieldName(FieldNames, Pos);
Field := DataSet.FindField(FieldName);
if Field = nil then
DatabaseErrorFmt(SFieldNotFound, [FieldName], Control);
if Assigned(List) then List.Add(Field);
end;
end;
function GetFieldsProperty(DataSet: TDataSet; Control: TComponent;
const FieldNames: String):TFieldsArrEh;
var FieldList:TList;
i:Integer;
begin
FieldList := TList.Create;
GetFieldsProperty(FieldList,DataSet, Control, FieldNames);
SetLength(Result,FieldList.Count);
for i := 0 to FieldList.Count-1 do Result[i] := FieldList[i];
FieldList.Free;
end;
procedure DataSetSetFieldValues(DataSet: TDataSet; Fields: String; Value:Variant);
var FieldList: TList;
i:Integer;
begin
if VarEquals(Value,Null) then
begin
FieldList := TList.Create;
try
Dataset.GetFieldList(FieldList,Fields);
for i := 0 to FieldList.Count-1 do
TField(FieldList[i]).Clear;
finally
FieldList.Free;
end;
end else
DataSet.FieldValues[Fields] := Value;
end;
{ TDataSourceLink }
constructor TLookupCtrlDataLinkEh.Create;
begin
inherited Create;
// VisualControl := True;
end;
procedure TLookupCtrlDataLinkEh.ActiveChanged;
begin
if FDBLookupControl <> nil then FDBLookupControl.UpdateDataFields;
end;
procedure TLookupCtrlDataLinkEh.FocusControl(Field: TFieldRef);
begin
if (Field^ <> nil) and (Field^ = FDBLookupControl.Field) and
(FDBLookupControl <> nil) and FDBLookupControl.CanFocus then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -