【C#】タブコントロールの矢印ボタン(ページ遷移ボタン)を変更する方法

C#
この記事は約5分で読めます。

以前にタブコントロールでタブがいっぱいになると矢印(ページ遷移ボタン)が表示されるんですが、このボタンの見た目を変更する方法を探していたのですが、結局わかりませんでした。

最近C++で自作テキストエディタを作成するようになって、もしかしてと思い試してみると簡単にできるので紹介します。

タブコントロールの矢印ボタン(ページ遷移ボタン)を変更する方法

基本的にボタンとかはウィンドウになるので、矢印ボタンのウィンドウハンドルが分かれば簡単に変更できます。矢印ボタンのウィンドウは FindWindowEx で検索します。実装例ではフォームにタブコントロールと3つボタンを貼り付けています。

using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApp {
    public partial class Form1 : Form {

        public Form1() {
            InitializeComponent();
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildafter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetWindowPos(IntPtr hWnd,  int hWndInsertAfter, int x, int y, int cx, int cy, int uFlags);

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool IsWindowVisible(IntPtr hWnd);

        private const int SWP_NOSIZE = 0x0001;
        private const int SWP_NOMOVE = 0x0002;

        // 表示・非表示ボタンクリック時
        private void button1_Click(object sender, EventArgs e) {
            IntPtr hWnd = FindWindowEx(this.tabControl1.Handle, IntPtr.Zero, "msctls_updown32", "");

            if (IsWindowVisible(hWnd)) {
                ShowWindow(hWnd, 0);
            } else {
                ShowWindow(hWnd, 1);
            }
        }

        // 移動ボタンクリック時
        private void button2_Click(object sender, EventArgs e) {
            IntPtr hWnd = FindWindowEx(this.tabControl1.Handle, IntPtr.Zero, "msctls_updown32", "");
            SetWindowPos(hWnd, 0, 10, 50, 0, 0, SWP_NOSIZE);
        }

        // サイズ変更ボタンクリック時
        private void button3_Click(object sender, EventArgs e) {
            IntPtr hWnd = FindWindowEx(this.tabControl1.Handle, IntPtr.Zero, "msctls_updown32", "");
            SetWindowPos(hWnd, 0, 0, 0, 100, 100, SWP_NOMOVE);
        }
    }
}

コード解説

表示・非表示ボタンクリック時

矢印ボタンの表示と非表示を切り替えます。画像では矢印ボタンが消えていますよね。

移動ボタンクック時

矢印ボタンを指定した位置に移動します。画像ではとんでもない位置ですが移動しています。

サイズ変更ボタンクリック時

指定したサイズに変更します。これまたでかすぎですが、ボタンのサイズが変更されています。

おわりに

調べてた時はほんと分からなかったんですが、方法が分かればほんと簡単でした。試してはいないのですが、おそらく矢印のアイコンなんかも変更できると思いますね。

矢印アイコンが変更できるか試してみました。やっぱりできますね。矢印ボタンの WndProc を取得して WM_PAINT で描画しています。

コメント

タイトルとURLをコピーしました