2008-03-23

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

作成中のTodayプラグインにコンテキストメニューを表示させようとしています。
これまでだったらSDKのサンプルやMSDNを検索するところですが、今は白本(「Windows Mobileプログラミング徹底理解」を勝手にそう呼んでいます)にほとんど答えが載っています。
やはり日本語の情報はありがたいですよね。
 
早速、白本の6-1を参考にコンテキストメニューを追加してみました。
HMENU       hDummyMenu  = NULL,
            hPopupMenu  = NULL;
SHRGINFO    sri         = {0};

pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hWnd, (LPPOINT)&pt);

sri.cbSize      = sizeof(sri);
sri.hwndClient  = hWnd;
sri.ptDown.x    = LOWORD(lParam);
sri.ptDown.y    = HIWORD(lParam);
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, sri.ptDown.x, sri.ptDown.y, hWnd, NULL);
        DestroyMenu(hDummyMenu);
    }
} else {
    // タップ : Todayプラグインのフォーカス取得
    PostMessage(GetParent(hWnd), TODAYM_TOOKSELECTION, (WPARAM)hWnd, 0);
}
 
でも動かしてみると変な位置にコンテキストメニューが表示されます。
 
仕方がないのでSDKのサンプルを検索、その名もずばり「Menuサンプル」の中で同じような処理を見つけました。
MenuサンプルではClientToScreen()を使ってクライアント領域の座標からスクリーン座標に変換しているようです。 確かにTrackPopupMenuEx()のヘルプにはスクリーン座標を指定しろと書いてありますね。
 
という訳で少し修正。
HMENU       hDummyMenu  = NULL,
            hPopupMenu  = NULL;
SHRGINFO    sri         = {0};
POINT       pt          = {0};

pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hWnd, (LPPOINT)&pt);

sri.cbSize      = sizeof(sri);
sri.hwndClient  = hWnd;
sri.ptDown.x    = pt.x;
sri.ptDown.y    = pt.y;
sri.dwFlags     = SHRG_RETURNCMD;
 
今度は思った通りの場所にメニューを表示することができました。
 
一応はMSDNも確認しておかないといけませんね。
そうなると余計に日本語版のドキュメントも欲しくなります。それなりに需要はあると思うのですが...。
 

0 件のコメント: