精华内容
下载资源
问答
  • mfc列表框源码

    2012-04-27 15:26:30
    mfc列表框源码
  • VC6.0 MFC 列表框 列表控件 添加 修改 删除 写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧! 一、未卜先知 1、编译运行后,点击“学生档案信息”,界面如下图所示...

    VC6.0 MFC 列表框 列表控件 添加 修改 删除

    写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧!

    一、未卜先知

    1、编译运行后,点击“学生档案信息”,界面如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    2、添加记录,如下图所示。
    在这里插入图片描述
    3、修改记录,如下图所示。
    在这里插入图片描述
    4、删除记录,如下图所示。
    在这里插入图片描述
    二、实现步骤

    1、新建一个工程,如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    2、建立菜单,并给菜单做一个消息响应函数,如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    3、接下来在对话框中进行相应操作,具体步骤如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    4、建立类向导,取类名“CDlgStuInfo”,如下图所示。
    在这里插入图片描述
    5、接下来,我们通过编程添加一些数据。首先在CdlgStuInfo中右击添加消息响应句柄,如下图所示。
    在这里插入图片描述
    6、在OnInitDialog() 中添加代码,如下。

    BOOL CDlgStuInfo::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	// TODO: Add extra initialization here
    	DWORD dwStyle;
    	dwStyle = m_listCtrl.GetExtendedStyle();
    	dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES  | LVS_EX_ONECLICKACTIVATE;
    	m_listCtrl.SetExtendedStyle(dwStyle);
    	return TRUE;  // return TRUE unless you set the focus to a control
    	       // EXCEPTION: OCX Property Pages should return FALSE
    }
    

    记得要把头文件:#include "DlgStuInfo.h"对话框类嵌入进去!

    7、在OnMStuInfo()中添加代码,如下。

    void CChapterView::OnMStuInfo() 
    {
    	// TODO: Add your command handler code here
    	CDlgStuInfo dlg_stuInfo;
    	dlg_stuInfo.DoModal();
    }
    

    8、此时,运行结果如下图所示。
    在这里插入图片描述
    9、在第6步的基础上,继续往OnInitDialog() 中添加代码,如下。

    BOOL CDlgStuInfo::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	// TODO: Add extra initialization here
    	DWORD dwStyle;
    	dwStyle = m_listCtrl.GetExtendedStyle();
    	dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES  | LVS_EX_ONECLICKACTIVATE;
    	m_listCtrl.SetExtendedStyle(dwStyle); //设置显示风格
    	m_listCtrl.InsertColumn(0,"学号",LVCFMT_CENTER,100); //第一个参数是字段的编号
    	m_listCtrl.InsertColumn(1,"姓名",LVCFMT_CENTER,100); //第二个参数是字段的名字
    	m_listCtrl.InsertColumn(2,"性别",LVCFMT_CENTER,100); //第三个参数是字段的显示风格
    	m_listCtrl.InsertColumn(3,"专业",LVCFMT_CENTER,100); //第四个参数是字段的宽度
    	m_listCtrl.InsertColumn(4,"班级",LVCFMT_CENTER,100); //设置表格字段名
    	m_listCtrl.InsertItem(0,"0001"); //0即表格中的第一行
    	m_listCtrl.SetItemText(0,1,"张三");
    	m_listCtrl.SetItemText(0,2,"男");
    	m_listCtrl.SetItemText(0,3,"电子信息");
    	m_listCtrl.SetItemText(0,4,"202001"); //在表格中添加数据,插入一行记录
    	m_listCtrl.InsertItem(1,"0002");
    	m_listCtrl.SetItemText(1,1,"李丽");
    	m_listCtrl.SetItemText(1,2,"女");
    	m_listCtrl.SetItemText(1,3,"计算机");
    	m_listCtrl.SetItemText(1,4,"202002");
    	return TRUE;  // return TRUE unless you set the focus to a control
    	        // EXCEPTION: OCX Property Pages should return FALSE
    }
    

    10、新建一个对话框,具体如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    11、紧接着建立它所对应的类,如下图所示。
    在这里插入图片描述
    12、双击“添加记录”按钮,把“添加一条学生记录信息”这个对话框给调出来,如下图所示。
    在这里插入图片描述
    13、把“添加一条学生记录信息”对话框的头文件:#include "Dlg_StuInfoAppe.h"嵌入进来。然后在OnBTNAppe()中编程。

    void CDlgStuInfo::OnBTNAppe() 
    {
    	// TODO: Add your control notification handler code here
    	CDlg_StuInfoAppe dlg_stuInfoAppe;
    	dlg_stuInfoAppe.DoModal();
    }
    

    14、接下来怎么把一条新的学生信息通过“添加一条学生记录信息”对话框加到上一个 “学生档案信息”对话框的列表中去,这是我们的目的。

    15、在对应部分添加如下代码:
    CString m_sNo,m_sName,m_sSex,m_sDept,m_sClass;
    在这里插入图片描述

    class CDlgStuInfo : public CDialog
    {
    // Construction
    public:
    	CDlgStuInfo(CWnd* pParent = NULL);   // standard constructor
    
    // Dialog Data
    	//{{AFX_DATA(CDlgStuInfo)
    	enum { IDD = IDD_DlgStuInfo };
    	CListCtrl	m_listCtrl;
    	//}}AFX_DATA
    
    	CString m_sNo,m_sName,m_sSex,m_sDept,m_sClass;
    
    	int m_listSelPos; //获取当前被选中的位置
    
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CDlgStuInfo)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	//}}AFX_VIRTUAL
    
    // Implementation
    protected:
    
    	// Generated message map functions
    	//{{AFX_MSG(CDlgStuInfo)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnBTNAppe();
    	afx_msg void OnBTNModi();
    	afx_msg void OnClickList1(NMHDR* pNMHDR, LRESULT* pResult);
    	afx_msg void OnBTNDele();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    

    16、点击“确定”按钮后接收添加的信息到上一个 (学生档案信息)对话框的列表中去,代码如下。

    void CDlgStuInfo::OnBTNAppe() 
    {
    	// TODO: Add your control notification handler code here
    	CDlg_StuInfoAppe dlg_stuInfoAppe;
    	if(IDOK == dlg_stuInfoAppe.DoModal())
    	{
    		m_sNo = dlg_stuInfoAppe.m_sNo;
    		m_sName = dlg_stuInfoAppe.m_sName;
    		m_sSex = dlg_stuInfoAppe.m_sSex;
    		m_sDept = dlg_stuInfoAppe.m_sDept;
    		m_sClass = dlg_stuInfoAppe.m_sClass; //把添加记录对话框中的数据传过来,保存到基础信息对话框中
    		int pos; //添加的位置
    		pos = m_listCtrl.GetItemCount();
    		m_listCtrl.InsertItem(pos,m_sNo);
    		m_listCtrl.SetItemText(pos,1,m_sName);
    		m_listCtrl.SetItemText(pos,2,m_sSex);
    		m_listCtrl.SetItemText(pos,3,m_sDept);
    		m_listCtrl.SetItemText(pos,4,m_sClass); //把获取进来的数据插进去
    	}
    }
    

    17、双击“修改记录”按钮,把“修改记录信息”这个对话框给调出来(同12)。

    18、把“修改记录信息”对话框的头文件:#include "Dlg_StuInfoModi.h"嵌入进来。然后在OnBTNModi()中编程(同13)。

    void CDlgStuInfo::OnBTNModi() 
    {
    	// TODO: Add your control notification handler code here
    	CDlg_StuInfoModi dlg_stuInfoModi;
        dlg_stuInfoModi.DoModal();
    }
    

    19、接下来怎么把 “修改记录信息”对话框中要修改的记录更新到上一个 “学生档案信息”对话框的列表中去,这是我们的目的(同14)。

    20、我们回到IDD_DlgStuInfo对话框,选中对话框,右击选择“事件…”,在弹出的事件句柄中选择“NM_CLICK”,如下图所示。
    在这里插入图片描述
    在这里插入图片描述

    void CDlgStuInfo::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	// TODO: Add your control notification handler code here
    	m_listSelPos = m_listCtrl.GetSelectionMark();
    //获取当前被选行的信息,传送到编辑对话框中去
    	*pResult = 0;
    }
    

    21、添加代码如下(类似16)。

    void CDlgStuInfo::OnBTNModi() 
    {
    	// TODO: Add your control notification handler code here
    	CDlg_StuInfoModi dlg_stuInfoModi;
    	dlg_stuInfoModi.m_sNo = m_listCtrl.GetItemText(m_listSelPos,0); //获取当前记录的显示的文本
    	dlg_stuInfoModi.m_sName = m_listCtrl.GetItemText(m_listSelPos,1);
    	dlg_stuInfoModi.m_sSex = m_listCtrl.GetItemText(m_listSelPos,2);
    	dlg_stuInfoModi.m_sDept = m_listCtrl.GetItemText(m_listSelPos,3);
    	dlg_stuInfoModi.m_sClass = m_listCtrl.GetItemText(m_listSelPos,4);
    
    	if(IDOK == dlg_stuInfoModi.DoModal())
    	{ //把新数据传送给浏览对话框,实现信息的修改
    		UpdateData(true); //把对话框中的信息更新到内存中去
    		m_listCtrl.SetItemText(m_listSelPos,0,dlg_stuInfoModi.m_sNo);
    		m_listCtrl.SetItemText(m_listSelPos,1,dlg_stuInfoModi.m_sName);
    		m_listCtrl.SetItemText(m_listSelPos,2,dlg_stuInfoModi.m_sSex);
    		m_listCtrl.SetItemText(m_listSelPos,3,dlg_stuInfoModi.m_sDept);
    		m_listCtrl.SetItemText(m_listSelPos,4,dlg_stuInfoModi.m_sClass);
    	}
    }
    

    22、“删除记录”类似,不再叙述。这里仅将该部分代码附上,如下。

    void CDlgStuInfo::OnBTNDele() 
    {
    	// TODO: Add your control notification handler code here
    	CString str;
    	str.Format("确认删除第 %d 行",m_listSelPos + 1);
    	if(IDYES == AfxMessageBox(str,MB_YESNO|MB_ICONQUESTION))
    	{
    		m_listCtrl.DeleteItem(m_listSelPos);
    	}
    } 
    

    三、执行结果

    1、编译运行后,点击“学生档案信息”,界面如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    2、添加记录,如下图所示。
    在这里插入图片描述
    3、修改记录,如下图所示。
    在这里插入图片描述
    4、删除记录,如下图所示。
    在这里插入图片描述

    展开全文
  • MFC列表框的使用

    2012-03-21 17:29:16
    MFC中关于列表框的使用,类似于学生管理系统,这个是国家来做的,方法都一样
  • 将数据库access数据导入mfc列表框,可以删除、修改、增加,并且同步保存到数据库中
  • MFC列表框控件的动态编辑

    千次阅读 2019-09-10 13:14:41
    在我们进行mfc 编程时,我们需要用到列表框显示各层或各物体的参数设置,同时也希望能编辑其参数。我以前在网上查找,用了CComboListCtrl,这需要3个cpp 和 h 文件,用起来还不容易。 最近看到一个文章...

    在我们进行mfc 编程时,我们需要用到列表框显示各层或各物体的参数设置,同时也希望能编辑其参数。我以前在网上查找,用了CComboListCtrl,这需要3个cpp 和 h 文件,用起来还不容易。

    最近看到一个文章 https://blog.csdn.net/qingyang8513/article/details/50986455 ,这个直接用 listctrl 和 一个Edit 控件,很简单。所以我也测试一下,并记录在此。

    运行效果如下,点击一处列表框里内容即可编辑,但我剪辑图时剪辑不到编辑状态。

    我的运行环境是vc2010,下面开始讲解过程:

    重点内容:

          1)List Control控件NM_DCLICK消息响应事件;

          2)Edit Control的KillFocus消息响应;

          3)Edit Control的动态显示及隐藏;

          4)List Control获取指定行和列的编号,并获取指定行和列的内容及修改赋值。

    操作:

    1、创建基于对话框的MFC应用程序,删除原有的静态文本;

    2、添加一个List Control控件和一个Edit Control控件,并分别关联控制变量m_ListTem和m_EditTest(List Control控件适当调整大小,Edit Control大小不用调整);

    3、初始化对话框函数OnInitDialog中实现List Control控件和Edit Control控件的初始化,    InitList();    UpdateList();

    代码如下:

    BOOL CListCtrlTestDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    
    	// TODO: Add extra initialization here
    	InitList();
    	UpdateList();
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CListCtrlTestDlg::InitList(void)
    {
    	Clayer layer={"zhang",1.3,15.6,88};
    	m_layer.push_back(layer);
    	Clayer  layer1={"Li",22.3,25.6,288};
    	m_layer.push_back(layer1);
    	Clayer layer2={"Wang",32.33,35.6,388};
    	m_layer.push_back(layer2);
    
    	m_EditTest.ShowWindow(SW_HIDE);
    	CRect rect;
    	m_ListTem.GetClientRect(&rect);
    	int iLength = rect.Width();
    	m_ListTem.SetExtendedStyle(m_ListTem.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    	m_ListTem.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 40);
    	m_ListTem.InsertColumn(1, _T("名字"), LVCFMT_CENTER, 80);
    	m_ListTem.InsertColumn(2, _T("x"), LVCFMT_CENTER, (iLength - 120)/3);
    	m_ListTem.InsertColumn(3, _T("y"), LVCFMT_CENTER, (iLength - 120)/3);
    	m_ListTem.InsertColumn(4, _T("旋转角度"), LVCFMT_CENTER, (iLength - 120)/3);
    
    
    }
    
    void CListCtrlTestDlg::UpdateList(void)
    {
    
    	CString index,x,y,z,name,count,rotate,blocks;
    	while(m_ListTem.GetItemCount()>0)
    		m_ListTem.DeleteItem(0);
    	for(int i=0;i<m_layer.size();i++)
    	{
    	
    		index.Format("%d",i);
    		Clayer& layer=m_layer[i];
    		name=layer.name;
    		x.Format("%.2f",layer.x);
    		y.Format("%.2f",layer.y);
    		count.Format("%d",layer.count);
    
    
    		m_ListTem.InsertItem(i,index);
    
    		m_ListTem.SetItemText(i,1,name);
    		m_ListTem.SetItemText(i,2,x);
    		m_ListTem.SetItemText(i,3,y);
    		m_ListTem.SetItemText(i,4,count);
    	}
    }

    在h 文件中定义层参数结构,并定义层参数向量m_layer.

    typedef struct {CString name;float x;float y;int count;} Clayer;

    std::vector<Clayer> m_layer;

    有上面,上面代码才不报错。这里完成了初始显示,应该可以得到开头的效果,但不能编辑。

    动态编辑的核心

    4、对话框头文件中添加int型变量m_Row和m_Col,用于保存双击时选中的行和列号,并初始化为-1(未选中状态);

    5、为List Control控件添加NM_DBLCLK消息响应,并添加代码如下:

    void CListCtrlTestDlg::OnDblclkList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    	// TODO: Add your control notification handler code here
    		CRect rc;
    	CString strTemp;
    	NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR;
    	m_Row = pNMListView->iItem;
    	m_Col = pNMListView->iSubItem;
     
    	if (pNMListView->iItem == -1)	//选择空白处
    		return;
     
    	if (m_Col != 0)	// 选择子项
    	{
    		m_ListTem.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);
    		m_EditTest.SetParent(&m_ListTem);
    		m_EditTest.MoveWindow(rc);
    		m_EditTest.SetWindowText(m_ListTem.GetItemText(m_Row, m_Col));
    		m_EditTest.ShowWindow(SW_SHOW);
    		m_EditTest.SetFocus();//设置Edit焦点
    		m_EditTest.ShowCaret();//显示光标
    		m_EditTest.SetSel(0, -1);//全选
    	}
    
    	*pResult = 0;
    }
    

     

    6、为Edit Control控件添加EN_KILLFOCUS消息响应,并添加代码如下:

    void CListCtrlTestDlg::OnKillfocusEdit1()
    {
    	// TODO: Add your control notification handler code here
    	CString str;
    	m_EditTest.GetWindowText(str);
    	m_ListTem.SetItemText(m_Row, m_Col, str);
        //这里其实应该保存编辑结果,简化了,实际程序要有改变参数
    	m_EditTest.ShowWindow(SW_HIDE);
    }

    现在可以编译运行并测试程序了,应该就是我们开头的结果。

    改进

    输入完数据后,一般希望回车,就生效,可实际情况是要离开才生效,有点操作不方便。

    编辑框怎么相应回车呢?

    类精灵CListCtrlTestDlg里转到 Virtual function,点击添加 PreTranslateMessage

    编辑PreTranslateMessage函数如下:

    BOOL CListCtrlTestDlg::PreTranslateMessage(MSG* pMsg)
    {
    	 if (WM_KEYDOWN ==pMsg->message && VK_RETURN == pMsg->wParam)
    	 {
    		 if (m_EditTest.IsWindowVisible())
    		{
    			m_EditTest.ShowWindow(SW_HIDE);
    			return TRUE;
    		}
    	 }
    	return CDialogEx::PreTranslateMessage(pMsg);
    }
    

    这段代码的含义是:在按下回车键时, 如果编辑框是可见的,就让编辑框不显示。编辑框不显示就触发EN_KILLFOCUS消息。达到回车就保存的目的。

     

     

    展开全文
  • 通过VC6.0的MFC实现简单的学生信息管理,包括列表框,列表控件,添加,修改,删除等。
  • mfc 列表框行颜色设置方法

    千次阅读 2019-09-11 14:04:15
    指定改变CListCtrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加入的行,方便操作可查看,也可以让添加和...新建一个mfc 对话框工程,并添加列表框控件,添加一些数据...

    指定改变CListCtrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加入的行,方便操作可查看,也可以让添加和修改的记录显示不一样的颜色,方便的多了,VC自带的没有这种功能。

    虽然说自带没有这个功能,但可以用NU_CUSTOMDRAW

    我的环境是vc2010, 听说vc6 没有,需要手动添加。

    新建一个mfc 对话框工程,并添加列表框控件,添加一些数据,让他能正常显示一个列表框的表格。这个时候还不能设置行颜色。

    添加改变颜色的事件

    打开MFC Class Wizard ,用如下方式添加列表框(我的是IDC_LIST2)的NU_CUSTOMDRAW事件,

    然后把代码加入如下: 

    void CListCtrlTestDlg::OnCustomdrawList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	//LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    	// TODO: Add your control notification handler code here
    	//pNMCD->clrTextBk = RGB(51, 153, 255);
    	//pNMCD->clrText = RGB(255, 255, 255);
    	//*pResult = 0;
    
    	LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
        *pResult = 0;
    	//return ;
    
    switch(lplvcd->nmcd.dwDrawStage)
    {
    	case CDDS_PREPAINT :
    		*pResult = CDRF_NOTIFYITEMDRAW;
    		break;
    	case CDDS_ITEMPREPAINT:
    		*pResult =CDRF_NOTIFYSUBITEMDRAW;
    	break;
    	case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
    		if(lplvcd->nmcd.dwItemSpec==0)
    		{
    		lplvcd->clrTextBk = RGB(255,0,0); //红色
    		}
    		if(lplvcd->nmcd.dwItemSpec==1)
    		{
    		lplvcd->clrTextBk = RGB(0,255,0); //绿色
    		}
    		if(lplvcd->nmcd.dwItemSpec==2)
    		{
    		lplvcd->clrTextBk = RGB(0,0,255); //蓝色
    		}
    		if(lplvcd->nmcd.dwItemSpec==3)
    		{
    		lplvcd->clrTextBk = RGB(255,255,0); //黄色
    		}
    		if(lplvcd->nmcd.dwItemSpec==4)
    		{
    		lplvcd->clrTextBk = RGB(160,32,240); //紫色
    		}
    		if(lplvcd->nmcd.dwItemSpec==5)
    		{
    		lplvcd->clrTextBk = RGB(0,255,255); //青色
    		}
    		if(lplvcd->nmcd.dwItemSpec==6)
    		{
    		lplvcd->clrTextBk = RGB(255,97,0); //橙色
    		}
    		if(lplvcd->nmcd.dwItemSpec==7)
    		{
    		lplvcd->clrTextBk = RGB(0,255,127); //嫩绿色
    		}
    		if((lplvcd->nmcd.dwItemSpec)>7)
    		{
    		lplvcd->clrTextBk = RGB(0,0,0); //黑色
    		}
    		*pResult = CDRF_NEWFONT;
    		break;
    	}
    
    }
    

    编译运行结果如下:

    代码解说:

    开始我看到一文,事件产生的代码如下:

        LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
        // TODO: Add your control notification handler code here

    后面好像会报错,改为文章代码才好,这个代码是别人用vc6 做的。

    更多属性可以看微软的内容介绍:

    https://docs.microsoft.com/zh-cn/windows/win32/api/commctrl/ns-commctrl-nmlvcustomdraw?redirectedfrom=MSDN

    这个代码只是设置0,1,2,3,4,5,6,7行的颜色,其他行都为黑色。当然只是演示功能的需要。

    这里customdraw有几个阶段。

    switch(lplvcd->nmcd.dwDrawStage) 就是判断阶段,只是在

    case CDDS_SUBITEM | CDDS_ITEMPREPAINT:  才设置背景颜色。

    其他阶段不要做。

    展开全文
  • mfc列表框控件实现

    2008-12-27 21:50:08
    mfc实现列表框控件,当输入你要查找的就会列出你要得资料
  • VC MFC列表框(CListBox)控件

    千次阅读 2014-06-23 15:36:54
    VC MFC列表框(CListBox)控件 列表框控件简单应用 重复性的过程我就不详细讲明了,只给出类里面函数的解释。 int CListBox::AddString( LPCTSTR lpszItem );//添加一个项,lpszItem是项文本内容 int ...

    VC MFC列表框(CListBox)控件

    转载地址:http://hi.baidu.com/3582077/item/d8b6cbf577faccd442c36a0a


    列表框控件简单应用

    重复性的过程我就不详细讲明了,只给出类里面函数的解释。

    int CListBox::AddString( LPCTSTR lpszItem );//添加一个项,lpszItem是项文本内容

    int CListBox::InsertString( int nIndex, LPCTSTR lpszItem );//同上,只不过这个可以指定项位置(索引),由参数nIndex指定

    int CListBox::GetCurSel( ) const;//获取当前选中项的索引,函数返回索引值

    int CListBox::GetText( int nIndex,CString &rString ) const;//根据索引获得项文本

    int CListBox::GetCount( ) const;//获取项数量

    void CListBox::ResetContent( );//删除列表框所有的项

    int CListBox::DeleteString( UINT nIndex );//根据项索引从列表框删除一个项

    int CListBox::SetItemHeight( int nIndex, UINT cyItemHeight );//设置一个项的高度,注意:列表框具有

    //LBS_OWNERDRAWVARIABLE风格才可以单独设置一个项的高度,否则是所有项的高度

     自绘列表框

    这里自绘要达到的效果,就是简单模仿一下QQ界面里类似列表框控件的那种效果,先往对话框里添加列表框控件.
    然后再改一下列表框的属性,所有者绘制项选择固定,有字符串前面打上勾.

    接着准备两张位图,一张用于列表框的背景,一张用于项选中时的背景,ID号分别为:IDB_BK、IDB_SELECTED

    如下两张位图:



    再导入五张位图(QQ头像),ID号保持默认不变。

    从CListBox派生出子类CNewListBox,往CNewListBox添加一个函数,用于画位图,函数如下:

    void CNewListBox::DrawBK(CDC *pDC, CRect rect, UINT uIDBK)
    {
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);//兼容DC
    CBitmap bmp;
    bmp.LoadBitmap(uIDBK);//加载位图
    BITMAP bmpInfo;
    bmp.GetBitmap(&bmpInfo);//获取位图信息
    memDC.SelectObject(&bmp);//选入位图
    pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,
        0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
    bmp.DeleteObject();
    memDC.DeleteDC();
    }

    然后给CNewListBox添加WM_ERASEBKGND消息处理函数,这个消息是系统擦除背景时产生。我们就在这个函数里画背景位图,函数代码如下:

    BOOL CNewListBox::OnEraseBkgnd(CDC* pDC)
    {
     // TODO: Add your message handler code here and/or call default
        CRect rect;
     GetClientRect(rect);
        DrawBK(pDC,rect,IDB_BK);
     return TRUE;
     //return CListBox::OnEraseBkgnd(pDC);
    }

    再处理控件左键单击消息,刷新窗口,重绘背景,函数代码如下:

    void CNewListBox::OnLButtonDown(UINT nFlags, CPoint point)
    {
     // TODO: Add your message handler code here and/or call default
     this->Invalidate();
     CListBox::OnLButtonDown(nFlags, point);
    }

    再添加一个函数,用于添加图标和文本内容,函数如下:

    int CNewListBox::AddItem(DWORD bmpID, LPCTSTR lpszItem)
    {
     int Index=AddString(lpszItem);
     SetItemData(Index,bmpID);
     return Index;
    }

    添加DrawItem虚函数,代码如下:

    void CNewListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
     // TODO: Add your code to draw the specified item
     CDC dc;
     dc.Attach(lpDrawItemStruct->hDC);//dc
     CRect rect=lpDrawItemStruct->rcItem;//项区域
     if(lpDrawItemStruct->itemState&ODS_SELECTED)
      DrawBK(&dc,rect,IDB_SELECTED);
     CRect bmpRect(rect.left+2,rect.top+4,35,rect.bottom-4);//位图头像区域
      DrawBK(&dc,bmpRect,lpDrawItemStruct->itemData);
      rect.left+=40;
     CString strText;
     GetText(lpDrawItemStruct->itemID,strText);
     dc.SetBkMode(TRANSPARENT);
     dc.SetTextColor(RGB(0,255,0));//设置字体颜色
     dc.DrawText(strText,rect,DT_VCENTER|DT_LEFT|DT_SINGLELINE);
     dc.Detach();
    }

    给列表框关联变量m_ListBox,类型为CNewListBox,对话框初始化函数添加代码如下:

      m_ListBox.AddItem(IDB_BITMAP1,"人生几何(如果...)");
      m_ListBox.AddItem(IDB_BITMAP2,"天下H(记得那时候...)");
      m_ListBox.AddItem(IDB_BITMAP3,"聆听(小鸟在唱歌...)");
      m_ListBox.AddItem(IDB_BITMAP4,"岁月无声(千杯酒...)");
      m_ListBox.AddItem(IDB_BITMAP5,"大地(在那些....)");
     m_ListBox.SetItemHeight(0,40);//设置高度

    运行效果:


    这里有一个问题,那就单击选项时窗口闪烁的很明显,如果不绘制背景和使用内存DC的话,窗口闪烁可能会小一点

    关于列表框背景位图的问题,可以响应对话框的WM_CTLCOLOR消息,在这个消息处理函数中,判断是否为列表框,如果是那就返回一个位图画刷,如在对话框类添加一个CBrush变量 brush;之后在对话框初始函数里创建位图画刷:

      CBitmap bmp;
     bmp.LoadBitmap(IDB_BK);
      brush.CreatePatternBrush(&bmp);

    WM_CTLCOLOR消息处理函数代码:

    HBRUSH CThirdDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
      HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
     // TODO: Change any attributes of the DC here
     if(nCtlColor==CTLCOLOR_LISTBOX)
     {

     return (HBRUSH)brush.GetSafeHandle();
     }
     else return hbr;
     // TODO: Return a different brush if the default is not desired 
    }

     

    展开全文
  • MFC 列表框使用技巧

    千次阅读 2016-02-05 08:15:23
    因工业项目中用到列表框的次数比较多,在这里总结一下 通过工具箱把列表框控件拖入对话框中,并为其添加控件变量m_listBox,然后看一下列表框的消息内容:  LBN_DBLCLK :用户用鼠标双击了一列表项,只有具有...
  • 显示一个设备列表,可以添加删除设备,修改设备信息。 双击设备时显示设备信息。
  • 如何将mfc中单文本,对话框,列表框控件内的数据导出到txt文本?
  • MFC列表框的初始化

    千次阅读 2013-12-09 10:10:49
    第一步:向界面中添加“列表框控件”,用鼠标拖进来   第二步:设置列表框的属性,在样式中,选择“报告“----默认情况下是图标,这样是不会显示表格的,所以这里需要选择报告形式 第三步:创建列表框...
  • 如题 我想用listctrl实现如 列表里加 下拉框,可以编辑数据,复制数据等。 怎么实现,用别的控件也行,只要能实现,求助
  • MFC列表框实现可编辑功能

    千次阅读 2013-03-13 18:00:00
    列表控件上实现可编辑功能的原理非常简单,借助一个编辑控件即可达到目的。具体步骤如下:①从 CListCtrl派生一个子类,并拦截某个意味着进入编辑状态的消息,获取需要编辑的数据项的相关信息。所拦截的消息通常...
  • MFC可编辑列表框控件

    2016-08-27 19:12:01
    扩展了MFC列表框控件功能,使得列表框控件中的值可以编辑
  • 组合框和列表框 combobox和com demo 基于对话框,后面全是默认设置 一直下一步,完成即可 修改二者的id 所有组合框和列表框都有一个索引,都是从0开始的 列表框控件 自带排序 只要大于-1,就是有当前选中的 .....
  • MFC列表框中自动装载磁盘文件列表演示,源代码加整个工程
  • 用VS2015实现mfc中基本控件列表框的使用,该程序功能可以进行对列表框内容的增加和减少,并进行相应的判断。
  • MFC 下拉列表框的设置

    千次阅读 2019-11-06 10:33:27
    MFCMFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries)以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。包含的类包含大量Windows...
  • 这是我自己写的MFC应用程序,涉及到的技术有CString/string 区别及其转化 MFC列表对话框ListBox的使用 C++文件操作:控制文件读写位置 C++ std::fstream open mode打开文件采用模式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,182
精华内容 8,072
关键字:

mfc列表框