Windowsでは、同じウィンドウクラスの複数のウィンドウ(HWND)が開いているとします。ユーザーがウィンドウ2に入力しようとしたときにウィンドウ1が変更されないように、ウィンドウプロシージャ内のコンテキストデータをどのように追跡しますか?C/C++ - Windows - HWNDコンテキストデータの追跡方法
WndProc()が複数回呼び出された後でないと、CreateWindow()が返されないため、結果のHWNDをコンテキストデータに設定してWndProc()で検索することはできません。あなたはWndProc()でそれを設定する必要があります。
WndProc()は、ウィンドウ作成メッセージ以外でコンテキスト情報を直接渡すことはありませんが、残念ながらウィンドウ作成メッセージはWndProc()に渡される最初のメッセージではありません。いいえ、私はWM_SIZE、WM_NCSIZEなどのものを見つけ、WM_CREATEを見る前にいくつかのものが渡されます。
リンクリストタイプのストレージメカニズムにHWNDを格納すると、大量のウィンドウで効率が悪くなります。ウィンドウ内の各コントロールは単に別のタイプのウィンドウなので、追跡する必要がある別のHWNDです。数百のコントロールの後、数十のメッセージが短時間でプログラムに渡された後、HWNDのリンクリストを検索することはプログラムの主要なボトルネックになります!
私が聞いたことから、SetWindowLong()を使用する人もいますが、ライブラリとは別のライブラリでプログラムとは別のコンテキスト情報を保存することがあり、ウィンドウのデータ衝突が発生することがあります。どのように避けることができますか?
は、あなただけのHWNDのリストを並べ替えることができませんでしたか? – James
私はこれに従っていません..あなたのウィンドウを区別したいですか? window2に入力するときにwindow1が変更されるのはなぜですか? – Default
'SetWindowLongPtr(GWL_USERDATA)'は行く方法です。ライブラリは、ウィンドウを作成している場合を除いては使用しないでください。ウィンドウのユーザーデータは、ウィンドウを作成したユーザーに属します。ライブラリで独自のユーザーデータを添付する場合は、アクセス許可を求める必要があります(たとえば、ウィンドウクラスラッパーのメンバーとして格納するなど)。 –