怎样设置ListCtrl控件中行的高度

怎样设置ListCtrl控件中行的高度,第1张

1、 ListCtrl添加左键单击(NM_CLICK)函数(这个很重要)。

2、 ListCtrl风格设置(一般是网格)。

一般listctrl默认view风格为report,一般在OnInitDialog函数中:

LONG m_lStyle

m_lStyle = GetWindowLong( m_list.m_hWnd , GWL_STYLE)//获取当前窗口style

m_lStyle |= LVS_EX_FULLROWSELECT//选中某行使整行高亮(只适用与report风格的listctrl)

m_lStyle |= LVS_EX_GRIDLINES//网格线(只适用与report风格的listctrl)

//m_lStyle |= LVS_SHOWSELALWAYS//一直选中item

m_list.SetExtendedStyle( m_lStyle )//设置扩展风格

3、 插入数据

一般在OnInitDialog函数中:

//m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 )

//插入列

m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 )

int nRow = m_list.InsertItem(0, "11")//插入行

m_list.InsertItem(1,"12")

m_list.SetItemText(nRow, 1, "jacky")//设置数据

m_list.SetItemText(nRow+1, 1, "James")

4、 得到listctrl中所有行的checkbox的状态

在OnNMClickList1函数中:

方法一:

m_list.SetExtendedStyle(LVS_EX_CHECKBOXES)

CString str

for(int i=0i<m_list.GetItemCount()i++)

{

if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))

{

str.Format(_T("第%d行的checkbox为选中状态"), i+1)

AfxMessageBox(str)

}

}

方法二:

POSITION pos = m_list.GetFirstSelectedItemPosition()

CString str

if (pos == NULL)

TRACE0("No items were selected!/n")

else

{

while (pos)

{

int nItem = m_list.GetNextSelectedItem(pos)

str.Format(_T("选中了第%d行"), nItem+1)

AfxMessageBox(str)

}

}

5、 删除所有列(即清空)

while ( m_list.DeleteColumn (0));

6、 得到单击的listctrl的行列号

// 方法一:

DWORD dwPos = GetMessagePos()//返回表示屏幕坐标下光标位置的长整数值

CPoint point( LOWORD(dwPos), HIWORD(dwPos) )

m_list.ScreenToClient(&point)//把屏幕上指定点的屏幕坐标转换成用户坐标

LVHITTESTINFO lvinfo

lvinfo.pt = point

lvinfo.flags = LVHT_ABOVE

int nItem = m_list.SubItemHitTest(&lvinfo)

if(nItem != -1)

{

CString strtemp

strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem)

AfxMessageBox(strtemp)

}

// 方法二:

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR

if(pNMListView->iItem != -1)

{

CString strtemp

strtemp.Format("单击的是第%d行第%d列", pNMListView->iItem, pNMListView->iSubItem)

AfxMessageBox(strtemp)

}

7、 右键点击listctrl的itemd出菜单

在资源里画菜单

添加listctrl控件的NM_RCLICK消息相应函数

//右键单击的函数

void CListCtrlDlg::OnNMRclickList1(NMHDR *pNMHDR, LRESULT *pResult)

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR

if(pNMListView->iItem != -1)

{

DWORD dwPos = GetMessagePos()//返回表示屏幕坐标下光标位置的长整数值

CPoint point( LOWORD(dwPos), HIWORD(dwPos) )

CMenu menu

VERIFY( menu.LoadMenu( IDR_MENU1 ) )

CMenu* popup = menu.GetSubMenu(0)//取得被指定菜单激活的下拉式菜单或子菜单的句柄

ASSERT( popup != NULL )

popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x, point.y, this )//在指定位置显示快捷菜单,并跟踪菜单项的选择

}

*pResult = 0

}

著的性质是能使荧光物质发光,另外还可以灭菌 。

为列表框插入图标,每一行的高度自动变为图标的高度。这个方法很快,但总觉得有点别扭,且不好移植。

1.在对话框上拖拉出一个ListControl控件,并设置属性OwenDrawFixed属性为TRUR;(重载代码在本文最后)2.为工程添加一个MFC类(这里我假设类名叫CMyListCtrl),派生于MFC的CListCtrl类。并重载CListCtrl::DrawItem方法;3.为CMyListCtrl类添加变量intm_nRowHeight变量,用来保存指定的行高度;4.在CMyListCtrl的MESSAGE_MAP中添加宏ON_WM_MEASUREITEM_REFLECT()具体是到CMyLsitCtrl的cpp文件中添加,看起来就像这样:BEGIN_MESSAGE_MAP(CMyListCtrl,CListCtrl)ON_WM_MEASUREITEM_REFLECT()END_MESSAGE_MAP()5.重载CMyListCtrl::MeasureItem方法。这一步需要靠手工添加,类向导并不能帮你。注意:这一步不是给CMyListCtrl添加处理函数,不要用类向导。6.为CMyListCtrl类添加一个接口方法用来设置m_nRowHeight的高度;7.为在1中添加的列表框控件添加一个变量m_MyListCtrl,类型为CMyListCtrl。在对话框的初始化函数中调用m_MyListCtrl.SetRowHeight(60)。8.加入其它代码,编译、运行,如果没有什么问题,你可以看到设置行高度起作用了。

(1) 实现自定义行高。

我们都知道,mfc 自带的 listctrl 控件的行高是固定的,不能够自定义的进行改变。如果设置一个比较大位图,或者简单的设置比较大号的字体,这些方法虽然能够改变行高,但是没有接触到问题的实质。我们使用消息反射机制来实现自定义行高。有关消息反射机制,请参见 msdn 。实现自定义行高的 listctrl 基于以下事实:当我们给 listctrl 发送 WM_WINDOWPOSCHANGED消息时,也就是告诉 listdctrl 控件大小、位置等发生变化,这时候 listctrl 控件就会触发 WM_MEARSURITEM 消息,当然这个是反射消息。通过映射这个消息,我们就可以改变 listctrl 控件的行高。当然还要设置 listctrl 的 Owen Draw Fixed 风格, WM_MEARSURITEM 只有在 Owen Draw Fixed 风格才有效。

总结一下,如果要创建自定义行高的listctrl ,大概要以下步骤:

(1) 定义新类,继承listctrl ,设置 Owen Draw Fixed 风格,并且手动映射 ON_WM_MEASUREITEM_REFLECT 消息。

(2) 增加设置行高的接口,通过设置发送WM_WINDOWPOSCHANGED 消息引发 ON_WM_MEASUREITEM_REFLECT 消息,例如:

void CListEx::SetItemHeight(UINT nHeight)

{

m_nItemHeight = nHeight

CRect rcWin

GetWindowRect(&rcWin)

WINDOWPOS wp

wp.hwnd = m_hWnd

wp.cx = rcWin.Width()

wp.cy = rcWin.Height()

wp.flags = SWP_NOACTIVATE | SWP_NOMOVE |SWP_NOOWNERZORDER | SWP_NOZORDER

SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp)

}

(2) 映射 ON_WM_MEASUREITEM_REFLECT 反射消息,在反射消息里设置行高, 例如:

void CListEx ::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)

{

lpMeasureItemStruct->itemHeight = m_nItemHeight

}

(3) 完成控件自绘函数,CListEx::DrawItem 。自此,自定义设置行高功能已经实现。

三、 增加编辑功能

增加编辑功能一般的思路,就是在单击或双击的时候,创建一个CEDIT 编辑框,然后把编辑框覆盖当前的 subitem 上,并且使编辑框获取焦点。当编辑框失去焦点时,把编辑框里的文字,显示到 listctrl 控件上,就可以了。为了能够使控件知道何时显示编辑框中的文字,所以还有重写编辑框,当编辑框失去焦点时,通过消息通知 listctrl 控件。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11251283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存