ドロップ先の情報
HitTest()の返す値はドキュメントにありました。
http://wxwindowsjp.sourceforge.jp/docs/html/wx/wx399.htm#wxtreectrlhittest
与えられた点の下に、何か項目があれば、ツリー項目の id と特別な flags 情報を返す。 Calculates which (if any) item is under the given point, returning the tree item id at this point plus extra information flags. flags is a bitlist of the following:
これを読んだときに、一瞬こんなコードでいけるのではと勘違いしてしまいました。
if flag==wx.TREE_HITTEST_ABOVE: .... elif flag==wx.TREE_HITTEST_BELOW: .... elif ....
しかしこれではダメです。試してみるとflagの値は4112とか4228のような数値でした。ところが
wx.TREE_HITTEST_ABOVE == 1 wx.TREE_HITTEST_BELOW == 2 wx.TREE_HITTEST_NOWHERE == 4 wx.TREE_HITTEST_ONITEMBUTTON == 8 wx.TREE_HITTEST_ONITEMICON == 16 wx.TREE_HITTEST_ONITEMINDENT == 32 wx.TREE_HITTEST_ONITEMLABEL == 64 wx.TREE_HITTEST_ONITEMRIGHT == 128 wx.TREE_HITTEST_ONITEMSTATEICON == 256 wx.TREE_HITTEST_TOLEFT == 512 wx.TREE_HITTEST_TORIGHT == 1024
なのです。実は日本語訳では大事なところが省略されていて、"flags is a bitlist"なのです。つまりHitTestの結果は1つではなく複数の値を取ると。でflagは一覧にあるwxTREE_HITTEST_HOGEのどれかの値その物ではなく、それらの複数の値の合計したした結果、なわけです。しかしまだ謎があります。これ、全部足しても4112とか4228にはなりません。つまりドキュメント上には存在しない2048とか4096がきっとあるはずです。
4112は4096+4+2、4228は4096+128+4。4096は不明ですが、4112はNOWHERE+BELOWつまり「最後の項目の下方でクライアント領域より下」、4228はONITEMRIGHT+NOWHEREつまり「最後の項目よりも下で項目の右側」ですね。うーんこれだけでは何のことかわかりませんが、大事な情報だけ使ってあとは無視することにします。
前のif文は
if flag & wx.TREE_HITTEST_ABOVE == wx.TREE_HITTEST_ABOVE: .... elif flag & wx.TREE_HITTEST_BELOW == wx.TREE_HITTEST_BELOW: .... elif ....
のようにすればいけるでしょう。きっと。そしてONITEMHOGE以外は無視することにしましょう。とくに英語ドキュメントにも載っていない2048と4096には気づかなかった事にw