我需要使用WINAPI和MINGW创建列表视图(不可能使用MFC,WTF或任何类型。纯C / C ++和WINAPI),但我不确定哪种列表类型可用于最简单的解决方案。
列表视图项将被归属,并且它要求项目位于具有固定项目宽度的行中。
|-----------------------|
| item1 | item2 | item3 |
|-----------------------|
| item4 | item5 | item6 |
|-----------------------|
| item7 | item8 | item9 |
|-----------------------|
我应该使用哪种列表类型来获得最简单的解决方案:
那里有任何win32编程向导,谁知道如何在没有太多头痛的情况下实现我的目标?
更新
好的,我明白了。 TLDR;解决方案是从用户单击获取光标位置,然后执行subitemhittest并找出用户单击的项目/子项目。然后将该项/子项设置为LVIS_SELECTED。但是您必须拥有该列表,因为Windows不支持本机选择子项列。
答案 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,视图样式为您提供行和列。其他视图将根据控件大小调整和重新排列项目。