주요 버튼
DELPHI와 함께 제공되는 컨트롤을 사용할 때마다 모양, 색상 등 뭔가 빠진 듯한 느낌이 듭니다.
변형 방법에 관계없이 자신의 프로젝트에서 요구하는 표준과 모두 다릅니다.
나중에 다음 컨트롤이 매우 유용하다는 것을 알았습니다! ! !
소스 코드는 다음과 같습니다.
유닛 DsFancyButton;
인터페이스
용도
SysUtils, Windows, 메시지, 클래스, 그래픽, 컨트롤, 양식;
유형
TTextStyle = (txNone, txLowered, txRaised, txShadowed);
TShape = (shCapsule, shOval, shRectangle, shRoundRect);
TDsFancyButton = 클래스(TGraphicControl)
사적인
FButtonColor: TColor;
FIsDown: 부울;
FFrameColor: TColor;
FFrameWidth: 정수;
FCornerRadius: 정수;
FRgn, MRgn: HRgn;
FShape: TShape;
FTextColor: TColor;
FTextStyle: TTextStyle;
절차 SetButtonColor(값: TColor);
절차 CMEnabledChanged(var 메시지: TMessage);
메시지 CM_ENABLEDCHANGED;
절차 CMTextChanged(var 메시지: TMessage);
메시지 CM_TEXTCHANGED;
절차 CMDialogChar(var 메시지: TCMDialogChar);
메시지 CM_DIALOGCHAR;
절차 WMSize(var 메시지: TWMSize); 메시지 WM_PAINT;
보호됨
절차 클릭;
절차 DrawShape;
절차 페인트;
절차 SetFrameColor(값: TColor);
절차 SetFrameWidth(값: 정수);
절차 SetCornerRadius(값: 정수);
절차 SetShape(값: TShape);
절차 SetTextStyle(값: TTextStyle);
절차 WMLButtonDown(var 메시지: TWMLButtonDown);
WM_LBUTTONDOWN;
절차 WMLButtonUp(var 메시지: TWMLButtonUp);
WM_LBUTTONUP;
프로시저 WriteCaption;
공공의
생성자 Create(Aowner: TComponent) 재정의;
소멸자 재정의;
출판됨
속성 ButtonColor: TColor
FButtonColor 읽기 SetButtonColor 쓰기;
속성 캡션;
속성 DragCursor;
속성 DragMode;
속성 활성화;
속성 글꼴;
속성 FrameColor: TColor
FFrameColor 읽기 SetFrameColor 쓰기;
속성 FrameWidth: 정수
FFrameWidth 읽기, SetFrameWidth 쓰기;
속성 ParentFont;
속성 ParentShowHint;
속성 PopupMenu;
속성 CornerRadius: 정수
FCornerRadius 읽기 SetCornerRadius 쓰기;
속성 모양: TShape
FShape 읽기 SetShape 기본 shRoundRect 쓰기;
속성 ShowHint;
속성 TextStyle: TTextStyle
FTextStyle 읽기 SetTExtStyle 쓰기;
속성 표시;
속성 OnClick; 속성 OnDragDrop;
속성 OnDragOver; 속성 OnEndDrag;
속성 OnMouseDown; 속성 OnMouseUp;
PropertyOnMouseMove;
끝;
절차 등록;
구현
생성자 TDsFancyButton.Create(AOwner: TComponent);
시작하다
상속받은Create(소유자);
ControlStyle := [csClickEvents, csCaptureMouse, CSSetCaption];
활성화됨 := True;
FButtonColor := clBtnFace;
FIsDown := 거짓;
FFrameColor := clGray;
FFrameWidth := 6;
FCornerRadius := 10;
FRgn := 0;
FShape := shRoundRect;
FTextStyle := txRaised;
높이 := 25;
표시됨 := 참;
너비 := 97;
끝;
소멸자 TDsFancyButton.Destroy;
시작하다
삭제오브젝트(FRgn);
삭제오브젝트(MRgn);
상속됨 파괴;
끝;
절차 TDsFancyButton.Paint;
var 직경: 정수;
ClrUp, ClrDown: TColor;
시작하다
Canvas.Brush.Style := bsClear;
FIsDown이면
ClrUp := clBtnShadow 시작 := clBtnHighlight;
또 다른
ClrUp := clBtnHighlight; ClrDown := clBtnShadow;
Canvas do와 함께
시작하다
케이스 모양
shRoundRect:
시작하다
직경 := 2*CornerRadius;
Mrgn := CreateRoundRectRgn(0, 0, 너비, 높이, 직경,
디아);
끝;
sh캡슐:
시작하다
너비 < 높이이면 Dia := 너비 else Dia :=
키;
Mrgn := CreateRoundRectRgn(0, 0, 너비, 높이, 직경,
디아);
끝;
shRectangle: MRgn := CreateRectRgn(0, 0, 너비 - 1, 높이
- 1);
shOval: MRgn := CreateEllipticRgn(0, 0, 너비, 높이);
끝;//케이스
Canvas.Brush.Color := FButtonColor;
FillRgn(Handle, MRgn, Brush.Handle);
Brush.Color :=ClrUp;
FrameRgn(Handle, MRgn, Brush.Handle, 1,1);
OffsetRgn(MRgn, 1, 1);
Brush.Color := ClrDown;
FrameRgn(핸들, MRgn, Brush.Handle, 1, 1);
끝;//캔버스
도형 그리기;
캡션 쓰기;
끝;
절차 TDsFancyButton.DrawShape;
var
FC, 워나: TColor;
R, G, B: 바이트;
AwalR, AwalG, AwalB, AkhirR, AkhirG, AkhirB, n, t, Dia: 정수;
시작하다
FFrameWidth mod 2=0이면 t := FFrameWidth
else t := FFrameWidth + 1;
경고 := ColorToRGB(ButtonColor);
FC := ColorToRGB(프레임 색상);
Canvas.Brush.Color := 워나;
AwalR := GetRValue(FC); AkhirR := GetRValue(Warna);
AwalG := GetGValue(FC); AkhirG := GetGValue(Warna);
AwalB := GetBValue(FC); AkhirB := GetBValue(Warna);
FRgn := 0;
Canvas do와 함께
n := 0 ~ t - 1 do에 대해
시작하다
R := AwalR + Trunc(Sqrt(t*t - Sqr(tn))*(AkhirR - AwalR)/t);
G := AwalG + Trunc(Sqrt(t*t - Sqr(tn))*(AkhirG - AwalG)/t);
B := AwalB + Trunc(Sqrt(t*t - Sqr(tn))*(AkhirB - AwalB)/t);
브러시.색상 := RGB(R, G, B);
케이스 형태
shOval: FRgn := CreateEllipticRgn(1 + n, 1 + n, 너비 - n,
높이 - n);
shRoundRect:
시작하다
직경 := CornerRadius;
(Dia - n) >0이면
FRGn :=
CreateRoundRectRgn(1 + n, 1 + n ,너비 - n, 높이 -
n, 2*(직경 - n), 2*(직경 - n))
else FRgn := CreateRectRgn( 1 + n, 1 + n, 너비 - n - 1,
높이 - n - 1);
끝;
sh캡슐:
시작하다
if Width < Height then Dia := Width div 2 else Dia :=
높이 div 2;
(Dia - n) > 0이면
FRGn:=
CreateRoundRectRgn(1 + n, 1 + n, 너비 - n,
높이 - n, 2*(직경 - n), 2*(직경 - n))
else FRgn := CreateRectRgn(1 + n, 1 + n ,너비 - n -
1, 높이 - n - 1);
끝;
else FRgn := CreateRectRgn(1 + n, 1 + n, 너비 - n - 1,
높이 - n - 1);
끝;//케이스
FrameRgn(핸들, FRgn, Brush.Handle, 1, 1);
끝;
끝;
절차 TDsFancyButton.WriteCaption;
var
플래그: 단어;
BtnL, BtnT, BtnR, BtnB: 정수;
R, TR: TRect;
시작하다
R := ClientRect; TR := ClientRect;
Canvas.Font := 자체.글꼴;
Canvas.Brush.Style := bsClear;
플래그 := DT_CENTER 또는 DT_SINGLELINE;
Canvas.Font := 글꼴;
FIsDown이면 FTextColor := FrameColor
else FTextColor := Self.Font.Color;
캔버스로
시작하다
BtnT := (높이 - TextHeight(캡션)) div 2;
BtnB := BtnT + TextHeight(캡션);
BtnL := (너비 - 텍스트 너비(캡션)) div 2;
BtnR := BtnL + TextWidth(캡션);
TR := Rect(BtnL, BtnT, BtnR, BtnB);
R := TR;
if ((TextStyle = txLowered) 및 FIsDown ) 또는
((TextStyle = txRaised) 및 FIsDown 아님) 그런 다음
시작하다
Font.Color := clBtnHighLight;
OffsetRect(TR, -1 + 1, -1 + 1);
DrawText(핸들, PChar(캡션), 길이(캡션), TR,
플래그);
끝
else if ((TextStyle = txLowered)이고 FIsDown이 아님) 또는
((TextStyle = txRaised) 및 FIsDown) 그런 다음
시작하다
Font.Color := clBtnHighLight;
OffsetRect(TR, + 2, + 2);
DrawText(핸들, PChar(캡션), 길이(캡션), TR,
플래그);
끝
그렇지 않은 경우 (TextStyle = txShadowed) 및 FIsDown
시작하다
Font.Color := clBtnShadow;
OffsetREct(TR, 3 + 1, 3 + 1);
DrawText(핸들, PChar(캡션),
길이(캡션), TR, 플래그);
끝
그렇지 않으면 (TextStyle = txShadowed)이고 FIsDown이 아닌 경우
그 다음에
시작하다
Font.Color := clBtnShadow;
OffsetRect(TR, 2 + 1, 2 + 1);
DrawText(핸들, PChar(캡션),
길이(캡션), TR, 플래그);
끝;
활성화된 경우 Font.Color := FTextColor//self.Font.Color
그렇지 않은 경우 (TextStyle = txShadowed) 활성화되지 않은 경우
Font.Color := clBtnFace
else Font.Color := clBtnShadow;
FIsDown이면 OffsetRect(R, 1, 1)
else OffsetRect(R, -1, -1);
DrawText(핸들, PChar(캡션), 길이(캡션), R, 플래그);
끝;
끝;
절차 TDsFancyButton.SetButtonColor(값: TColor);
시작하다
값 <> FButtonColor인 경우
FButtonColor 시작:= 값 무효화;
끝;
절차 TDsFancyButton.WMLButtonDown(var 메시지:
TWML버튼다운);
시작하다
PtInRegion(MRgn, message.xPos, message.yPos)이 아니면 종료합니다.
FIsDown := 참;
페인트;
상속됨;
끝;
절차 TDsFancyButton.WMLButtonUp(var 메시지: TWMLButtonUp);
시작하다
FIsDown이 아니면 종료합니다.
FIsDown := 거짓;
페인트;
상속됨;
끝;
절차 TDsFancyButton.SetShape(값: TShape);
시작하다
값 <> FShape이면
FShape 시작 := 값 무효화;
끝;
절차 TDsFancyButton.SetTextStyle(값: TTextStyle);
시작하다
값<>FTextStyle이면
FTextStyle 시작 := 값 무효화;
끝;
절차 TDsFancyButton.SetFrameColor(값: TColor);
시작하다
만약 Value<>FFrameColor라면
FFrameColor 시작 := 값 무효화;끝;
끝;
절차 TDsFancyButton.SetFrameWidth(값: 정수);
var
w: 정수;
시작하다
if Width<height then w := 너비 else w := Height;
if Value<>FFrameWidth then FFrameWidth := value;
FFrameWidth < 4이면 FFrameWidth := 4;
if FFrameWidth >(w div 2) then FFrameWidth := (w div 2);
무효화하다;
끝;
절차 TDsFancyButton.SetCornerRadius(값: 정수);
var
w: 정수;
시작하다
if Width<Height then w := 너비 else w := Height;
if value<>FCornerRadius then FCornerRadius := value;
FCornerRadius<3이면 FCornerRadius := 3;
FCornerRadius>w이면 FCornerRadius := w;
무효화하다;
끝;
절차 TDsFancyButton.CMEnabledChanged(var 메시지: Tmessage);
시작하다
상속됨;
무효화하다;
끝;
절차 TDsFancyButton.CMTextChanged(var 메시지: TMessage);
시작하다
무효화하다;
끝;
절차 TDsFancyButton.CMDialogChar(var message:TCMDialogChar);
시작하다
메시지를 사용하면
IsAccel(CharCode, Caption) 및 활성화된 경우
시작 클릭; 결과 := 1 ;끝
그렇지 않으면 상속됩니다.
끝;
절차 TDsFancyButton.WMSize(var 메시지: TWMSize);
시작하다
상속됨;
너비>300이면 너비 := 300;
높이>300이면 높이 := 300;
끝;
절차 TDsFancyButton.Click;
시작하다
FIsDown := 거짓;
무효화하다;
상속된 클릭;
끝;
절차 등록;
시작하다
RegisterComponents('WYM 컴포넌트',[TDsFancyButton]);
끝;
끝.
겐바이창.