ページ

2008-04-30

Todayプラグインにコンテキストメニュー(追加)

少し前にTodayプラグインにコンテキストメニューを表示させるときにTrackPopupMenuEx()にはスクリーン座標系を指定しないといけなかった事がありました。
 
このときは取得したパラメータを 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 件のコメント: