使用哪种Winapi listview类型

时间:2016-04-17 09:23:44

标签: c listview winapi

我需要使用WINAPI和MINGW创建列表视图(不可能使用MFC,WTF或任何类型。纯C / C ++和WINAPI),但我不确定哪种列表类型可用于最简单的解决方案。

列表视图将被归属,并且它要求项目位于具有固定项目宽度的行中。

|-----------------------|
| item1 | item2 | item3 |
|-----------------------|
| item4 | item5 | item6 |
|-----------------------|
| item7 | item8 | item9 |
|-----------------------|

我应该使用哪种列表类型来获得最简单的解决方案:

  • LVS_REPORT,包含所有物品和子项目。 (很多自定义消息处理)
  • LVS_ICON,自定义宽度固定。 (不知道怎么做)
  • LVS_LIST ??
  • ???

那里有任何win32编程向导,谁知道如何在没有太多头痛的情况下实现我的目标?

更新

好的,我明白了。 TLDR;解决方案是从用户单击获取光标位置,然后执行subitemhittest并找出用户单击的项目/子项目。然后将该项/子项设置为LVIS_SELECTED。但是您必须拥有该列表,因为Windows不支持本机选择子项列。

nariujifluter求助,提供支持提示和技巧。

2 个答案:

答案 0 :(得分:2)

自定义绘图:
它可以更改项目的字体和背景颜色,等等 它是LVS_REPORT和LVS_ICON

的功能
DWORD OnPrePaint(int nID, LPNMCUSTOMDRAW lpnmcd) {
    if(lpnmcd->hdr.idFrom == IDC_MY_LISTVIEW)  // my list view's ID
        return CDRF_NOTIFYITEMDRAW;            // custom draw
    else
        return CDRF_DODEFAULT;
}
DWORD OnItemPrePaint(int nID, LPNMCUSTOMDRAW lpnmcd) {
    if(lpnmcd->hdr.idFrom == IDC_MY_LISTVIEW){
        LPNMLVCUSTOMDRAW lpnmlv = (LPNMLVCUSTOMDRAW)lpnmcd;
        if(lpnmcd->dwItemSpec % 2) {            // change color
            lpnmlv->clrText = RGB(255, 255, 255);
            lpnmlv->clrTextBk = RGB(128, 128, 128);
        }
    }
    return CDRF_DODEFAULT;
}

所有者画:
必须编写所有绘图代码 它仅适用于LVS_REPORT样式。

void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    int nItem = lpDrawItemStruct->itemID;
    LV_ITEM lvi;
    lvi.mask = LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
    lvi.iItem = nItem;
    lvi.iSubItem = 0;
    lvi.stateMask = 0xFFFF;
    GetItem(&lvi);

    // selected item color
    if (lvi.state & LVIS_SELECTED) {
        CBrush cb(::GetSysColor(COLOR_HIGHLIGHT));
        pDC->FillRect(rcItem, &cb);
    }
    else {
        // stripe color
        if (nItem % 2) {
            CBrush cb(::GetSysColor(LTGRAY_BRUSH));
            pDC->FillRect(rcItem, &cb);
        }
    }

    // draw text
    CRect rectText;
    GetItemRect(nItem, rectText, LVIR_LABEL);
    CString strData = GetItemText(nItem, 0);
    pDC->DrawText(strData, rectText, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER);
}

答案 1 :(得分:1)

了解关于样式和视图的列表视图文档,您想要的是LVS_REPORT,视图样式为您提供行和列。其他视图将根据控件大小调整和重新排列项目。

list view report style

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774735(v=vs.85).aspx#ListView_Styles_and_Views