これまでだったら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 件のコメント:
コメントを投稿