2016-05-23 21 views
0

カスタムインデックスにデータを保存するには、どうすればSetWindowLongPtr(_In_ HWND hWnd, _In_ int nIndex, _In_ LONG_PTR dwNewLong)を使用できますか?カスタムインデックスにデータを格納:GWLP_USERDATA_EX?

たとえば、

SetWindowLongPtr(hwnd, GWLP_USERDATA_CUSTOM, (LONG_PTR)dispatcher); 

msdn documentationから; nIndexパラメータは次のとおりです。

設定する値の0から始まるオフセットです。有効な値は、範囲0から余分なウィンドウメモリのバイト数から整数のサイズを差し引いたものです。

これはどういう意味ですか?利用可能な余分なウィンドウメモリバイトの数はどのようにして決められますか?本質的に、私はすでにポインタを格納するためにGWLP_USERDATAを使用しているので、私は部屋を使い果たしました。別のインデックスに情報を格納することができれば、非常に便利です。

+1

ウィンドウクラスを登録するときに割り当てられる余分なバイト数を宣言します。そのプロセスのドキュメントは説明しています。 –

+1

* "既にポインタを格納するためにGWLP_USERDATAを使用していますので、部屋がなくなりました" * - つまり、このウィンドウのクラスを登録していない(または単に部屋を要求している)ということです。その場合、 'GWLP_USERFATA'を使うことはすでにバグです。それはあなたのものではありません。 – IInspectable

+0

つまり、ポインタを格納していると、本質的に無制限の量のメモリを自由に使うことができます。ポインタが、必要なすべてのデータを含む構造体を指し示すようにするだけです。ただし、 'GWLP_USERDATA'は、CreateWindowExを呼び出してウィンドウを作成した人ではなく、RegisterClassExを呼び出してウィンドウクラスを登録した人のためのものです。 SetPropは許容される解決策です。 –

答えて

1

cbWndExtraWNDCLASS構造体のメンバを使用してウィンドウクラスを登録するときに使用できる余分なウィンドウバイト数を決定します。私は

wc.cbWndExtra = sizeof (LONG) + sizeof (void *); 

を言うならば、私は安全のために

SetWindowLongW(hwnd, 0, myLONGValue); 
SetWindowLongPtrW(hwnd, sizeof (LONG), (LONG_PTR) myPointerValue); 

(と私のウィンドウにLONGvoid *を詰め込むことができ

は例えば、私はいつもの倍数の値を格納しますポインタサイズの整数で、SetWindowLongPtrW()のみを使用してください)。

さまざまなDWLP_xxxの広告で使用する定数ialogボックスもこの方法で動作します。

これは、ウィンドウクラスを自分で登録したことを意味します。つまり、あなたはRegisterClass()またはRegisterClassEx()を呼び出した人です。もしそうでなければ、インデックス0以上のメモリにアクセスする権限はない(ダイアログボックスの場合のように、ウィンドウクラスの作成者があなたを許可しない限り、DWLP_xxx)。既存のウィンドウハンドルがあり、そのウィンドウに関連するデータをどこかに埋め込む必要がある場合は、自分で作業してください。ウィンドウをサブクラス化する場合、Common Controls 6のサブクラス化ルーチンを使用すると、ポインタサイズの整数をサブクラスとともに格納することができます。

"ポインタサイズの整数"の代わりに "ポインタ"必要に応じて

+5

"あなたはあなた自身のものです" - そうではありませんが、 'SetProp'は有効な選択肢です。 –

+0

私が扱っているhwndは、標準のWinAPIボタンになる予定です。あなたは 'SetWindowLongPtr()'で別のものを使うことを提案しますか? – Sam

+0

@JonathanPotter 'SetProp'は良い解決策のようです。 – Sam