9

特定の Windows アプリケーションで使用される [ファイルを開く] ダイアログのOpenボタンには、追加オプションのリスト (つまりOpen With...

ファイルを開くダイアログ

すべての Windows アプリケーションでこれを確認したわけではないため、取得するにはいくつか試してみる必要があるかもしれませんが、メニューに移動してFile-> Open-を選択すると、SQL Server Management Studio と Visual Studio 2017 の両方でボタンが表示されます。 >File...

アプリケーションの 1 つで、このようなボタンを組み込みリストと共に使用したいのですが、Visual Studio で使用しているコントロールが見つかりません。ダイアログ全体ではなく、その特定のボタンを探していることを明確にする必要があります。何かご意見は?

4

7 に答える 7

7

Spy ++(VSにインストールされている)のドラッグ可能な検索を使用して、VSのファイルを開くダイアログの分割開くボタンを確認しました。

これにより、BS_DEFSPLITBUTTONを含むスタイルの通常のWindowsボタンであることがわかりました。それはあなたを含むいくつかの興味深い場所にあなたを連れて行く魔法のキーワードです

http://www.codeplex.com/windowsformsaero/SourceControl/FileView.aspx?itemId=212902&changeSetId=9930

そしてここ

http://msdn.microsoft.com/en-us/library/bb775949.aspx#using_splits

これがお役に立てば幸いです。

編集:

私は実際にCodePlexからそのコードを試したところ、分割ボタンが作成されましたが、ボタンのFlatStyleがデフォルトの「Standard」ではなく「System」に設定されていることを確認する必要があります。私はドロップダウンのためにイベント処理のものを接続することを気にしませんでした、しかしそれはMSDNリンクでカバーされていると思います。

もちろん、これはVistaのみです(ただし、codeplexの名前にもかかわらず、Aeroを有効にする必要はありません)。以前のOSサポートが必要な場合は、自分で描画することに戻ります。

于 2008-08-27T20:51:31.803 に答える
5

ケタリンにそういうボタンがあるのを思い出した。

Reflectorを使用して、 wyDay.SplitButtonと呼ばれる優れたオープン ソース コントロールを見つけました。 wyDay.SplitButton

于 2009-10-18T12:01:02.000 に答える
4

あなたが探しているものはtoolStripSplitButtonと呼ばれていると思います。これは、toolStripでのみ使用できます。ただし、フォームの任意の場所にtoolStripContainerを追加してから、toolStripとtoolStripSplitButtonをコンテナ内に配置できます。

グリップを表示したくないので、gripMargin = 0に設定する必要があります。また、ツールストリップがボタンに一致するようにautosize=trueを設定することもできます。ボタンは、フォーム上の通常のボタン(分割部分を除く)のように見えます。

于 2008-08-27T20:31:18.607 に答える
2

これが私の分割ボタンの実装です。矢印は描画されず、フォーカス/アンフォーカスの動作が少し異なります。

私のものとオリジナルの両方が視覚的なスタイルを扱い、Aeroで見栄えがします。

http://wyday.com/splitbutton/に基づく

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System.Drawing;
using System.ComponentModel;
using System.Diagnostics;

// Original: http://blogs.msdn.com/jfoscoding/articles/491523.aspx
// Wyatt's fixes: http://wyday.com/splitbutton/
// Trimmed down and redone significantly from that version (Nick 5/6/08)
namespace DF
{
    public class SplitButton : Button
    {
        private ContextMenuStrip m_SplitMenu = null;
        private const int SplitSectionWidth = 14;
        private static int BorderSize = SystemInformation.Border3DSize.Width * 2;
        private bool mBlockClicks = false;
        private Timer mTimer;

        public SplitButton()
        {
            this.AutoSize = true;
            mTimer = new Timer();
            mTimer.Interval = 100;
            mTimer.Tick += new EventHandler(mTimer_Tick);
        }

        private void mTimer_Tick(object sender, EventArgs e)
        {
            mBlockClicks = false;
            mTimer.Stop();
        }

        #region Properties
        [DefaultValue(null)]
        public ContextMenuStrip SplitMenu
        {
            get
            {
                return m_SplitMenu;
            }
            set
            {
                if (m_SplitMenu != null)
                    m_SplitMenu.Closing -= 
                        new ToolStripDropDownClosingEventHandler(m_SplitMenu_Closing);

                m_SplitMenu = value;

                if (m_SplitMenu != null)
                    m_SplitMenu.Closing += 
                        new ToolStripDropDownClosingEventHandler(m_SplitMenu_Closing);
            }
        }

        private void m_SplitMenu_Closing(object sender, ToolStripDropDownClosingEventArgs e)
        {
            HideContextMenuStrip();
            // block click events for 0.5 sec to prevent re-showing the menu

        }

        private PushButtonState _state;
        private PushButtonState State
        {
            get
            {
                return _state;
            }
            set
            {
                if (!_state.Equals(value))
                {
                    _state = value;
                    Invalidate();
                }
            }
        }

        #endregion Properties

        protected override void OnEnabledChanged(EventArgs e)
        {
            if (Enabled)
                State = PushButtonState.Normal;
            else
                State = PushButtonState.Disabled;

            base.OnEnabledChanged(e);
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            if (State.Equals(PushButtonState.Disabled))
                return;
            if (mBlockClicks)
                return;

            if (!State.Equals(PushButtonState.Pressed))
                ShowContextMenuStrip();
            else
                HideContextMenuStrip();
        }

        protected override void OnMouseEnter(EventArgs e)
        {
            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))
            {
                State = PushButtonState.Hot;
            }
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))
            {
                if (Focused)
                {
                    State = PushButtonState.Default;
                }

                else
                {
                    State = PushButtonState.Normal;
                }
            }
        }

        protected override void OnPaint(PaintEventArgs pevent)
        {
            base.OnPaint(pevent);

            Graphics g = pevent.Graphics;
            Rectangle bounds = this.ClientRectangle;

            // draw the button background as according to the current state.
            if (State != PushButtonState.Pressed && IsDefault && !Application.RenderWithVisualStyles)
            {
                Rectangle backgroundBounds = bounds;
                backgroundBounds.Inflate(-1, -1);
                ButtonRenderer.DrawButton(g, backgroundBounds, State);

                // button renderer doesnt draw the black frame when themes are off =(
                g.DrawRectangle(SystemPens.WindowFrame, 0, 0, bounds.Width - 1, bounds.Height - 1);
            }
            else
            {
                ButtonRenderer.DrawButton(g, bounds, State);
            }

            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;

            g.DrawString(Text, Font, SystemBrushes.ControlText, bounds, format);
        }

        private void ShowContextMenuStrip()
        {
            State = PushButtonState.Pressed;
            if (m_SplitMenu != null)
            {
                m_SplitMenu.Show(this, new Point(0, Height), ToolStripDropDownDirection.BelowRight);
            }
        }

        private void HideContextMenuStrip()
        {
            State = PushButtonState.Normal;
            m_SplitMenu.Hide();
            mBlockClicks = true;
            mTimer.Start();
        }
    }
}
于 2008-08-27T20:36:18.297 に答える
2

私はこれらの使用に慣れていませんが、msdn で splitbutton または dropdownbutton を検索してみてください。それらはあなたが探しているものに似ていると思います。

于 2008-08-27T20:17:20.090 に答える
1

.NET で実行できる組み込みのコントロールはないと思います。標準の Windows ボタン コントロールの MSDN ドキュメントを調べていますが、そこにあるようには見えません。

カスタム実装を含むCode Project の記事を見つけました。これは少し役立つかもしれません。

于 2008-08-27T20:12:24.017 に答える
0

コントロールはWindows自体で見つけたので、すでにどこかに組み込まれていることを望んでいたので、コードベースに何も追加して使用する必要はありませんでした。しかし、このリンクの分割ボタン(msdnの提案で見つかりました)はかなり有望に見えます。

後で自分で試してみますが、視覚的なスタイルをどれだけうまく処理できるかわかりません。

于 2008-08-27T20:33:26.743 に答える