📄 sdblookupcombobox.pas
字号:
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);
{$IFDEF DYNAMICCACHE}
if Assigned(FCommonData.FCacheBmp) then FreeAndNil(FCommonData.FCacheBmp);
{$ENDIF}
finally
RestoreDC(DC, SavedDC);
ReleaseDC(Handle, DC);
end;
end;
procedure TsDBLookupComboBox.PaintButton;
var
R : TRect;
Mode : integer;
c : TsColor;
glIndex : integer;
TmpBtn : TBitmap;
begin
if ListVisible 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(0, 0), 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]);
end;
end;
procedure TsDBLookupComboBox.PaintText;
var
R : TRect;
begin
R := Rect(4, 3, ButtonRect.Left, Height - 3);
FCommonData.FCacheBMP.Canvas.Font.Assign(Font);
if Focused then begin
FCommonData.FCacheBMP.Canvas.Brush.Color := clHighLight;
FCommonData.FCacheBMP.Canvas.FillRect(R);
FCommonData.FCacheBMP.Canvas.Font.Color := colortoRGB(clHighLightText);
FCommonData.FCacheBMP.Canvas.TextRect(R, R.Left + 1, R.Top + 1, Text);
FCommonData.FCacheBMP.Canvas.DrawFocusRect(R);
// FocusRect(FCommonData.FCacheBMP.Canvas, R);
// DrawText(FCommonData.FCacheBMP.Canvas.Handle, PChar(Text), 0, R, DT_TOP or DT_SINGLELINE or DT_WORDBREAK or GetStringFlags(Self, Alignment));
end
else 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 TsDBLookupComboBox.PrepareCache;
begin
FCommonData.InitCacheBmp;
PaintItem(FCommonData,
GetParentCache(FCommonData), True,
integer(ControlIsActive(FCommonData)),
Rect(0, 0, Width, Height),
Point(Left, top), FCommonData.FCacheBmp, False);
PaintText;
PaintButton;
if not Enabled then
BmpDisabledKind(FCommonData.FCacheBmp, FDisabledKind, Parent, GetParentCache(FCommonData), Point(Left, Top));
end;
procedure TsDBLookupComboBox.SetAlignment(const Value: TAlignment);
begin
if FAlignment <> Value then begin
FAlignment := Value;
FCommonData.Invalidate;
end;
end;
procedure TsDBLookupComboBox.SetButtonMargin(const Value: integer);
begin
if FButtonMargin <> Value then begin
FButtonMargin := Value;
FCommonData.Invalidate;
end;
end;
procedure TsDBLookupComboBox.SetDisabledKind(const Value: TsDisabledKind);
begin
if FDisabledKind <> Value then begin
FDisabledKind := Value;
FCommonData.Invalidate;
end;
end;
procedure TsDBLookupComboBox.WndProc(var Message: TMessage);
begin
{$IFDEF LOGGED}
AddToLog(Message);
{$ENDIF}
if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
AC_CTRLHANDLED : begin Message.LParam := 1; Exit end; // AlphaSkins supported
AC_REMOVESKIN : begin
CommonWndProc(Message, FCommonData);
if Assigned(ListSW) then begin
FreeAndNil(ListSW);
lBoxHandle := 0;
end;
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(ListVisible);//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 : alert;
WM_CTLCOLOREDIT, WM_ERASEBKGND : Exit;
WM_SETFOCUS, CM_ENTER : if CanFocus then begin
FCommonData.FFocused := True;
FCommonData.FMouseAbove := False;
FCommonData.BGChanged := True;
inherited;
Exit
end;
WM_KILLFOCUS, CM_EXIT: begin
FCommonData.FFocused := False;
FCommonData.FMouseAbove := False;
FCommonData.BGChanged := True;
inherited;
Exit
end;
WM_NCPAINT : begin
PaintBorder;
Exit;
end;
WM_PAINT : begin
if Focused then inherited;
OurPaintHandler;
Exit
end;
CM_MOUSEENTER, CM_MOUSELEAVE : begin
FCommonData.FMouseAbove := Message.Msg = CM_MOUSEENTER;
FCommonData.BGChanged := True;
// Repaint;
end;
WM_CTLCOLORLISTBOX : if not (csLoading in ComponentState) and (lBoxHandle = 0) then begin
// if Items.Count > DropDownCount then begin
lBoxHandle := hwnd(Message.LParam);
ListSW := TacComboListWnd.Create(lboxhandle, nil, SkinData.SkinManager, s_Edit);
// if Style = csSimple then
TacComboListWnd(ListSW).SimplyBox := True
// else TacComboListWnd(ListSW).SimplyBox := False;
// end;
end;
end;
CommonWndProc(Message, FCommonData);
inherited;
case Message.Msg of
CM_VISIBLECHANGED, CM_ENABLEDCHANGED, WM_SETFONT : begin
FCommonData.Invalidate;
end;
end;
end;
// Aligning of the bound label
if Assigned(BoundLabel) and Assigned(BoundLabel.FtheLabel) then case Message.Msg of
WM_SIZE, WM_MOVE : 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 TsDBLookupComboBox.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, ButtonWidth);
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 + -