1. 程式人生 > >MFC ListControl用法

MFC ListControl用法

今天又重新來介紹點新東西:雙擊擊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;
}