質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

2回答

1251閲覧

System.Windows.Forms.DpiChangedEventArgsの疑問点

yumetodo

総合スコア5850

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2017/09/28 13:57

.NET 4.7で追加されたSystem.Windows.Forms.DpiChangedEventArgsについてですが

  1. おそらく内部ではGetDpiForMonitorを呼び出しているだろうと思われるが、GetDpiForMonitoruintを返すのにDeviceDpiNew,DeviceDpiOldプロパティはなぜint型なのか
  2. そもそもなぜSystem.ComponentModel.CancelEventArgsの派生クラスとして定義されているのか、Cancelプロパティは何を行うのか?

以上教えていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

  1. System.Windows.Forms.Form のソース を見ると、WM_DPICHANGE を受け取った時にこのイベントが呼ばれるようになっています。WM_DPICHANGE で取得できる解像度は 0 から 65535 なので uint である必要はありません。大は小を兼ねるということで扱いやすい int で実装したのでしょう。

  2. ソースの OnDpiChanged をご覧ください。Canceltrue の時には解像度の変更があっても Form の変更をしないようになっています。

投稿2017/09/28 15:05

編集2017/09/28 15:10
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/09/29 02:42

DpiChangedEventArgs は構造体です。 .NET Framework のソースはそこで公開されていますから探してみてください。 中でやっていることというのはどういう意味でしょうか? Form がメッセージを受け取ると WndProc が呼ばれ、WM_DPICHANGE であればそこから WmDpiChanged が呼ばれます。 その中でデフォルトのメッセージ処理メソッドである DefWndProc を呼んだあと DpiChangedEventArgs を作ってそれを引数に OnDpiChanged が呼ばれます。 OnXXXX が呼ばれた時は XXXX イベントが発生するようプログラミングしますので、DpiChanged イベントが発生します。
yumetodo

2017/09/29 03:26

>ソースはそこで公開されていますから VSのソリューション全体検索では引っかからなかったんだが、VSCodeで検索し直したらあっさり見つかった・・・ 中というのはコンストラクタで何やってるか見たかったんです。
guest

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

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問