0

System.Windows.Forms.MessageBox クラスの show 関数を使用してメッセージ ボックスを描画すると、ウィンドウがポップアップします。このウィンドウを描画するための実際のコードがどこにあるのか知りたいですか? それは Win32 API や user32.dll などにありますか? リフレクターを通して Show メソッドの定義を見ることができません。

また、.NET は win32 API のラッパーですか? .net コードをコンパイルすると、実行時に CPU 固有の命令に変換される IL が生成され、CPU がそれらの命令を実行することがわかっています。しかし、Windows OS には、ウィンドウの描画 (またはテキスト ファイルなどからの読み取り) を担当する一般的なコードがいくつかあると感じています。C++、F#、C#、Java などのこれらすべての言語は、最終的にフレームワーク内からそのコードを呼び出します。しかし、どうすればそれを見つけて検証できるのでしょうか?

たとえば、MFC または Win32 では、画面上にウィンドウを描画するために呼び出した関数に関係なく、MessageBox.Show も同じ関数を呼び出しますが、それは私たちから抽象化されていますか?

一方、2 つの言語間で相互運用することもできます。

だから私はここで少し混乱しています。また、最近はC#経由でCLRを読んでいるので、私の脳は非常に興奮した状態です:-)

4

1 に答える 1

4

あなたは正しい軌道に乗っていると思います。言語やフレームワークに関係なく、一番下にあるのはオペレーティング システムであり、最終的にはシステム コールですべてが終了します。

たとえば、Windows でファイルを開く場合、C 、C++ 、C# 、JavaのいずれCreateFile()を使用したかに関係なく、システム コールは です。fopenifstreamSystem.IO.*java.io.*

System.Windows.Forms の質問については、通常の Win32 ウィンドウを使用するため、ウィンドウはHWNDCLR で として表される値で識別されますIntPtr

また、ウィンドウを表示する機能については、Win32 API にいくつかの機能があり、いくつかのレイヤーが含まれているため、質問は少し誤解を招くものです。

たとえば、ウィンドウを作成するには、 を呼び出しCreateWindowEx()て、非表示の場合にそれを表示するためにを呼び出しますShowWindow()。ペイント自体は、ウィンドウ プロシージャ (記述しなければならないコールバック) がWM_PAINTメッセージを受信したときに処理されます。ただし、メッセージを受信するには、メッセージ ポンプ ( GetMessagte() / DispatchMessage()) を作成する必要があります。

しかし、単純なMessageBox()ものを作成するために、すべてのことを行う関数がすでに利用可能です: MessageBox()、そのSystem.Windows.Forms.MessageBoxクラスは直接ラッパーです。

さて、質問は何でしたか?ああ、はい、System.Windows.FormsWin32 との間で相互運用できますか? はい!

于 2012-12-05T00:12:54.423 に答える