MFC ListControl用法
阿新 • • 發佈:2019-02-17
今天又重新來介紹點新東西:雙擊擊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; }