ปุ่มเด่น
เมื่อใดก็ตามที่ฉันใช้ส่วนควบคุมที่มาพร้อมกับ 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);
ได้รับการคุ้มครอง
ขั้นตอน คลิก;
ขั้นตอน DrawShape;
ขั้นตอนการทาสี;
ขั้นตอน SetFrameColor (ค่า: TColor);
ขั้นตอน SetFrameWidth (ค่า: จำนวนเต็ม);
ขั้นตอน SetCornerRadius (ค่า: จำนวนเต็ม);
ขั้นตอน SetShape (ค่า: TShape);
ขั้นตอน SetTextStyle (ค่า: TTextStyle);
ขั้นตอน WMLButtonDown (ข้อความ var: TWMLButtonDown);
WM_LBUTTONDOWN;
ขั้นตอน WMLButtonUp (ข้อความ var: TWMLButtonUp);
WM_LBUTTONUP;
ขั้นตอน WriteCaption;
สาธารณะ
ตัวสร้างสร้าง (Aowner: TComponent);
destructor ทำลายล้าง;
ที่ตีพิมพ์
คุณสมบัติ 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;
คุณสมบัติ OnMouseMove;
จบ;
ขั้นตอนการลงทะเบียน;
การดำเนินการ
ตัวสร้าง TDsFancyButton.Create (AOwner: TComponent);
เริ่ม
สืบทอดสร้าง (เจ้าของ);
ControlStyle := [csClickEvents, csCaptureMouse, CSSetCaption];
เปิดใช้งาน := จริง;
FButtonColor := clBtnFace;
FIsDown := เท็จ;
FFrameColor := clGray;
FFFrameWidth := 6;
รัศมีของมุม := 10;
FRgn := 0;
FShape := shRoundRect;
FTextStyle := txRaised;
ส่วนสูง := 25;
มองเห็นได้ := จริง;
ความกว้าง := 97;
จบ;
destructor TDsFancyButton.ทำลาย;
เริ่ม
ลบวัตถุ(FRgn);
ลบวัตถุ(MRgn);
สืบทอดมาทำลาย;
จบ;
ขั้นตอน TDsFancyButton.Paint;
var Dia: จำนวนเต็ม;
ClrUp, ClrDown: TColor;
เริ่ม
Canvas.Brush.Style := bsClear;
ถ้า FIsDown แล้ว
เริ่มต้น ClrUp := clBtnShadow;
อื่น
เริ่มต้น ClrUp := clBtnHighlight;
กับแคนวาสทำ
เริ่ม
กรณีรูปร่างของ
shRoundRect:
เริ่ม
เส้นผ่านศูนย์กลาง := 2*รัศมีมุม;
Mrgn := CreateRoundRectRgn(0, 0, ความกว้าง, ความสูง, Dia,
เส้นผ่านศูนย์กลาง);
จบ;
ชแคปซูล:
เริ่ม
ถ้าความกว้าง < ความสูงแล้ว Dia := ความกว้าง อย่างอื่น Dia :=
ความสูง;
Mrgn := CreateRoundRectRgn(0, 0, ความกว้าง, ความสูง, Dia,
เส้นผ่านศูนย์กลาง);
จบ;
shRectangle: MRgn := CreateRectRgn(0, 0, ความกว้าง - 1, ความสูง
- 1); - 1);
shOval: MRgn := CreateEllipticRgn(0, 0, ความกว้าง, ความสูง);
จบ;//กรณี
Canvas.Brush.Color := FButtonColor;
FillRgn(จัดการ, MRgn, แปรง.จัดการ);
แปรง.สี :=ClrUp;
FrameRgn(แฮนเดิล, MRgn, แปรงแฮนเดิล, 1,1);
OffsetRgn(MRgn, 1, 1);
Brush.Color := ClrDown;
FrameRgn(แฮนเดิล, MRgn, แปรงแฮนเดิล, 1, 1);
จบ;//ผ้าใบ
วาดรูปร่าง;
เขียนคำอธิบาย;
จบ;
ขั้นตอน TDsFancyButton.DrawShape;
var
เอฟซี สี: TColor;
R, G, B: ไบต์;
AwalR, AwalG, AwalB, AkhirR, AkhirG, AkhirB, n, t, Dia: จำนวนเต็ม;
เริ่ม
ถ้า FFrameWidth mod 2=0 แล้ว t := FFrameWidth
อย่างอื่น t := FFrameWidth + 1;
สี := ColorToRGB(ButtonColor);
เอฟซี := ColorToRGB(FrameColor);
Canvas.Brush.Color := สี;
AwalR := GetRValue(เอฟซี);
AwalG := GetGValue(เอฟซี);
AwalB := GetBValue(เอฟซี);
FRgn := 0;
กับแคนวาสทำ
สำหรับ 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:
เริ่ม
Dia := รัศมีมุม;
ถ้า (Dia - n) >0 แล้ว
FRgn :=
CreateRoundRectRgn(1 + n, 1 + n ,ความกว้าง - n, ความสูง -
n, 2*(เส้นผ่านศูนย์กลาง - n), 2*(เส้นผ่านศูนย์กลาง - n))
อื่น FRgn := CreateRectRgn( 1 + n, 1 + n, ความกว้าง - n - 1,
ความสูง - n - 1);
จบ;
ชแคปซูล:
เริ่ม
ถ้าความกว้าง <ความสูงแล้ว Dia := ความกว้าง div 2 อย่างอื่น Dia :=
ส่วนสูง 2;
ถ้า (Dia - n) > 0 แล้ว
FRgn:=
CreateRoundRectRgn(1 + n, 1 + n, ความกว้าง - n,
ความสูง - n, 2*(เส้นผ่านศูนย์กลาง - n), 2*(เส้นผ่านศูนย์กลาง - n))
อื่น FRgn := CreateRectRgn(1 + n, 1 + n ,ความกว้าง - n -
1 ความสูง - n - 1);
จบ;
อื่น FRgn := CreateRectRgn(1 + n, 1 + n, ความกว้าง - n - 1,
ความสูง - n - 1);
จบ;//กรณี
FrameRgn(แฮนเดิล, FRgn, แปรงแฮนเดิล, 1, 1);
จบ;
จบ;
ขั้นตอน TDsFancyButton.WriteCaption;
var
ธง: คำ;
BtnL, BtnT, BtnR, BtnB: จำนวนเต็ม;
R, TR: TRect;
เริ่ม
R := ลูกค้า REct; TR := ลูกค้า Rect;
Canvas.Font := ตนเอง.แบบอักษร;
Canvas.Brush.Style := bsClear;
ธง := DT_CENTER หรือ DT_SINGLELINE;
Canvas.Font := แบบอักษร;
ถ้า FIsDown แล้ว FTextColor := FrameColor
อื่น FTextColor := Self.Font.Color;
ด้วยผ้าใบทำ
เริ่ม
BtnT := (ความสูง - TextHeight (คำบรรยายภาพ)) div 2;
BtnB := BtnT + TextHeight (คำบรรยาย);
BtnL := (ความกว้าง - TextWidth (คำบรรยายภาพ)) div 2;
BtnR := BtnL + TextWidth (คำบรรยาย);
TR := Rect(BtnL, BtnT, BtnR, BtnB);
ร := TR;
ถ้า ((TextStyle = txLowered) และ FIsDown ) หรือ
((TextStyle = txRaised) และไม่ใช่ FIsDown) จากนั้น
เริ่ม
Font.Color := clBtnHighLight;
ออฟเซ็ตเรคท์(TR, -1 + 1, -1 + 1);
DrawText (ตัวจัดการ, PChar (คำบรรยาย), ความยาว (คำบรรยาย), TR,
ธง);
จบ
อย่างอื่นถ้า ((TextStyle = txLowered) และไม่ใช่ FIsDown) หรือ
((TextStyle = txRaised) และ FIsDown) จากนั้น
เริ่ม
Font.Color := clBtnHighLight;
ออฟเซ็ตเรคท์(TR, + 2, + 2);
DrawText (ตัวจัดการ, PChar (คำบรรยาย), ความยาว (คำบรรยาย), TR,
ธง);
จบ
อย่างอื่นถ้า (TextStyle = txShadowed) และ FIsDown แล้ว
เริ่ม
Font.Color := clBtnShadow;
ชดเชยRect(TR, 3 + 1, 3 + 1);
DrawText (ตัวจัดการ, PChar (คำบรรยาย),
ความยาว(คำบรรยาย), TR, ธง);
จบ
อย่างอื่นถ้า (TextStyle = txShadowed) และไม่ใช่ FIsDown
แล้ว
เริ่ม
Font.Color := clBtnShadow;
ออฟเซ็ตเรคท์(TR, 2 + 1, 2 + 1);
DrawText (ตัวจัดการ, PChar (คำบรรยาย),
ความยาว(คำบรรยาย), TR, ธง);
จบ;
ถ้าเปิดใช้งานแล้ว Font.Color := FTextColor//self.Font.Color
อย่างอื่นถ้า (TextStyle = txShadowed) และไม่ได้เปิดใช้งานแล้ว
Font.Color := clBtnFace
อื่น Font.Color := clBtnShadow;
ถ้า FIsDown แล้ว OffsetRect(R, 1, 1)
อย่างอื่น OffsetRect(R, -1, -1);
DrawText (ตัวจัดการ, PChar (คำบรรยาย), ความยาว (คำบรรยาย), R, ธง);
จบ;
จบ;
ขั้นตอน TDsFancyButton.SetButtonColor (ค่า: TColor);
เริ่ม
ถ้าค่า <> FButtonColor แล้ว
start FButtonColor := value ;
จบ;
ขั้นตอน TDsFancyButton.WMLButtonDown (ข้อความ var:
TWMLButtonDown);
เริ่ม
ถ้าไม่ใช่ 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: จำนวนเต็ม;
เริ่ม
ถ้าความกว้าง<ความสูงแล้ว w := ความกว้าง อย่างอื่น w := ความสูง;
ถ้า Value<>FFrameWidth แล้ว FFrameWidth := value;
ถ้า FFrameWidth < 4 แล้ว FFrameWidth := 4;
ถ้า FFrameWidth >(w div 2) ดังนั้น FFrameWidth := (w div 2);
ไม่ถูกต้อง;
จบ;
ขั้นตอน TDsFancyButton.SetCornerRadius (ค่า: จำนวนเต็ม);
var
w: จำนวนเต็ม;
เริ่ม
ถ้าความกว้าง<ความสูงแล้ว w := ความกว้าง อย่างอื่น w := ความสูง;
ถ้าค่า<>FCornerRadius แล้ว FCornerRadius := value;
ถ้า FCornerRadius<3 แล้ว FCornerRadius := 3;
ถ้า FCornerRadius>w แล้ว FCornerRadius := w;
ไม่ถูกต้อง;
จบ;
ขั้นตอน TDsFancyButton.CMEnabledChanged (ข้อความ var: Tmessage);
เริ่ม
สืบทอด;
ไม่ถูกต้อง;
จบ;
ขั้นตอน TDsFancyButton.CMTextChanged (ข้อความ var: TMessage);
เริ่ม
ไม่ถูกต้อง;
จบ;
ขั้นตอน TDsFancyButton.CMDialogChar (ข้อความ var: TCMDialogChar);
เริ่ม
ด้วยข้อความทำ
ถ้า IsAccel (CharCode, คำบรรยายภาพ) และเปิดใช้งานแล้ว
เริ่มคลิก; ผลลัพธ์ := 1 ;สิ้นสุด
อย่างอื่นสืบทอด;
จบ;
ขั้นตอน TDsFancyButton.WMSize (ข้อความ var: TWMSize);
เริ่ม
สืบทอด;
ถ้าความกว้าง>300 ดังนั้นความกว้าง := 300;
ถ้าความสูง>300 ดังนั้นความสูง := 300;
จบ;
ขั้นตอน TDsFancyButton.Click;
เริ่ม
FIsDown := เท็จ;
ไม่ถูกต้อง;
คลิกสืบทอด;
จบ;
ขั้นตอนการลงทะเบียน;
เริ่ม
RegisterComponents('ส่วนประกอบ WYM',[TDsFancyButton]);
จบ;
จบ.
เกิง ไป่เฉียง.