MFC ListControl使用方法
Posted phlsheji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC ListControl使用方法相关的知识,希望对你有一定的参考价值。
在原来博客中有:MF CListControl 简单功能使用
推荐文章:MFC类CtrlList用法
今天又又一次来介绍点新东西:双击击listcontrol 做出响应。当然你能够做的还有非常多,比方显示点击的行列,右键点击,后面代码都有。没有截图了
主要有
1 插入数据
2 得到listctrl 中全部行的checkbox 的状态
3 得到listctrl 中全部选中行的序号
4 对数据做出双击处理与推断
1插入数据显示(參考后面代码)
2双击有数据的区域(參考后面代码)做出响应
3 响应成功提示
部分參考代码
头文件。
#pragma once #include "afxcmn.h" #include "afxwin.h" // cpagebg 对话框 class cpagebg : public CDialogEx { DECLARE_DYNAMIC(cpagebg) public: cpagebg(CWnd* pParent = NULL); // 标准构造函数 virtual ~cpagebg(); // 对话框数据 enum { IDD = IDD_DIALOGBG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: CListCtrl m_BgListCtr; void InitBgList(void); CEdit m_dzbg1; afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnNMRClickList3(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnBnClickedCheck2(); afx_msg void OnNMDblclkList3(NMHDR *pNMHDR, LRESULT *pResult); };
cpp文件
// cpagebg.cpp : 实现文件 // #include "stdafx.h" #include "103srv.h" #include "cpagebg.h" #include "afxdialogex.h" // cpagebg 对话框 IMPLEMENT_DYNAMIC(cpagebg, CDialogEx) cpagebg::cpagebg(CWnd* pParent /*=NULL*/) : CDialogEx(cpagebg::IDD, pParent) { } cpagebg::~cpagebg() { } void cpagebg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST3, m_BgListCtr); DDX_Control(pDX, IDC_EDIT6, m_dzbg1); } BEGIN_MESSAGE_MAP(cpagebg, CDialogEx) ON_WM_TIMER() ON_NOTIFY(NM_RCLICK, IDC_LIST3, &cpagebg::OnNMRClickList3) ON_NOTIFY(NM_DBLCLK, IDC_LIST3, &cpagebg::OnNMDblclkList3) END_MESSAGE_MAP() // cpagebg 消息处理程序 void cpagebg::InitBgList(void) { DWORD dwStyle = m_BgListCtr.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;// 选中某行使整行高亮(仅仅适用与report 风格的listctrl ) dwStyle |= LVS_EX_GRIDLINES;// 网格线(仅仅适用与report 风格的listctrl ) //dwStyle |= LVS_EX_CHECKBOXES;//item 前生成checkbox 控件 m_BgListCtr.SetExtendedStyle(dwStyle); // 设置扩展风格 dwStyle |= LVS_EX_FULLROWSELECT;// 选中某行使整行高亮(仅仅适用与report 风格的listctrl ) //设置列表控件的报表显示方式 //m_BgListCtr.ModifyStyle(LVS_ICON | LVS_SMALLICON | LVS_LIST, LVS_REPORT); //设置列表控件显示网格线 //m_BgListCtr.SetExtendedStyle(LVS_EX_GRIDLINES); //在列表控件中插入列 m_BgListCtr.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50); m_BgListCtr.InsertColumn(1, _T("报告"), LVCFMT_LEFT, 100); m_BgListCtr.InsertColumn(2, _T("时间"), LVCFMT_LEFT, 200); m_BgListCtr.InsertColumn(3, _T("时间代码"), LVCFMT_LEFT, 100); m_BgListCtr.InsertColumn(4, _T("參数个数"), LVCFMT_LEFT, 100); m_BgListCtr.InsertColumn(5, _T("參数值"), LVCFMT_LEFT, 150); SetTimer(1, 1000, NULL); SetTimer(2, 2000, NULL); SetTimer(3, 3000, NULL); LONG lStyle; /*m_BgListCtr.InsertItem(0, _T("1")); m_BgListCtr.InsertItem(1, _T("2"));*/ //for (int n = 0; n < 5; n++) //{ // CString strColumnHeading = _T(""); // //strColumnHeading.Format(_T("Column %d"), n); // m_BgListCtr.InsertColumn(n, strColumnHeading, LVCFMT_LEFT, 100); //} //在列表控件中插入行 for (int m = 0; m <3 ;m++ ) { CString strItem = _T(""); strItem.Format(_T(" %d"), m); m_BgListCtr.InsertItem(m, strItem); for (int n = 1; n < 2; n++) { CString strText = _T("动作报告"); //strText.Format(_T("SubItem %d %d"), m, n); m_BgListCtr.SetItemText(m, n, strText); } } } void cpagebg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此加入消息处理程序代码和/或调用默认值 CTime time = CTime::GetCurrentTime(); CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S"); //AfxMessageBox(m_strTime); AfxSetWindowText(m_dzbg1,m_strTime ); switch (nIDEvent) { case 1: for (int m= 0; m<1; m++) { for (int n = 2; n < 3; n++) { m_BgListCtr.SetItemText(m, n, m_strTime); } } break; case 2: for (int m= 1; m< 2; m++) { for (int n = 2; n < 3; n++) { m_BgListCtr.SetItemText(m, n, m_strTime); } } break; case 3: for (int m= 2; m< 3; m++) { for (int n = 2; n < 3; n++) { m_BgListCtr.SetItemText(m, n, m_strTime); } } break; } CDialogEx::OnTimer(nIDEvent); } void cpagebg::OnNMRClickList3(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此加入控件通知处理程序代码 //AfxMessageBox(_T("1")); /*DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_BgListCtr.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; int nItem = m_BgListCtr.SubItemHitTest(&lvinfo); if(nItem != -1) { CString strtemp; strtemp.Format(_T(" 单击的是第%d 行第%d 列"), lvinfo.iItem, lvinfo.iSubItem); AfxMessageBox(strtemp); } */ DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_BgListCtr.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; UINT nFlag; int nItem = m_BgListCtr.HitTest(point, &nFlag); // 推断是否点在checkbox 上 /*if(nFlag == LVHT_ONITEMSTATEICON) { AfxMessageBox(_T(" 点在listctrl 的checkbox 上")); } */ *pResult = 0; } void cpagebg::OnBnClickedCheck2() { // TODO: 在此加入控件通知处理程序代码 } //双击事件 void cpagebg::OnNMDblclkList3(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此加入控件通知处理程序代码 //AfxMessageBox(_T(" 2222")); // ::MessageBox(NULL,_T("列表为空"),_T("标题"),MB_OK); DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_BgListCtr.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; int nItem = m_BgListCtr.SubItemHitTest(&lvinfo); if(nItem != -1)//在有数据的显示点击有效 { /*CString strtemp; strtemp.Format(_T(" 单击的是第%d 行第%d 列"), lvinfo.iItem, lvinfo.iSubItem); AfxMessageBox(strtemp); */ if(::MessageBox(m_hWnd,_T("确定产生报告"),_T("确认?"),MB_OKCANCEL) == IDCANCEL) { AfxMessageBox(_T(" error")); }else { AfxMessageBox(_T(" sucess")); } } *pResult = 0; }
以上是关于MFC ListControl使用方法的主要内容,如果未能解决你的问题,请参考以下文章
MFC使用ListControl时,第一次左键点击ListControl的列表时无法触发NM_CLICK消息,点击第二次时才能触发