2

私は最近 Win32 で多くの作業を行っていますが、私はそれにかなり慣れていないため、組織に関するアドバイスが必要です。C++ では、グローバル変数を宣言するのは構文的には機能しますが、変数はどこでも変更できるため、変数への変更を追跡するのがはるかに難しくなるため、これはずさんだという印象を常に受け​​ていました。

私の Win32 プロジェクトには、複数の場所で変更する必要があるいくつかの変数があります。たとえば、そのような変数の 1 つが WndProc 関数とダイアログ プロシージャ関数にありました。この使用方法により、WndProc で実際の値を単純に使用し、DialogBoxParam を使用してダイアログ ボックスを呼び出し、lParam 値を介して値をダイアログ ボックスに渡すことができました。

ただし、描画に使用する特定のビットマップや、複数の異なるウィンドウ メッセージ呼び出しで使用される変数など、他の値もあります。これらの値は、WndProc 関数または複数の関数の複数のインスタンス全体で保持する必要があります。作成した関数のパラメーターを制御できますが、複数の異なるウィンドウ メッセージに関係なく使用できるように、変数を WndProc 関数に渡す必要がある場合はどうすればよいでしょうか? 複数の値を渡す必要がある場合はどうすればよいですか?

これまでのところ、私はすべてをグローバルにしてきましたが、うまくいきますが、それは私には雑に感じます...しかし、いくつかの変数は慣例として一般的にグローバルであることを知っています - メインウィンドウやインスタンス変数のように。

皆さんはどう思いますか?

4

2 に答える 2

0

グローバル変数を使用する代わりに、関連するウィンドウに関連付けられたC++オブジェクトにウィンドウ固有のデータを格納できます。

C ++オブジェクトをウィンドウに関連付けるには、既存のC ++クラスフレームワーク(MicrosoftのWTLやTorjoのWin32GUIなどSetWindowSubclass)のいずれかを使用するか、 API関数を使用して自分で行います。

Do ItYourself™ソリューションについては、別のSO回答で完全なC++の例を示しました。

とは言うものの、小さなプログラムの場合、グローバル変数+ダイアログが最も簡単で、問題はありません。したがって、一般的に、ジョブにはRightTool™を使用します。大規模なジョブの場合は、より重いツールを使用します…

于 2013-03-14T21:39:56.110 に答える
0

コードに特定の例があると役立つ場合があります。しかし、私はあなたが生涯について話していると思います-あなたはリソース(例えばビットマップ)を持っていて、さまざまなWindowsメッセージに応答してそれを何度も参照する必要があります。あなたはそれをグローバルにすることができます、はい、しかし私はそれがずさんなことに同意します。

では、誰がウィンドウを作成したのでしょうか。おそらくあなたの「アプリ」クラスかそれらの線に沿った何か。そのクラスの存続期間はウィンドウの存続期間よりも論理的に長いため、ウィンドウに必要なリソースを保持できます。

または、より良いアプローチは" Window"クラスを作成することです。オブジェクトをAppインスタンス化しWindowます。オブジェクトはWindowWin32ウィンドウを作成し、HWNDを保持し(これで抽象化されたAppため、これらの厄介な詳細を知る必要はありません)、Windowインスタンスはビットマップリソースを保持できます。

于 2013-03-14T21:39:58.863 に答える