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

回答編集履歴

2

追記

2017/10/29 03:09

投稿

退会済みユーザー
answer CHANGED
@@ -10,4 +10,80 @@
10
10
 
11
11
  [http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f10%2fdebug.jpg](http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f10%2fdebug.jpg)
12
12
 
13
- ちなみに、自分の環境は Windows 10 Pro 64-bit, VS2015 Community, .NET 4.6.1, Any CPU 32 ビット優先, Debug ビルドです。
13
+ ちなみに、自分の環境は Windows 10 Pro 64-bit, VS2015 Community, .NET 4.6.1, Any CPU 32 ビット優先, Debug ビルドです。
14
+
15
+ 【2017/10/29 追記】
16
+
17
+ 下の 2017/10/29 11:26 のコメントに「その結果を回答欄に追記しておきます」と書きましたように、自分が調べた結果を書いておきます。
18
+
19
+ 念のため問題は何かを書いておきますと、
20
+
21
+ 質問者さんのコードの f.Size = calendar.Size で、calendar の中身をデバッガで見ないと、calendar の真のサイズが calendar.Size に反映されないのは何故か?
22
+
23
+ ということですよね。
24
+
25
+ まず、MonthCalendar の特殊性として、そのサイズを決定するのは使用されるフォントだけで(MonthCalendar.Size プロパティの設定では変えられない)、フォントが決まらないとサイズが決まらないということがあります。
26
+
27
+ ここからは想像が入っていますが、以下のようなことだと思われます。
28
+
29
+ (1) Dim calendar As New MonthCalendar() の時点ではフォントが不明なので真のサイズも不明。
30
+
31
+ (2) f.Size = calendar.Size の時点でも、依然としてフォントが不明なので真のサイズも不明。
32
+
33
+ (3) デバッグ実行して calendar.Size の Size にマウスカーソルを当てると Width = 178, Height = 155 という値が取得されるが、それはデフォルト(?)の値で、フォントを考慮した真のサイズではない。
34
+
35
+ (4) calendar.Size の calendar にマウスカーソルを当て開くと、その時点で calendar が完全に初期化される。すなわち、使用されるフォントに応じて真のサイズが Size プロパティに設定される。
36
+
37
+ (5) なので、その後で calendar.Size の Size にマウスカーソルを当てると真のサイズが取得できる。
38
+
39
+ 上記の想像を裏付ける Microsoft の公式文書などは見つからないのですが、以下のコードで検証した結果が、多分上記の想像は正しいことを裏付けていると思います。
40
+
41
+
42
+ ```
43
+ using System;
44
+ using System.Collections.Generic;
45
+ using System.ComponentModel;
46
+ using System.Data;
47
+ using System.Drawing;
48
+ using System.Linq;
49
+ using System.Text;
50
+ using System.Threading.Tasks;
51
+ using System.Windows.Forms;
52
+
53
+ namespace WindowsFormsApplication2
54
+ {
55
+ public partial class Form1 : Form
56
+ {
57
+ public Form1()
58
+ {
59
+ InitializeComponent();
60
+
61
+ Button button = new Button();
62
+ button.Click += Button_Click;
63
+ this.Controls.Add(button);
64
+ }
65
+
66
+ private void Button_Click(object sender, EventArgs e)
67
+ {
68
+ Form f = new Form();
69
+ Size size1 = f.Size; // size1 = {Width = 300 Height = 300}
70
+ f.Size = new Size(200, 200);
71
+ size1 = f.Size; // size1 = {Width = 200 Height = 200}
72
+
73
+ MonthCalendar calendar = new MonthCalendar();
74
+ Size size2 = calendar.Size; // size2 = {Width = 178 Height = 155}
75
+ calendar.Size = new Size(200, 200);
76
+ size2 = calendar.Size; // size2 = {Width = 178 Height = 155}
77
+ f.Controls.Add(calendar);
78
+ size2 = calendar.Size; // size2 = {Width = 178 Height = 155}
79
+ f.Show();
80
+ size2 = calendar.Size; // size2 = {Width = 199 Height = 162}
81
+
82
+ f.ClientSize = calendar.Size;
83
+ }
84
+ }
85
+ }
86
+ ```
87
+ calendar が完全に初期化される、すなわち、使用されるフォントに応じて真のサイズが Size プロパティに設定されるのは、上記のコードでは f.Show(); の時点のようです。
88
+
89
+ その後であれば、calendar.Size で真のサイズを取得でき、それを Form の Size に設定してやれば期待される結果になります。(上のコードで検証済み)

1

追伸追加

2017/10/29 03:09

投稿

退会済みユーザー
answer CHANGED
@@ -2,4 +2,12 @@
2
2
 
3
3
  であれば、それは当たり前のような気がしますが。
4
4
 
5
- ステップオーバー (F10) で次の行に進めてから、同様にマウスのカーソルを f.Size と calendar.Size の Size に置いて調べてみてください。同じになるのでは?
5
+ ステップオーバー (F10) で次の行に進めてから、同様にマウスのカーソルを f.Size と calendar.Size の Size に置いて調べてみてください。同じになるのでは?
6
+
7
+ 【追伸】
8
+
9
+ コメント欄に「ご参考に、回答欄に自分が検証した際の画像をアップしておきます」と書きましたが、ここには自分は画像をアップできないようですので、自分が使っているレンタルサーバーにアップしてそれへのリンクを張っておきます。
10
+
11
+ [http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f10%2fdebug.jpg](http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f10%2fdebug.jpg)
12
+
13
+ ちなみに、自分の環境は Windows 10 Pro 64-bit, VS2015 Community, .NET 4.6.1, Any CPU 32 ビット優先, Debug ビルドです。