2011-12-13 10 views
3

Delphi XE2のバージョンがないようで、一部のアセンブリを使用しているように見えるので、Toolbar2000を通常のツールバーに切り替えることを試みています。私がする必要がなければ本当にそれに対処したい。 (と私は本当にDelphiのツールバーでフェードインの効果が好きです)Delphiのツールボタン(TToolbutton)のストリップ効果

しかし、私は好きではないのは、ボタンの背景は、青いボタンの定期的な治療を取得することです。私は色を変更する方法を知っていますが、私はちょうど色の変更を行うことはできませんし、境界線をボタンの周りに塗っていない?

私は 'OnAdvancedCustomDrawButton'を実装しましたが、使用可能なフラグが正しく機能していないようで、グラデーションの色とホットトラックの色とどうやって相互作用するのか分かりません。奇妙な黒の背景。ここで

は、私はツールバー

ToolBar1 := TToolBar.Create(Self); 
ToolBar1.DoubleBuffered := true; 
ToolBar1.OnAdvancedCustomDrawButton := Toolbar1CustomDrawButton; 
ToolBar1.Transparent := false; 
ToolBar1.Parent := Self; 
ToolBar1.GradientEndColor := $7ca0c2; //RGB(194, 160, 124); 
ToolBar1.GradientStartColor := $edeeed; //RGB(237, 238, 124); 
ToolBar1.Indent := 5; 
ToolBar1.Images := Normal; 
ToolBar1.DrawingStyle := dsGradient; 
ToolBar1.HotImages := Over; 
ToolBar1.AutoSize := True; 
ToolBar1.Visible := False; 

を作成しています方法ですと、ここで私は(ループ内)ボタンを作成しています方法は次のとおりです。私のAdvancedCustomDrawButton機能をここ

ToolButton := TToolButton.Create(ToolBar1); 
ToolButton.Parent := ToolBar1; 
ToolButton.ImageIndex := ToolButtonImages[Index].ImageIndex; 
ToolButton.OnClick := ToolButtonClick; 

としています

procedure TMyForm.Toolbar1CustomDrawButton(Sender: TToolBar; Button: TToolButton; 
    State: TCustomDrawState; Stage: TCustomDrawStage; 
    var Flags: TTBCustomDrawFlags; var DefaultDraw: Boolean); 
begin 
    Flags := [tbNoEdges, tbNoOffset]; 
    DefaultDraw := True; 
end; 
+0

それはあなたが親オブジェクトから継承することができますDelphiのため、 initialize()の後でオブジェクトのデクレレーションのコードサンプルがあるか、オブジェクトをインスタンス化する方法が好きな場合は、そこをオーバーライドして値を設定できます。 – MethodMan

+0

OK、自分のコードを追加しましたが、必ずしも役立つとは思わないが、何を上書きしますか?私は自分のTToolButtonを作ることは助けになるとは思わない。なぜなら、既存のペイント機能は、私が取り除こうとしているものがどこにあってもないからだ。たぶん私は 'defaultdraw:= false'を設定し、すべて自分で行う必要があります。 –

+0

ここにToolBar1:= TToolBar.Create(Self);私はあなたがそのインスタンスを変えたいと思っています。また、私は所有者が誰であるかわかりません。親を参照してください。基本的に、オブジェクトを作成したい、親を割り当てる、所有者がコントロールまたはコントロールが存在するパネルになる、そのプロパティ/私はこのラップトップにデルファイを持っていません。それは私の他のものです。 – MethodMan

答えて

2

ツールバーの描画スタイルをdsNormalに設定し、を設定します。から[drawNoEdges]をカスタム描画ハンドラに追加します。

更新:

2KとXP、Vistaと7のための上記の作品は、ボタンの背景が描かれていないときの境界線を描画しないように見えるものの。残念ながらVCLでTTBCustomDrawFlagsを入力してこれを実現することは不可能なので、カスタム描画ハンドラの枠線を取り除くことはできません。

ツールバーは、通知メッセージが親ウィンドウに送信されているので、我々はWM_NOTIFYのハンドラを置くことができ、フォーム自体にある場合は、次のツールバーが、その後、パネルのように、別のウィンドウで親とされている場合は

type 
    TForm1 = class(TForm) 
    .. 
    private 
    procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY; 
    .. 
    .. 

procedure TForm1.WMNotify(var Msg: TWMNotify); 
begin 
    inherited; 
    if (Msg.NMHdr.code = NM_CUSTOMDRAW) and 
     Assigned(Toolbar1) and (Toolbar1.HandleAllocated) and 
     (Msg.NMHdr.hwndFrom = ToolBar1.Handle) then 

    case PNMTBCustomDraw(Msg.NMHdr).nmcd.dwDrawStage of 
     CDDS_PREPAINT: Msg.Result := Msg.Result or CDRF_NOTIFYITEMDRAW; 
     CDDS_ITEMPREPAINT: Msg.Result := TBCDRF_NOEDGES or TBCDRF_NOBACKGROUND; 
          // NOEDGES for 2K, XP, // NOBACKGROUND for Vista 7 
    end; 
end; 

私たちは、ツールバーのサブクラスを作成する必要があります。

type 
    TForm1 = class(TForm) 
    .. 
    private 
    FSaveToolbarWndProc: TWndMethod; 
    procedure ToolbarWndProc(var Msg: TMessage); 
    .. 
.. 

uses 
    commctrl; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    .. 
    FSaveToolbarWndProc := ToolBar1.WindowProc; 
    ToolBar1.WindowProc := ToolbarWndProc; 
end; 

procedure TForm1.ToolbarWndProc(var Msg: TMessage); 
begin 
    FSaveToolbarWndProc(Msg); 

    if (Msg.Msg = CN_NOTIFY) and 
     (TWMNotify(Msg).NMHdr.hwndFrom = ToolBar1.Handle) and 
     (TWMNotify(Msg).NMHdr.code = NM_CUSTOMDRAW) then begin 

    case PNMTBCustomDraw(TWmNotify(Msg).NMHdr)^.nmcd.dwDrawStage of 
     CDDS_PREPAINT: Msg.Result := CDRF_NOTIFYITEMDRAW; 
     CDDS_ITEMPREPAINT: Msg.Result := TBCDRF_NOEDGES or TBCDRF_NOBACKGROUND; 
    end; 
    end; 
end; 

(描画スタイルはまだdsNormalにする必要があることに注意してください)


このソリューションでは、カスタム図面のハンドラを配置する必要はありません。我々はWM_NOTIFYで扱うとき

CDDS_PREPAINT: Msg.Result := Msg.Result or CDRF_NOTIFYITEMDRAW; 
    CDDS_ITEMPREPAINT: Msg.Result := 
        Msg.Result or TBCDRF_NOEDGES or TBCDRF_NOBACKGROUND; 

同じことのために行く:あなたは/が必要な場合でも、とにかく、あなたがする必要があるかもしれませんし「または」「の場合」すなわち、1つのVCLのウィンドウプロシージャが返すとMsg.Resultは、次のようになりたいですフォーム。


同じことを実現する他の方法があるかもしれませんが、カスタム図面は広範なトピックです。あなたはそれを掘り下げたい場合、私はあなたが当面の問題については、以下のリンクから開始することをお勧め:

About Custom Draw
NM_CUSTOMDRAW (toolbar) notification code
NMCUSTOMDRAW structure
NMTBCUSTOMDRAW structure

+0

特に、境界線を使用しないようにするには、グラデーションを使用するIMOは実際にはdsNormalよりもよく見えますしかし、これは問題を解決しません。私が取り除きたいのは国境です。 –

+0

私はそれを試して、それは同じように見えました。たぶん、ボタンの代わりに実際のキャプションを持つボタンと関係があります。 –

+0

@Peter - 最初はXPでテストしたところ、Vistaと7でチェックされていました。 AFAICS VCLはNM_CUSTOMDRAWの適切な結果を返しますが、これらのOSはTBCDRF_NOEDGESを無視しているようです。 –