您的位置:首页 > 编程语言 > C语言/C++

MFC VC++6.0列表控件的使用

2016-01-02 17:58 591 查看
一、创建

创建列表控件,IDC_LIST1

列表视图控件有4种风格:Icon、Small Icon、List和Report。下面简单说下4种风格各自的特点:

Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。

Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。

List列表风格:与小图标风格类似,图标和文字的对齐方式不同。

Report报表风格:列表视图控件可以包含一个列表头来描述各列的含义。每行显示一个列表项,通常可以包含多个列表子项。最左边的列表子项的标签左边可以添加一个图标,而它右边的所有子项则只能显示文字。这种风格的列表视图控件很适合做各种报表。

样式 LVS_ICON、LVS_SMALLICON、LVS_LIST 和 LVS_REPORT 指定四种列表控件 (List Control) 视图

二、关联

// Dialog Data
//{{AFX_DATA(CShowDlg)
enum { IDD = IDD_SHOW_DIALOG };
CTreeCtrl   m_tree;
CListCtrl   m_list;//创建与控件相关联的变量m_List
//}}AFX_DATA


三、重载,避免闪烁

CMyListCtrl m_list;//重载类
//MyListCtrl.h代码
class CMyListCtrl : public CListCtrl
{
// Construction
public:
CMyListCtrl();
long m_bReDraw;
// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyListCtrl)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CMyListCtrl();

// Generated message map functions
protected:
//{{AFX_MSG(CMyListCtrl)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);//重载背景擦除函数,避免闪烁
afx_msg void OnPaint();//数据重绘,彻底避免闪烁
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};


//MyListCtrl.cpp代码

CMyListCtrl::CMyListCtrl()
{
}

CMyListCtrl::~CMyListCtrl()
{
}

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl message handlers
BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
/* 禁止重绘背景 */
return false;
}
void CMyListCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
//使用双缓冲的方法绘制背景
CRect rect;
CRect headerRect;
CDC MemDC;      //内存DC
CBitmap MemMap;

GetClientRect(&rect);
GetDlgItem(0)->GetWindowRect(&headerRect);
MemDC.CreateCompatibleDC(&dc);
MemMap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
MemDC.SelectObject(&MemMap);
MemDC.FillSolidRect(&rect,GetBkColor());

//调用默认的OnPaint(),把图形画在内存DC表上
DefWindowProc(WM_PAINT,(WPARAM)MemDC.m_hDC,(LPARAM)0);
//输出到显示设备
dc.BitBlt(0,
headerRect.Height(),
rect.Width(),
rect.Height(),
&MemDC,
0,
headerRect.Height(),
SRCCOPY);
MemDC.DeleteDC();
MemMap.DeleteObject();
// Do not call CListCtrl::OnPaint() for painting messages
//AfxMessageBox("Here");
}


四、使用

m_list.SetItemCount(100);//设置行的数目,当大批量插入数据时,必须提前说明行数

m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);//插入第一列表头

m_list.InsertColumn(1,"id",LVCFMT_CENTER,100);//插入第二列表头
m_list.InsertColumn(2,"长度",LVCFMT_CENTER,100);//插入第三列表头
m_list.InsertColumn(3,"数据",LVCFMT_CENTER,300);//插入第四列表头
m_list.InsertColumn(4,"时间",LVCFMT_CENTER,100);//插入第五列表头

m_list.InsertColumn(5,"接收帧数",LVCFMT_CENTER,100);//插入第六列表头
m_list.InsertColumn(6,"总线百分比",LVCFMT_CENTER,100);//插入第七列表头
m_list.InsertColumn(7,"报文发送周期",LVCFMT_CENTER,100);//插入第八列表头

m_list.InsertItem(0,"第一行",0);//插入第一行,显示第一个图标
m_list.InsertItem(1,"第二行",1);//插入第二行,显示第二个图标
m_list.InsertItem(2,"第三行",2);//插入第三行,显示第一个图标
m_list.SetItemText(0,2,"在第一行第三列插入数据");//插入第三列数据
m_list.SetCheck(0,true);//选中第一行,使得选中框处于打勾状态
m_list.SetBkColor(RGB(200,150,200)); //设置列背景色
m_list.SetTextBkColor(RGB(200,150,200));//设置文本背景色
m_list.SetTextColor(RGB(250,0,0));//设置文本颜色
#define LVS_EX_DOUBLEBUFFER 0x00010000

m_list.SetExtendedStyle(m_list.GetExtendedStyle()|
LVS_EX_CHECKBOXES|//显示选中图标
LVS_EX_DOUBLEBUFFER|
LVS_EX_FULLROWSELECT | //具有整行选中时变色
LVS_EX_GRIDLINES |//显示网格线
LVS_EX_FLATSB);//伸缩条变色辅助功能


给列表控件插入图标(在程序初始化程序中,对话框应用程序是在)

//头文件中声明变量
CImageList m_pImageList ;
HICON hicon1;
HICON hicon2;


//BOOL CShowDlg::OnInitDialog()
m_pImageList.Create(16, 16, ILC_COLOR4|ILC_MASK, 2, 2);//创建图像列表,ILC_MASK将图标背景设置为透明
//图像列表一般为[16,16]小图标,[32,32],[48,48]可作为大图标使用
//m_pImageList.SetBkColor(RGB(255, 255, 255));
hicon1=AfxGetApp()->LoadIcon(IDI_ICON1);
hicon2=AfxGetApp()->LoadIcon(IDI_ICON2);
m_pImageList.Add(hicon1);
m_pImageList.Add(hicon2);
//初始化列表视
m_list.SetImageList(&m_pImageList,LVSIL_SMALL);


五、使用过程中避免闪烁

//m_list.LockWindowUpdate();
m_list.SetRedraw(false);//禁止本listbox刷新。
//插入数据
//m_list.UnlockWindowUpdate();
//m_list.Invalidate();
//m_list.UpdateWindow();
m_list.SetRedraw(true);//允许本listbox刷新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: