3

SetWindowLongPtr + GWLP_USERDATA を使用して、データを指すポインターを格納できることはわかっています。ただし、「ハンドル」、「bool」、「int」、またはその他のより大きなデータなど、データを直接保存することはできます。

http://msdn.microsoft.com/zh-tw/library/windows/desktop/ms644898%28v=vs.85%29.aspxから、それは言います:

ハンドルやポインターなど、アプリケーション専用の新しい追加情報を設定します。

ということで、取っ手を収納するのもOKなのだろう。また、この方法を使用して RGB 値を問題なく保存しました。しかし、これがこのようなことをするのが良い考えかどうかはわかりません。また、他の大きなデータ (構造など) を保存できますか?

ps: この質問の動機は、ダイアログ ウィンドウを作成するときに、各コントロールのデータを保存したいということです。もちろん、ウィンドウ プロシージャで静的変数を使用して、(それらへの) ポインターを SetWindowLongPtr 関数に渡すこともできます。しかし、これは理論的には「完璧」ではありません。ダイアログ ウィンドウを閉じると、これらのデータは必要なくなるからです。もちろん、実際には、使用する必要があるデータは非常に小さいので、メモリの使用量を気にする必要はありません。しかし、もっと良い方法があるかどうかを知りたいです。

4

2 に答える 2

9

必要なものを格納するために必要なポインターは 1 つだけです。格納するデータを含む構造体を宣言します。CreateWindowEx() 呼び出しの前に割り当て、ポインターを最後の引数として渡します。WM_CREATE メッセージのウィンドウ プロシージャ、CREATESTRUCT.lpCreateParams フィールドでそれを取得します。SetWindowsLongPtr を呼び出して、そのポインターを格納します。

戻す必要があるときはいつでも、GetWindowlongPtr を使用して構造体へのポインターを回復します。もう一度クリーンアップする必要があります。WM_NCDESTROY メッセージを使用してポインターを解放します。

これは、winapi をラップする C++ クラス ライブラリで使用される標準的な手法であることに注意してください。これを自分で回転させる代わりに、それらのいずれかを使用することを検討してください.

于 2013-01-14T17:19:55.587 に答える
3

この関数は、 (おそらく 32 ビットまたは 64 ビット)SetWindowLongPtrと同じサイズのデータ​​を格納できます。LONG_PTRそのサイズでデータを保存できれば問題ありません。つまり、bool は問題なく、ほとんどのハンドルも問題ありません (ハンドルもポインターになる傾向があるため)。

通常の RGB 値は、3 バイト (カラー コンポーネントごとに 1 バイト) または 4 バイト (アルファ チャネル用の追加バイト) として格納されるため、同様に機能します。

これ以上のスペースが必要な場合は、別の場所に構造体を割り当て、その構造体へのポインターを格納する必要があります。

于 2013-01-14T17:10:22.673 に答える