.NET 4.7で追加されたSystem.Windows.Forms.DpiChangedEventArgsについてですが
- おそらく内部ではGetDpiForMonitorを呼び出しているだろうと思われるが、
GetDpiForMonitor
はuint
を返すのにDeviceDpiNew
,DeviceDpiOld
プロパティはなぜint
型なのか - そもそもなぜ
System.ComponentModel.CancelEventArgs
の派生クラスとして定義されているのか、Cancel
プロパティは何を行うのか?
以上教えていただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
-
System.Windows.Forms.Form のソース を見ると、
WM_DPICHANGE
を受け取った時にこのイベントが呼ばれるようになっています。WM_DPICHANGE
で取得できる解像度は 0 から 65535 なのでuint
である必要はありません。大は小を兼ねるということで扱いやすいint
で実装したのでしょう。 -
ソースの
OnDpiChanged
をご覧ください。Cancel
がtrue
の時には解像度の変更があってもForm
の変更をしないようになっています。
投稿2017/09/28 15:05
編集2017/09/28 15:10総合スコア28660
0
おそらく内部ではGetDpiForMonitorを呼び出しているだろうと思われるが、GetDpiForMonitorはuintを返すのにDeviceDpiNew,DeviceDpiOldプロパティはなぜint型なのか
Control.DeviceDpiがintになっているのでこれのせいだと思いますが理由が良く分かりませんね。
負数を扱う箇所を見つけられれば理由がわかると思いますが探せませんでした。
あとGetDpiForMonitorはWin8.1時代のDPI処理のAPIなのでWin10の内部ではGetDpiForWindowが使用されます。
そもそもなぜSystem.ComponentModel.CancelEventArgsの派生クラスとして定義されているのか、Cancelプロパティは何を行うのか?
該当する処理は以下。自前で処理を行いたい場合にキャンセルすれば4.7で実装されたDpi変更処理が実施されないということだと思います。
C#
1 protected virtual void OnDpiChanged(DpiChangedEventArgs e) 2 { 3 if (e.DeviceDpiNew != e.DeviceDpiOld) 4 { 5 CommonProperties.xClearAllPreferredSizeCaches(this); 6 DpiChangedEventHandler dpiChangedEventHandler = (DpiChangedEventHandler)base.Events[Form.EVENT_DPI_CHANGED]; 7 if (dpiChangedEventHandler != null) 8 { 9 dpiChangedEventHandler(this, e); 10 } 11 if (!e.Cancel) 12 { 13 float num = (float)e.DeviceDpiNew / (float)e.DeviceDpiOld; 14 base.SuspendAllLayout(this); 15 try 16 { 17 SafeNativeMethods.SetWindowPos(new HandleRef(this, base.HandleInternal), NativeMethods.NullHandleRef, e.SuggestedRectangle.X, e.SuggestedRectangle.Y, e.SuggestedRectangle.Width, e.SuggestedRectangle.Height, 20); 18 if (base.AutoScaleMode != AutoScaleMode.Font) 19 { 20 this.Font = new Font(this.Font.FontFamily, this.Font.Size * num, this.Font.Style); 21 base.FormDpiChanged(num); 22 } 23 else 24 { 25 base.ScaleFont(num); 26 base.FormDpiChanged(num); 27 } 28 } 29 finally 30 { 31 base.ResumeAllLayout(this, false); 32 } 33 } 34 } 35 } 36
投稿2017/09/28 14:55
総合スコア818
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/29 02:21
2017/09/29 02:42
2017/09/29 03:26