在原來博客中有:MF CListControl 簡單功能使用函數
推薦文章:MFC類CtrlList用法spa
今天又又一次來介紹點新東西:雙擊擊listcontrol 作出響應。固然你可以作的還有很是多,比方顯示點擊的行列,右鍵點擊,後面代碼都有。沒有截圖了.net
主要有code
1插入數據顯示(參考後面代碼)orm
2雙擊有數據的區域(參考後面代碼)作出響應blog
3 響應成功提示事件
部分參考代碼ip
頭文件。ci
#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); };
// 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; }