注目のボタン
DELPHI に付属のコントロールを使用するたびに、形や色など、何かが足りないと感じます。
どのような変換方法であっても、それらはすべて自分のプロジェクトで要求される基準とは異なります。いくつかの本を参照しました。
後で、次のコントロールが非常に便利であることがわかりました。 ! !
そのソースコードは次のとおりです。
ユニット DsFancyButton;
インタフェース
用途
SysUtils、Windows、メッセージ、クラス、グラフィックス、コントロール、フォーム。
タイプ
TTextStyle = (txNone、txLowered、txRaized、txShadow);
TShape = (shCapsule、shOval、shRectangle、shRoundRect);
TDsFancyButton = クラス(TGraphicControl)
プライベート
Fボタンカラー: Tカラー;
FIsDown: ブール値。
Fフレームカラー: Tカラー;
FFrameWidth: 整数;
FCornerRadius: 整数;
FRgn、MRgn:HRgn;
F形状: T形状;
FTextColor: TColor;
FTextStyle: TTextStyle;
プロシージャ SetButtonColor(値: TColor);
プロシージャ CMEnabledChanged(var message: TMessage);
メッセージ CM_ENABLEDCHANGED;
プロシージャ CMTextChanged(var message: TMessage);
メッセージ CM_TEXTCHANGED;
プロシージャ CMDialogChar(var message: 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;
公共
コンストラクター 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;
プロパティ OnDragOver;
プロパティ OnMouseDown;
PropertyOnMouseMove;
終わり;
手順 登録;
実装
コンストラクター TDsFancyButton.Create(AOwner: TComponent);
始める
継承された作成(Aowner);
ControlStyle := [csClickEvents、csCaptureMouse、CSSetCaption];
有効 := True;
FButtonColor := clBtnFace;
FIsDown := False;
FFrameColor := clGray;
FFrameWidth := 6;
Fコーナー半径 := 10;
FRgn := 0;
FShape := shRoundRect;
FTextStyle := txRaized;
高さ:= 25;
表示可能 := True;
幅:= 97;
終わり;
デストラクター TDsFancyButton.Destroy;
始める
オブジェクトの削除(FRgn);
オブジェクトの削除(MRgn);
継承された破壊。
終わり;
プロシージャ TDsFancyButton.Paint;
var Dia: 整数;
ClrUp、ClrDown: TColor;
始める
Canvas.Brush.Style := bsClear;
FIsDown の場合
開始 ClrUp := clBtnShadow; 終了 ClrDown := clBtnHighlight
それ以外
開始 ClrUp := clBtnHighlight := clBtnShadow;
キャンバスドゥで
始める
ケースの形状
shRoundRect:
始める
直径 := 2*コーナー半径;
Mrgn := CreateRoundRectRgn(0, 0, 幅, 高さ, 直径,
ディア);
終わり;
shカプセル:
始める
幅 < 高さの場合、直径 := 幅、そうでない場合、直径 :=
身長;
Mrgn := CreateRoundRectRgn(0, 0, 幅, 高さ, 直径,
ディア);
終わり;
shRectangle: MRgn := CreateRectRgn(0, 0, 幅 - 1, 高さ
- 1);
shOval: MRgn := CreateEllipticRgn(0, 0, 幅, 高さ);
終了;//ケース
Canvas.Brush.Color := FButtonColor;
FillRgn(ハンドル、MRgn、ブラシ.ハンドル);
Brush.Color :=ClrUp;
FrameRgn(ハンドル, MRgn, Brush.Handle, 1,1);
オフセットRgn(MRgn, 1, 1);
Brush.Color := ClrDown;
FrameRgn(ハンドル, MRgn, Brush.Handle, 1, 1);
終了;//キャンバス
描画シェイプ;
キャプションを書きます;
終わり;
プロシージャ TDsFancyButton.DrawShape;
変数
FC、ワーナ: TColor;
R、G、B: バイト。
AwalR、AwalG、AwalB、AkhirR、AkhirG、AkhirB、n、t、Dia: 整数。
始める
FFrameWidth mod 2=0 の場合、 t := FFrameWidth
それ以外の場合は 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;
キャンバスドゥで
for n := 0 から t - 1 まで
始める
R := AwalR + Trunc(Sqrt(t*t - Sqr(tn))*(AkhirR - AwalR)/t);
G := AwalG + Trunc(Sqrt(t*t - Sqr(tn))*(AkhirG - AwalG)/t);
B := AwalB + Trurc(Sqrt(t*t - Sqr(tn))*(AkhirB - AwalB)/t);
Brush.Color := RGB(R, G, B);
ケース形状
shOval: FRgn := CreateEllipticRgn(1 + n, 1 + n, 幅 - n,
高さ - n);
shRoundRect:
始める
直径 := コーナー半径;
(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 幅 < 高さ then Dia := 幅 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 ,Width - n -
1、高さ - n - 1);
終わり;
else FRgn := CreateRectRgn(1 + n, 1 + n, 幅 - n - 1,
高さ - n - 1);
終了;//場合
FrameRgn(ハンドル, FRgn, ブラシ.ハンドル, 1, 1);
終わり;
終わり;
プロシージャ TDsFancyButton.WriteCaption;
変数
フラグ: ワード;
BtnL、BtnT、BtnR、BtnB: 整数。
R、TR: TRect;
始める
R := クライアントRect; TR := クライアントRect;
Canvas.Font := Self.Font;
Canvas.Brush.Style := bsClear;
フラグ := DT_CENTER または DT_SINGLELINE;
Canvas.Font := フォント;
FIsDown の場合、FTextColor := FrameColor
else FTextColor := Self.Font.Color;
キャンバスドゥ付き
始める
BtnT := (高さ - テキスト高さ(キャプション)) div 2;
BtnB := BtnT + TextHeight(キャプション);
BtnL := (幅 - テキスト幅(キャプション)) div 2;
BtnR := BtnL + TextWidth(キャプション);
TR := Rect(BtnL, BtnT, BtnR, BtnB);
R := TR;
if ((TextStyle = txLowered) および FIsDown ) または
((TextStyle = txRaized) であり、FIsDown ではありません) 次に、
始める
Font.Color := clBtnHighLight;
OffsetRect(TR, -1 + 1, -1 + 1);
DrawText(ハンドル、PChar(キャプション)、長さ(キャプション)、TR、
フラグ);
終わり
else if ((TextStyle = txLowered) かつ FIsDown ではない) または
((TextStyle = txRaized) および FIsDown) 次に、
始める
Font.Color := clBtnHighLight;
OffsetRect(TR, + 2, + 2);
DrawText(ハンドル、PChar(キャプション)、長さ(キャプション)、TR、
フラグ);
終わり
else if (TextStyle = txShadowed) および FIsDown then
始める
Font.Color := clBtnShadow;
オフセットREct(TR, 3 + 1, 3 + 1);
DrawText(ハンドル, PChar(キャプション),
長さ(キャプション、TR、フラグ);
終わり
else if (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);
始める
if 値 <> FButtonColor then
FButtonColor := 値を無効にする;
終わり;
プロシージャ TDsFancyButton.WMLButtonDown(var メッセージ:
TWMLButtonDown);
始める
PtInRegion(MRgn, message.xPos, message.yPos) でない場合は終了します。
FIsDown := True;
ペイント;
継承された。
終わり;
プロシージャ TDsFancyButton.WMLButtonUp(var message: TWMLButtonUp);
始める
FIsDown でない場合は終了します。
FIsDown := False;
ペイント;
継承された。
終わり;
プロシージャ TDsFancyButton.SetShape(値: TShape);
始める
if 値 <> FShape then
FShape := 値を無効にする;
終わり;
プロシージャ TDsFancyButton.SetTextStyle(値: TTextStyle);
始める
if value<>FTextStyle then
FTextStyle := 値を無効にする;
終わり;
プロシージャ TDsFancyButton.SetFrameColor(値: TColor);
始める
if Value<>FFrameColor then
FFrameColor := 値を開始; 終了;
終わり;
プロシージャ TDsFancyButton.SetFrameWidth(値: 整数);
変数
w: 整数;
始める
幅<高さの場合は w := 幅、そうでない場合は w := 高さ;
if Value<>FFrameWidth then FFrameWidth := 値;
FFrameWidth < 4 の場合、FFrameWidth := 4;
if FFrameWidth >(w div 2) then FFrameWidth := (w div 2);
無効化します。
終わり;
プロシージャ TDsFancyButton.SetCornerRadius(値: 整数);
変数
w: 整数。
始める
幅<高さの場合は w := 幅、そうでない場合は w := 高さ;
if value<>FCornerRadius then FCornerRadius := 値;
FCornerRadius<3 の場合、FCornerRadius := 3;
if FCornerRadius>w then FCornerRadius := w;
無効化します。
終わり;
プロシージャ TDsFancyButton.CMEnabledChanged(var message: Tmessage);
始める
継承された。
無効化する。
終わり;
プロシージャ TDsFancyButton.CMTextChanged(var message: TMessage);
始める
無効化します。
終わり;
プロシージャ TDsFancyButton.CMDialogChar(var message:TCMDialogChar);
始める
メッセージ付きで行う
IsAccel (CharCode, Caption) で有効な場合
開始 クリック結果 := 1 ;終了
それ以外は継承されます。
終わり;
プロシージャ TDsFancyButton.WMSize(var メッセージ: TWMSize);
始める
継承された。
幅>300の場合、幅:= 300;
高さ > 300 の場合、高さ := 300;
終わり;
プロシージャ TDsFancyButton.Click;
始める
FIsDown := False;
無効化します。
継承されたクリック;
終わり;
手順 登録;
始める
RegisterComponents('WYM COMPONENT',[TDsFancyButton]);
終わり;
終わり。
耿百強さん。