SDK Index Previous page Next page

ListViewにポップアップメニューを付ける


はじめに

前回作ったリストビューに、ポップアップメニューを付けます。ウインドウ内で右クリックするとその時選択しているアイテムがメニューに表示されます。サンプルプログラム

プログラム

今回の変更箇所はリストビュー内で右クリックされたかどうか調べる部分と、メニューに選択されているアイテム名を追加する部分です。

右クリックされたかどうか調べる

WM_NOTIFYメッセージが送られてきたときに、その通知コードがNM_RCLICKなら右クリックされたことを示すので、メニューを表示します。

//WM_NOTIFYメッセージの処理
BOOL DoNotify(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    #define lpNM   ((LPNMHDR)lParam)

    HMENU     hMenu = NULL;
    BOOL      bRet = FALSE;
    POINT     pt;

    switch(lpNM->code){
        case NM_RCLICK:
            GetCursorPos(&pt);
            hMenu = CreatePopupMenu();
            SetListItemToMenu(hMenu,lpNM->hwndFrom);
            TrackPopupMenu(hMenu,TPM_LEFTALIGN|TPM_LEFTBUTTON,pt.x,pt.y,0,hWnd,NULL);
            DestroyMenu(hMenu);
            return (FALSE);
    }

    return FALSE;
}
特に問題はないと思います。

メニューに選択されているアイテム名を追加する

選択されているアイテムを得るには、ListView_GetNextItemマクロを使います。このマクロは指定された条件を満たすアイテムのアイテム番号を返すのでその条件に選択されているという条件を指定します。
次に、アイテム番号からアイテムの名前をListView_GetItemTextマクロを使って取得します。
最後に、そのアイテム名をAppendMenuでメニューに追加します。
後は、選択されているアイテムが無くなるまでこれを繰り返して終わりです。

void SetListItemToMenu(HMENU hMenu,HWND hList)
{
    int Item;
    char    str[256];

    Item=-1;
    while((Item = ListView_GetNextItem(hList, Item, LVNI_ALL | LVNI_SELECTED))!=-1){
        ListView_GetItemText(hList,Item,0,str,256);
        AppendMenu(hMenu, MF_STRING , Item, str);
    }
}

おわりに

今回は、見ての通り手抜きです。誰かネタをください


to sdk prev next