このときは取得したパラメータを ClientToScreen()でクライアント座標系からスクリーン座標系に変換することで解決したのですが、実はこの方法だとエミュレータ上では正常に動作するにも関わらず 実機ではうまくタップ&ホールドができないようです。
SHRGINFOにはクライアント座標系、TrackPopupMenuEx()にはスクリーン座標系を渡すことで実機でも期待通りの動作をするようになりました。
HMENU hDummyMenu = NULL,
hPopupMenu = NULL;
SHRGINFO sri = {0};
POINT clientPt = {0},
screenPt = {0};
clientPt.x = LOWORD(lParam);
clientPt.y = HIWORD(lParam);
screenPt.x = LOWORD(lParam);
screenPt.y = HIWORD(lParam);
ClientToScreen(hWnd, (LPPOINT)&screenPt);
sri.cbSize = sizeof(sri);
sri.hwndClient = hWnd;
sri.ptDown.x = clientPt.x;
sri.ptDown.y = clientPt.y;
sri.dwFlags = SHRG_RETURNCMD;
if (GN_CONTEXTMENU == SHRecognizeGesture(&sri)) {
// タップ&ホールド : メニューを表示
hDummyMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_POPUPMENU));
if (NULL != hDummyMenu) {
hPopupMenu = GetSubMenu(hDummyMenu, 0);
TrackPopupMenuEx(hPopupMenu, 0, screenPt.x, screenPt.y, hWnd, NULL);
DestroyMenu(hDummyMenu);
}
}
ちょっとした挙動を確認するためにエミュレータを利用する事も多いのですが、微妙に動作が異なる部分もあるみたいですね。
0 件のコメント:
コメントを投稿