3

リストビューをリソースとして作成し、ダイアログウィンドウにロードしました。リストビュー内のアイテムがクリックされたときにのみコンテキストメニューを検出して表示したい。

 MESSAGE_HANDLER(WM_CONTEXTMENU,OnContextMenu)

        LRESULT OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
            {
                int iSelected = -1;
    int iFocusGroup = -1;
    iSelected = SendMessage((HWND)wParam, LVM_GETNEXTITEM, -1,LVNI_SELECTED);
    iFocusGroup = ListView_GetFocusedGroup((HWND)wParam);
    if( iSelected != -1 && iFocusGroup == -1) {
                    hPopupMenu = CreatePopupMenu();
                    Insert

Menu(hPopupMenu,  0,     MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_SHREDTASK_CTXMENU_DELETE, TEXT("Delete"));
                TrackPopupMenu(hPopupMenu, TPM_TOPALIGN | TPM_LEFTALIGN, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, m_hWnd, NULL); 
            }
            return 0;
        }

OK、これを編集しましたが、ここに表示されているとおりに機能しますが、質問はまだ残っており、ここでフォーカスグループが何であるか、ダイアログでLVM_GETNEXTITEMメッセージを送信すると!= -1?リストビューだけではありませんか?

編集 :

これがあなたの回答に基づいて私が考え出した別の選択肢です:

LRESULT OnNotifyRClick(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
          switch (uMsg)
        {
            case WM_NOTIFY:
                switch (((LPNMHDR)lParam)->code)
                {
                case NM_RCLICK:
                    if (((LPNMHDR)lParam)->idFrom == IDC_LISTTASKFILES)
                    {                       
                         int iSelected = -1;
                         iSelected = SendMessage(GetDlgItem(IDC_LISTTASKFILES), LVM_GETNEXTITEM, -1,LVNI_SELECTED);

                        if( iSelected != -1 ) {
                            hPopupMenu = CreatePopupMenu();
                            InsertMenu(hPopupMenu,  0,     MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_SHREDTASK_CTXMENU_DELETE, TEXT("Delete"));
                            TrackPopupMenu(hPopupMenu, TPM_TOPALIGN | TPM_LEFTALIGN, ((CPoint)GetMessagePos()).x, ((CPoint)GetMessagePos()).y, 0, m_hWnd, NULL); 
                        }
                         bHandled = true;

                        return TRUE;
                    }
                    break; 

                break;
                }

        }
          return false;
    }
4

2 に答える 2

2

OnContextMenuリストビュー内のクリック位置に関係なく、ハンドラーが呼び出されます。ここでのタスクは、正確にクリックが発生した場所を確認し、必要なアクションを決定することです。

ListView_GetFocusedGroupあなたの質問は、あなたが意図的に自分でコードを書くのではなく、インターネットからコードを取得したと私に思わせます。ただし、実行する必要があるのは、「ヒットテスト」メッセージをリストビューに送り返して、関心のあるポイント(クリックポイント)を提供することListView_HitTestですListView_HitTestEx

これを行うと、この場所でアイテムやサブアイテムを取得し、次に何をするかを決めることができます。

于 2012-10-09T16:28:54.257 に答える
2

NM_RCLICKはあなたの友達です。

ただし、ユーザーがキーボードのWindowsメニューキーを押したときにコンテキストメニューを表示するなど、問題全体を解決するわけではありません。このKB記事は、NM_RCLICKとWM_CONTEXTMENUを組み合わせる方法を示しています。(これはCTreeCtrl用ですが、コードをCListViewに適合させるのは簡単です)。

于 2012-10-09T19:13:45.783 に答える