首页 > 代码库 > MFC 学习之 多对话框及列表控件

MFC 学习之 多对话框及列表控件

MFC 在界面这块,不得不说比较难看,虽然如此,但是它的简洁性(当然,不是说它的代码,而是相对于程序员,减少了自己敲写代码的工作量)。

下面的例子是新建对话框,在新的对话框里添加列表控件,在列表控件里显示必要信息。

效果如图:



新建 MFC 工程,命名为 Draw,添加对话框,新建类 MyPanel

<pre name="code" class="cpp">//CDrawDlg.h

public:
	afx_msg void OnBnClickedBtStart();
	afx_msg void Dlg2_Init();

public:
	MyPanel * panel;

//CDrawDlg.cpp

UINT Func_Thread(LPVOID lpParam)
{
	CDrawDlg * dlg = (CDrawDlg *)lpParam;
	Text_Show(lpParam);
	return 0;
}

void CDrawDlg::OnBnClickedBtStart()
{
	// TODO: 在此添加控件通知处理程序代码
	Dlg2_Init();
	panel->ShowWindow(SW_SHOW);
	AfxBeginThread(Func_Thread, this);
}

void CDrawDlg::Dlg2_Init()
{
	panel->Create(IDD_MY_DIALOG);
}

MyPanel.h

#pragma once
#include "afxcmn.h"

int Text_Show(LPVOID lpParam);
// MyPanel 对话框

class MyPanel : public CDialogEx
{
	DECLARE_DYNAMIC(MyPanel)

public:
	MyPanel(CWnd* pParent = NULL);   // 标准构造函数
	virtual ~MyPanel();

// 对话框数据
	enum { IDD = IDD_MY_DIALOG };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	//自己添加的,初始化Teechart
	virtual BOOL OnInitDialog();
	DECLARE_MESSAGE_MAP()

public:
	void OnTimer(UINT_PTR nIDEvent);
	void OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult );

public:	
	CListCtrl m_List1;
	int count;
	afx_msg void OnBnClickedBtStart();
};

MyPanel.cpp

BEGIN_MESSAGE_MAP(MyPanel, CDialogEx)
	ON_WM_TIMER()
	ON_NOTIFY ( NM_CUSTOMDRAW,IDC_LIST1, OnCustomdrawMyList )
	ON_BN_CLICKED(IDC_BT_START, &MyPanel::OnBnClickedBtStart)
END_MESSAGE_MAP()


// Videodecode 消息处理程序
BOOL MyPanel::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	count = 0;
	//整行选择;有表格线;表头;单击激活
	DWORD dwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE;
	//报表风格;单行选择;高亮显示选择行
	//视频
	m_List1.ModifyStyle(0,LVS_SINGLESEL|LVS_REPORT|LVS_SHOWSELALWAYS);
	m_List1.SetExtendedStyle(dwExStyle);
		
	m_List1.InsertColumn(0,"L0",LVCFMT_CENTER,60,0);
	m_List1.InsertColumn(1,"L1",LVCFMT_CENTER,60,0);
	m_List1.InsertColumn(2,"L2",LVCFMT_CENTER,60,0);
	m_List1.InsertColumn(3,"L3",LVCFMT_CENTER,70,0);
	m_List1.InsertColumn(4,"L4",LVCFMT_CENTER,60,0);
	return TRUE;	
}


// MyPanel 消息处理程序
int Text_Show(LPVOID lpParam)
{
	dlg = (CDrawDlg *)lpParam;	
	return 0;
}

void  MyPanel::OnTimer(UINT_PTR nIDEvent)
{
	CString f_index;
	f_index.Format(_T("%d"),count++);
	//获取当前记录条数
	int nIndex = m_List1.GetItemCount();
	m_List1.InsertItem(nIndex,f_index);
	m_List1.SetItemText(nIndex, 1, "1");
	m_List1.SetItemText(nIndex, 2, "2");
	m_List1.SendMessage(WM_VSCROLL, SB_BOTTOM, NULL);
}


//ListCtrl加颜色
void MyPanel::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
{
	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

	// Take the default processing unless we set this to something else below.
	*pResult = CDRF_DODEFAULT;

	if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
	{
		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
	{
		*pResult = CDRF_NOTIFYSUBITEMDRAW;
	}
	else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
	{

		COLORREF clrNewTextColor, clrNewBkColor;

		int    nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );

		CString strTemp = m_List1.GetItemText(nItem,1);
		//if(strTemp.Compare(_T("I"))==0)
		if(nItem%6 == 0)
		{
			clrNewTextColor = RGB(0,0,0);		//Set the text
			clrNewBkColor = RGB(255,0,0);		//背景设置成红色
		}
		//else if(strTemp.Compare(_T("P"))==0)
		else if(nItem%6 == 2)
		{
			clrNewTextColor = RGB(0,0,0);		
			clrNewBkColor = RGB(0,255,255);		//背景设置成青色
		}
		//else if(strTemp.Compare(_T("B"))==0)
		else if(nItem%6 == 4)
		{
			clrNewTextColor = RGB(0,0,0);		
			clrNewBkColor = RGB(0,255,0);		//背景设置成绿色
		}
		else
		{
			clrNewTextColor = RGB(0,0,0);		
			clrNewBkColor = RGB(255,255,255);
		}

		pLVCD->clrText = clrNewTextColor;
		pLVCD->clrTextBk = clrNewBkColor;

		*pResult = CDRF_DODEFAULT;
	}
}


void MyPanel::OnBnClickedBtStart()
{
	// TODO: 在此添加控件通知处理程序代码
	SetTimer(1, 1000, NULL);
}





MFC 学习之 多对话框及列表控件