teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2019/03/09 00:27

投稿

YAmaGNZ
YAmaGNZ

スコア10665

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