ドロップ先の情報

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