CXXX::OnLvnItemchangedList() の pNMLV の値

リストビューコントロールにて、アイテムに変化がある度に送られる、LVN_ITEMCHANGED
通知の処理についての実験です。
MFCでは、CXXX::OnLvnItemChanged() 関数にあたります。

通知で送られるデータの各メンバの値によって、アイテムの状態がどのように変化したのかが分かります。
いろいろな操作をしたときに、どのように変化するかを調べましたので、以下に表で表します。

動作 iItem uChanged uNewState uOldState 備考
追加時 新 4 0 0 アイテムを追加した時
選択時 新 830 最初にアイテムを選択したとき
選択変更時 旧802 アイテムの選択中に、他のアイテムを追加で選択したとき
旧801
新830
選択解除時 旧802 アイテム以外の場所をクリックして、選択を解除したとき
再選択時 旧801 選択解除を行った後に、他のアイテムを選択したとき
新831
削除(非選択)---- 選択していないアイテムを削除したとき
削除(選択) 選択中802 選択中のアイテムを削除したとき
削除後、次のアイテムに点線の枠が移動する
選択中801
次 810

↑苦労して作った表(TABLEタグ)がものの見事に消された。。。最初はうまくいっていたのに、更新したら消えた~ (ToT)
そのうち作り直します。。。


この表の中で、2行や3行がまとまっている部分は、1つの動作で、複数回の LVN_ITEMCHANGED 通知が発生したものです。
これで、だいたいの傾向は分かります。
アイテムを選択したときには、nNewState が 3 になります。
アイテムの選択を解除したときには、uOldState が 2 になります。
とりあえず、これだけ分かれば、アイテムが選択されたときに、何かを表示して、選択が解除されたときには、それを隠す。
と言うようなことが出来るようになります。

これらの uXXXState の値は、以下のリスビューコントロールのアイテム状態と密接に関わっているようです。

#define LVIS_FOCUSED 0x0001
#define
LVIS_SELECTED 0x0002
#define
LVIS_CUT 0x0004
#define
LVIS_DROPHILITED 0x0008
#define
LVIS_GLOW 0x0010
#define
LVIS_ACTIVATING 0x0020
#define
LVIS_OVERLAYMASK 0x0F00
#define
LVIS_STATEIMAGEMASK 0xF000


状態の値が 3 の場合は、uNewState = (LVIS_FOCUSED | LVIS_SELECTED) からなります。
選択時には、フォーカス(点線の枠)と選択(反転)が同時に行われるためです。

選択解除の場合は、その場にフォーカスが残りますので、uOldState = LVIS_SELECTED だけとなります。
次のアイテムを選択するときに、1回目の通知で、現在のフォーカスが消え(uOldState = LVIS_FOCUSED)、
2回目の通知で新しいアイテムが選択状態(uNewState = (LVIS_FOCUSED | LVIS_SELECTED) )になります。

ここでは、追加選択などの場合は扱っていませんが、以下のようなコードをCXXX::OnLvnItemChanged()
関数に追加して、アイテムを操作してみることで、簡単に確認することが出来ます。

TRACE("OnLvnItemchangedList iItem: %d, lParam: %d, uChanged: %d, uNewState: %d, uOldState: %d\n"
, pNMLV->iItem, pNMLV->lParam, pNMLV->uChanged, pNMLV->uNewState, pNMLV->uOldState);

[PR]
by isoq | 2004-09-08 11:37 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< 郵便の仕分け機械化の弊害 子どもが育つ魔法の言葉 >>