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