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出菜单
在资源里画菜单
//右键单击的函数
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 控件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)