在原來博客中有: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;
}
