📄 sdbcombobox.pas
字号:
const
BordWidth = 3;
var
DC, SavedDC: HDC;
R : TRect;
begin
SavedDC := 0;
if ADC = 0 then begin
DC := GetWindowDC(Handle);
SavedDC := SaveDC(DC);
end else begin
DC := ADC;
MoveWindowOrg(DC, -BordWidth, -BordWidth);
SelectClipRgn(DC,0);
end;
try
// if FCommonData.BGChanged then begin
// FCommonData.InitCacheBmp;
PrepareCache;
// end;
UpdateCorners(FCommonData, 0);
BitBlt(DC, 0, 0, Width, BordWidth, FCommonData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
BitBlt(DC, 0, BordWidth, BordWidth, Height, FCommonData.FCacheBmp.Canvas.Handle, 0, BordWidth, SRCCOPY);
BitBlt(DC, BordWidth, Height - BordWidth, Width - BordWidth, BordWidth, FCommonData.FCacheBmp.Canvas.Handle, BordWidth, Height - BordWidth, SRCCOPY);
BitBlt(DC, Width - BordWidth, BordWidth, BordWidth, Height - BordWidth, FCommonData.FCacheBmp.Canvas.Handle, Width - BordWidth, BordWidth, SRCCOPY);
R := ButtonRect;
BitBlt(DC, R.Left, R.Top, WidthOf(R), HeightOf(R), FCommonData.FCacheBmp.Canvas.Handle, R.Left, R.TOp, SRCCOPY);
{$IFDEF DYNAMICCACHE}
if Assigned(FCommonData.FCacheBmp) then FreeAndNil(FCommonData.FCacheBmp);
{$ENDIF}
finally
if SavedDC > 0 then begin
RestoreDC(DC, SavedDC);
ReleaseDC(Handle, DC);
end else begin
MoveWindowOrg(DC, BordWidth, BordWidth);
end;
end;
end;
procedure TsDBComboBox.PaintButton;
var
R : TRect;
Mode : integer;
c : TsColor;
glIndex : integer;
TmpBtn : TBitmap;
begin
if FDropDown then Mode := 2 else if ControlIsActive(FCommonData) then Mode := 1 else Mode := 0;
R := ButtonRect;
if FCommonData.SkinManager.ConstData.ComboBtnIndex > -1 then begin
TmpBtn := CreateBmpLike(FCommonData.FCacheBmp);
BitBlt(TmpBtn.Canvas.Handle, 0, 0, TmpBtn.Width, TmpBtn.Height, FCommonData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
PaintItem(FCommonData.SkinManager.ConstData.ComboBtnIndex, s_ComboBtn, MakeCacheInfo(TmpBtn),
True, Mode, R, Point(R.Left, R.Top), FCommonData.FCacheBmp, FCommonData.SkinManager, FCommonData.SkinManager.ConstData.ComboBtnBG, FCommonData.SkinManager.ConstData.ComboBtnBGHot);
FreeAndNil(TmpBtn);
end;
glIndex := FCommonData.SkinManager.ConstData.ComboGlyph;
if glIndex > -1 then begin
if ControlIsActive(FCommonData)
then c.C := FCommonData.SkinManager.gd[FCommonData.SkinIndex].HotColor
else c.C := FCommonData.SkinManager.gd[FCommonData.SkinIndex].Color;
DrawSkinGlyph(FCommonData.FCacheBmp,
Point(R.Left + (WidthOf(R) - WidthOf(FCommonData.SkinManager.ma[glIndex].R) div FCommonData.SkinManager.ma[glIndex].ImageCount) div 2,
(Height - ButtonHeight) div 2), Mode, 1, FCommonData.SkinManager.ma[FCommonData.SkinManager.ConstData.ComboGlyph], MakeCacheInfo(FCommonData.FCacheBmp));
end;
end;
procedure TsDBComboBox.PaintText;
var
R : TRect;
begin
FCommonData.FCacheBMP.Canvas.Font.Assign(Font);
R := Rect(3, 3, Width - 3, Height - 3);
WriteTextEx(FCommonData.FCacheBMP.Canvas, PChar(Text), True, R, DT_NOPREFIX or DT_TOP or DT_SINGLELINE or DT_WORDBREAK or GetStringFlags(Self, Alignment),
FCommonData, ControlIsActive(FCommonData));
end;
procedure TsDBComboBox.PrepareCache;
const
BordWidth = 3;
var
R : TRect;
State : TOwnerDrawState;
begin
FCommonData.InitCacheBmp;
PaintItem(FCommonData,
GetParentCache(FCommonData), True,
integer(ControlIsActive(FCommonData)),
Rect(0, 0, Width, Height),
Point(Left, top), FCommonData.FCacheBmp, False);
if Style <> csSimple then PaintButton;
// PaintText;
// PaintButton;
R := Rect(BordWidth, BordWidth, ButtonRect.Left, Height - BordWidth);
State := [odComboBoxEdit];
if (Focused or SkinData.FFocused) and not (Style in [csDropDown, csSimple]) and Enabled then State := State + [odFocused, odSelected];
DrawSkinItem(ItemIndex, R, State);
if not Enabled then
BmpDisabledKind(FCommonData.FCacheBmp, FDisabledKind, Parent, GetParentCache(FCommonData), Point(Left, Top));
FCommonData.BGChanged := False;
end;
procedure TsDBComboBox.SetAlignment(const Value: TAlignment);
begin
if FAlignment <> Value then begin
FAlignment := Value;
FCommonData.Invalidate;
end;
end;
procedure TsDBComboBox.SetButtonMargin(const Value: integer);
begin
if FButtonMargin <> Value then begin
FButtonMargin := Value;
FCommonData.Invalidate;
end;
end;
procedure TsDBComboBox.SetDisabledKind(const Value: TsDisabledKind);
begin
if FDisabledKind <> Value then begin
FDisabledKind := Value;
FCommonData.Invalidate;
end;
end;
procedure TsDBComboBox.WndProc(var Message: TMessage);
begin
if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
AC_CTRLHANDLED : begin Message.Result := 1; Exit end; // AlphaSkins supported
AC_REMOVESKIN : begin
CommonWndProc(Message, FCommonData);
Color := clWindow;
RecreateWnd;
exit
end;
AC_REFRESH : begin
CommonWndProc(Message, FCommonData);
if FCommonData.Skinned then begin
if not FCommonData.CustomColor then Color := FCommonData.SkinManager.gd[FCommonData.SkinIndex].Color;
if not FCommonData.CustomFont then Font.Color := FCommonData.SkinManager.gd[FCommonData.SkinIndex].FontColor[1];
end;
Repaint;
exit
end;
AC_SETNEWSKIN : begin
CommonWndProc(Message, FCommonData);
exit
end;
AC_DROPPEDDOWN : begin
Message.WParamLo := integer(DroppedDown);
end;
AC_ENDPARENTUPDATE : if FCommonData.Updating then begin
FCommonData.Updating := False;
Repaint;
Exit
end;
end;
if not ControlIsReady(Self) or not FCommonData.Skinned then inherited else begin
case Message.Msg of
WM_DRAWITEM :;
// WM_CTLCOLOREDIT, WM_ERASEBKGND : Exit;
WM_SETFOCUS, CM_ENTER : if CanFocus then begin
inherited;
// if Focused then begin
FCommonData.FFocused := True;
FCommonData.FMouseAbove := False;
FCommonData.BGChanged := True;
// Repaint;
// end;
end;
WM_KILLFOCUS, CM_EXIT: begin
DroppedDown := False;
FCommonData.FFocused := False;
FCommonData.FMouseAbove := False;
FCommonData.BGChanged := True;
// Repaint;
end;
WM_PRINT : begin
ControlState := ControlState + [csPaintCopy];
if not FCommonData.CustomColor then Color := FCommonData.SkinManager.gd[FCommonData.SkinIndex].Color;
if not FCommonData.CustomFont then Font.Color := FCommonData.SkinManager.gd[FCommonData.SkinIndex].FontColor[1];
SendMessage(Handle, WM_PAINT, Message.WParam, 0);
ControlState := ControlState - [csPaintCopy];
end;
WM_NCPAINT : begin
PaintBorder(0);
Exit;
end;
WM_PAINT : begin
// OurPaintHandler(TWMPaint(Message).DC);
inherited;
PaintBorder(TWMPaint(Message).DC);
Exit
end;
CM_MOUSEENTER, CM_MOUSELEAVE : {if gd[FCommonData.Skinindex].ReservedBoolean then v4} begin
FCommonData.FMouseAbove := Message.Msg = CM_MOUSEENTER;
FCommonData.BGChanged := True;
Repaint
end;
CN_COMMAND : begin
FDropDown := False;
Repaint;
end;
end;
CommonWndProc(Message, FCommonData);
inherited;
case Message.Msg of CM_VISIBLECHANGED, CM_ENABLEDCHANGED, WM_SETFONT : FCommonData.Invalidate; end;
end;
// Aligning of the bound label
if Assigned(BoundLabel) and Assigned(BoundLabel.FtheLabel) then case Message.Msg of
WM_SIZE, WM_WINDOWPOSCHANGED : BoundLabel.AlignLabel;
CM_VISIBLECHANGED : begin BoundLabel.FtheLabel.Visible := Visible; BoundLabel.AlignLabel end;
CM_ENABLEDCHANGED : begin BoundLabel.FtheLabel.Enabled := Enabled; BoundLabel.AlignLabel end;
CM_BIDIMODECHANGED : begin BoundLabel.FtheLabel.BiDiMode := BiDiMode; BoundLabel.AlignLabel end;
end;
end;
procedure TsDBComboBox.WriteText;
var
Flags: Longint;
R : TRect;
begin
if Text <> '' then begin
Flags := 0;
Canvas.Font.Assign(Font);
R := ClientRect;
dec(R.Left);
dec(R.Top);
dec(R.Right, ButtonRect.Left);
case Alignment of
taLeftJustify : begin
Flags := DT_LEFT;
end;
taRightJustify : begin
Flags := DT_RIGHT;
end;
taCenter : begin
Flags := DT_CENTER;
end
end;
Flags := Flags or DT_EXPANDTABS or DT_VCENTER or DT_SINGLELINE;
Flags := DrawTextBiDiModeFlags(Flags);
Canvas.Pen.Style := psSolid;
Canvas.Brush.Style := bsClear;
DrawText(Canvas.Handle, PChar(Text), Length(Text), R, Flags);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -