DRAWITEMSTRUCT.itemID の罠
MSDN の解説によると
itemID
メニューのメニュー項目 ID、またはリスト ボックスやコンボ ボックスの項目のインデックス。空のリスト ボックスやコンボ ボックスでは、このメンバは負の値になります。これにより、アプリケーションは、コントロールに項目がなくても、rcItem メンバで指定される座標にフォーカス四角形だけを描画できます。このフォーカス四角形により、ユーザーはコンボ ボックスやリストボックスが入力フォーカスを持っているかどうかを知ることができます。コンボ ボックスやリストボックスがあたかも入力フォーカスを持っているときのようにフォーカス四角形を描画するかどうかは、itemAction メンバのビットの設定によって決まります。
で、その DRAWITEMSTRUCT の定義
typedef struct tagDRAWITEMSTRUCT {
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemAction;
UINT itemState;
HWND hwndItem;
HDC hDC;
RECT rcItem;
DWORD itemData;
} DRAWITEMSTRUCT;
実際に動かすと確かに -1 が返ってくる事がある。ただし、型は UINT でな*1。(´Д`;
仕方ないからこんな判定をする羽目に。
if (lpDrawItemStruct->itemID >= 0 && lpDrawItemStruct->itemID < (UINT)INT_MIN) {
*1:矛盾してるが気にしない