Visual Studioにもツールバーにコンボボックスが乗っていますが、そこへフォーカスを当てた状態で他のボタンの上へマウスカーソルを持っていけば、枠が表示されて選択状態となります。
Edge2

これと同じことをWinFormsのToolStripでやろうとすると、何故か挙動が違い、選択状態になりません。
Edge4

しかも同じツールバーに乗ってるコントロール上にフォーカスが有るときだけ、選択状態にならず、別のツールバー上にマウスカーソルを持っていけば、そちらではちゃんと選択状態になるという中途半端っぷりです。

こうなっているのは何かしら理由があるのかもしれませんが、気持ち悪いのでVisual Studioのような挙動にしたいところです。

.NET frameworkのソースを見た感じだと切り替えられるようにはなっていないようなので、こんな感じでどうでしょう。

private void Form6_Load(object sender, EventArgs e)
{
    Bugfix(toolStrip1);
}

private static void Bugfix(ToolStrip toolStrip)
{
    foreach (var item in toolStrip.Items)
    {
        if (item is ToolStripButton || item is ToolStripSplitButton || item is ToolStripDropDownButton)
        {
            ((ToolStripItem)item).MouseEnter += (sender, _) =>
            {
                var i = (ToolStripItem)sender;
                if (i.Enabled)
                {
                    i.Select();
                }
            };
        }
    }
}

副作用とかはあるかもしれません。

パスのバウンズを取得するときに、GraphicsPath.GetBoundsを利用することがありますが、引数に行列とペンを引き渡してバウンズを取得できる物も用意されています。

しかし実際に使ってみると、希望していたバウンズとは違う結果が取得されてしまいました。

Edge1

using (Pen pen = new Pen(Color.Black, 20))
using (Pen redPen = new Pen(Color.Red))
using (Pen bluePen = new Pen(Color.Blue))
using (GraphicsPath path = new GraphicsPath())
{
    path.AddLine(30, 30, 120, 120);
    e.Graphics.DrawPath(pen, path);

    RectangleF rc = path.GetBounds(null, pen);
    e.Graphics.DrawRectangle(redPen, rc.X, rc.Y, rc.Width, rc.Height);

    path.Widen(pen);
    rc = path.GetBounds();
    e.Graphics.DrawRectangle(bluePen, rc.X, rc.Y, rc.Width, rc.Height);
}

ソースを見てもらえれば判ると思いますが、赤で囲った矩形がGetBounds(Matrix, Pen)で取得したバウンズ、青で囲った矩形がWidenでペンをパス化した結果に対してGetBounds() したバウンズです。
結構余白が大きく入りますね。
ペンの太さが太かったり、矢印等のアンカーが付いていたりするとより顕著です。

より正確にバウンズを取得したい場合はGetBounds(Matrix, Pen)は使わないほうが良さそうです。
(動作速度もそこそこ差がありそうですが、今回は計っていません)

フォーム上にLabelを貼って、「あああ\nいいい」と打っても、改行されずにそのまま表示されてしまいます。

Edge2

デザイナ上で改行を使うには、プロパティのTextの右側のドロップダウンをクリックします。
Edge4

テキストエリアが表示されますので、そのなかでEnterキーで自由に改行ができます。

確定するとフォームにも反映されます。
Edge3

前教えて貰ったけど、忘れやすいのでメモ。
http://regexpal.com/

C#だと正規表現が使えますので、テキスト解析にとっても便利です。

この処理の間だけ待機カーソルを表示しておきたい、ってことが良くあります。
やり方をいろんなサイトで調べても、一時的にカーソルを待機カーソルに設定して、用が済んだたら戻す、というようなコードばかり見かけたのですが、
途中で例外が飛んできたらどうすんの?(try finallyで捕まえてカーソル戻すの?)とかいちいち考えるのが面倒なので、クラス化してみました。

VC++MFCのCWaitCursorと同じようなものです。

using System;
using System.Windows.Forms;

namespace Takabosoft.Common.Forms
{
    class WaitCursor : IDisposable
    {
        private Cursor old = null;

        internal WaitCursor()
        {
            old = Cursor.Current;
            Cursor.Current = Cursors.WaitCursor;
        }

        #region IDisposable メンバー

        public void Dispose()
        {
            Cursor.Current = old;
        }

        #endregion
    }
}

(ファイナライザが無いのは仕様です^^;)

あとは、待機カーソルにしたい処理をusingで囲ってもらえれば、その間には待機カーソルになると思います。
例外が中で発生しても、ちゃんとカーソルが戻る予定です。

using (WaitCursor wait = new WaitCursor())
{
    // ここを処理している間、待機カーソルになる
}

まだ、あまり検証していませんが。

記事検索

アーカイブ