他の方法ですが、Control.DrawToBitmap を使用し、コントロールをキャプチャーし、
対象コントロールの上にPictureBox等を乗せてキャプチャーした画像を描画するとか
追記
サンプル
C#
1 /// <summary>
2 /// コントロールのEnableを変更し、色が変わっていないように見せる
3 /// </summary>
4 /// <param name="target">Enableを変更するコントロール</param>
5 /// <param name="value">Enableの値</param>
6 /// <param name="parent">変更するコントロールの親コントロール</param>
7 private void ChangeEnabledMask ( Control target , bool value , ContainerControl parent )
8 {
9 if ( value )
10 {
11 // マスク用のPictureBoxを見つけて消す
12 Control [ ] masks = this . Controls . Find ( $ "{target.Name}_Mask" , false ) ;
13
14 foreach ( Control c in masks )
15 {
16 this . Controls . Remove ( c ) ;
17 c . Dispose ( ) ;
18 }
19 }
20 else
21 {
22 Control [ ] masks = this . Controls . Find ( $ "{target.Name}_Mask" , false ) ;
23
24 if ( masks . Length == 0 )
25 {
26 // コントロールをキャプチャ
27 Bitmap img = new Bitmap ( target . Width , target . Height ) ;
28 target . DrawToBitmap ( img , new Rectangle ( 0 , 0 , target . Width , target . Height ) ) ;
29
30 // マスク用のPictureBoxを作成
31 PictureBox maskpic = new PictureBox ( ) { Name = $ "{target.Name}_Mask" ,
32 Location = target . Location ,
33 Size = target . Size ,
34 Image = img ,
35 Visible = true ,
36 Enabled = value } ;
37
38 // 表示
39 parent . Controls . Add ( maskpic ) ;
40 maskpic . BringToFront ( ) ;
41
42 }
43 }
44 target . Enabled = value ;
45
46 }
47
48
49 //フォームに直接置いたコントロールの場合こう呼ぶ
50 ChangeEnabledMask ( radioButton1 , true , this ) ;
51
DrawToBitmapを使用しても正常にキャプチャーできないコントロールもありますので、その場合は別の方法を考えてください。