C语言中如何设置ListView控件的行高与状态图标
今天使用ListView控件,需要用到这2个知识点,百度一下也没有找到可用的方法。
还是自己看MSDN处理。
一、设置ListView的行高
要实现这样的功能,需要将ListView的风格设置为LVS_OWNERDRAWFIXED样式
“The owner window can paint items in report view.
The list-view control sends a WM_DRAWITEM message to paint each item;
it does not send separate messages for each subitem.
The iItemData member of the DRAWITEMSTRUCT structure contains the item data
for the specified list-view item. ”
需要处理WM_DRAWITEM消息和WM_MEASUREITEM,自绘控件首先会发送WM_MEASUREITEM用于确认控件的行高和宽度等信息,
处理代码如下:
//调整LIST行高 //listview为自绘风格时使用 void Main_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT * lpDrawItem) { switch(lpDrawItem->CtlID) { case MAIN_LIST_TASK://ListView控件ID //MainOnDrawListView(hwnd,lpDrawItem);//自绘控件函数 break; default: break; } } //自绘控件, 确认行高,宽度等 void Main_OnMeasureItem(HWND hwnd, MEASUREITEMSTRUCT * lpMeasureItem) { switch(lpMeasureItem->CtlID) { case MAIN_LIST_TASK: lpMeasureItem->itemHeight = 24;//行高 break; default: break; } }
二、如何设置每一行的状态图标
1.首先绑定一个IMAGELIST到listView控件中,示例代码
HIMAGELIST hi; HBITMAP hBmp = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1)); hi =ImageList_Create(18,18,ILC_COLOR24|ILC_MASK,1,1); //这个高度,如果不是自绘的ListView,将用于填充行高 ImageList_AddMasked(hi,hBmp,RGB(255,255,255)); ListView_SetImageList(hList,hi,LVSIL_STATE);
2.设置LVITEM中的状态值
LVITEM li; ZeroMemory(&li,sizeof(li)); li.mask = LVIF_PARAM |LVIF_TEXT|LVIF_STATE; li.stateMask = LVIS_STATEIMAGEMASK ; li.state = INDEXTOSTATEIMAGEMASK(1) ;//基于1的图标索引值 ListView_InsertItem(hList,0,&li); 或者使用ListView_SetItemState(hList,0,INDEXTOSTATEIMAGEMASK(2),LVIS_STATEIMAGEMASK);//改成第2个图标
写在这里用于备忘。by AsmFox