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