MFC 常用界面总结之一 CListCtrl MFCPropertyGridCtrl




这是一个完整的项目界面  

包含了以下控件  CListCtrl  CSliderCtrl  MFCPropertyGridCtrl Radiobutton CListBox


设计总则:

1 点击RADIOBUTTON 后 MFCPROPERTY 控件会自动刷新为对应的属性页

2 再点击底下LISTBOX对象会在MFCPRO 后面添加 第四属性页面

具体实现方法为:为了避免出现重复点击的无限制叠加增加控件对象层次,在点击后要进行一次REMOVE() 

然后再进行重新的界面生成

3 控件使用的问题无非两点  1 怎么自动生成控件内容 2 怎么响应消息事件获取控件内容


分割线1/******************************************************************************************/

CListCtrl

这是一个很普通的控件


首先在OnInitialDialog()处做一些初始化的工作


m_list.GetClientRect(&rt);
	m_list.InsertColumn(0,_T("控制卡号"),LVCFMT_LEFT, rt.Width()/2);
	m_list.InsertColumn(1,_T("IP地址"),LVCFMT_LEFT, rt.Width()/2);
	m_list.SetColumnWidth(0,300);
	m_list.SetColumnWidth(1,300);
	m_list.ModifyStyle(0L,LVS_REPORT);
	m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES| LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT);

如最上大图所示,该控件用来动态刷新局域网内的控制板列表 因而我把他放在新线程内进行自动刷新,也是在

ONINITIALDIALOG进行开启线程,不用关闭 CreateThread(NULL,0,func1,NULL,0,NULL)


先通过 DeleteAllItem  方法清除掉原先显示的内容,然后再循环写入内容

DWORD WINAPI func1(LPVOID lpParam)
{
	//HWND m_temp=GetDlgItem(,IDC_LIST1);


	while(1)
	{
		DLL_Net_ClearCardInLan(); 

		/*int number=m_dlist->GetItemCount();

		for(int i=0;i<=number;i++)
		{
		m_dlist->DeleteItem(i);
		}*/

		m_dlist->DeleteAllItems();

		int countCol = 0;    //记录从第几行开始的附加位  因为每块网卡对应的板卡数量不定


		int num1 = 0;

		char *LocalIp=new char[20];

		CStringArray *array1=new CStringArray [1000];

		GetCptIpAddress(*array1);

		num1=array1->GetSize();

		for (int j = 0; j < num1; j++)
		{
			int num = 0;



			CString getIP;
			getIP = array1->GetAt(j);

			//strcpy(LocalIp,(LPSTR)(LPCTSTR)getIP);

			LocalIp=trans2c(&getIP);

			num = DLL_Net_GetCardNumberInLan(LocalIp);

			for (int i = 0; i<num; i++)
			{
				char ip[20];
				char id[20];

				//MACRO_IS_ENABLE_QIUT_FUNC(m_CanQuitFlag,return,ienableFlag);

				DLL_Net_GetCardIpFromList(i, ip, id);

				m_dlist->InsertItem(countCol, _T(""));
				m_dlist->SetItemText(countCol, 0, tranc2s(id));
				m_dlist->SetItemText(countCol, 1, tranc2s(ip));

				countCol++;


			}


		}


		::Sleep(10000);   //5秒一次自动刷新
	}



	return 0;
}

下面是CListCtrl的点击获取事件代码


因为例子中控件有2个属性

但是因为在线程中执行,如果不想通过 LPVOID lpParamter 参数向线程函数中带入 CListCtrl的对象,可以通过 在 ONINITIAL DIALOG 中加入

m_dlist=&m_list 获取控件对象指针   PS:m_list为通过VS右键加入的变量


id = trans2c(&m_dlist->GetItemText(col, 0));
ip = trans2c(&m_dlist->GetItemText(col, 1)); 


/**********************************************************************************************************************/

CMFCPropertyGridCtrl 控件


CMFCPropertyGridCtrl 控件使用非常简单 


首先一样可以在 oninitialdialog 内进行初始化界面的工作 


	HDITEM item;
	item.cxy=120;
	item.mask=HDI_WIDTH;
	m_grid.GetHeaderCtrl().SetItem(0,new HDITEM(item));    //固定的初始化 不用管


	//下面初始化了空间   通过 ADDPROPERTY 函数将新增控件加入项目 
	CMFCPropertyGridProperty *pProp1=new CMFCPropertyGridProperty(
		_T("选择6模板之一"),
		_T("选择6模板之一"),
		_T("这应该是下面说明"));                 //增加的第一个属性 3个内容分别为 前面属性名称 属性具体值 以及 点击属性在下方显示的具体说明



	//下面代码增加第二个属性  并且加入了下拉菜单

	CMFCPropertyGridProperty *pProp2=new CMFCPropertyGridProperty(
		_T("选择6模板之一"),
		_T("选择6模板之一"),
		_T("描述页面"));

	pProp2->AddOption(_T("选择6模板之一"));              
	pProp2->AddOption(_T("选择6模板之一"));
	pProp2->AllowEdit(FALSE);  //不允许对选项进行编辑

	//m_grid.AddProperty(pProp1);
	//m_grid.AddProperty(pProp2);    //此处添加的顺序直接决定界面上显示的顺序


	//下面是3个类似的项目  <span style="font-size:18px;"><strong> 注意类名微小的区别  加入了 COLOR!!!</strong></span>

	CMFCPropertyGridColorProperty * pProp3 = new CMFCPropertyGridColorProperty(
		_T("颜色"), RGB(0, 111, 200)); 

	//m_grid.AddProperty(pProp3); 


<span style="white-space:pre">	</span>//<span style="font-weight: bold; font-size: 18px; font-family: Arial, Helvetica, sans-serif;">注意类名微小的区别  加入了 FILE!!!</span><div><span style="font-size: 18px;"><strong>
</strong></span></div>
	CMFCPropertyGridFileProperty * pProp4 = new CMFCPropertyGridFileProperty(
		_T("打开文件"), TRUE, _T("D:\\test.txt")); 

	//m_grid.AddProperty(pProp4); 

	LOGFONT font = {NULL}; 


	//注意类的名字小区别    FONTPROPERTY
	CMFCPropertyGridFontProperty * pProp5 = new CMFCPropertyGridFontProperty( _T("选择字体"), font); 

	//m_grid.AddProperty(pProp5); 


	//下面为分组代码   

	CMFCPropertyGridProperty *group1= new CMFCPropertyGridProperty(_T("分组1"));
	CMFCPropertyGridProperty *group2= new CMFCPropertyGridProperty(_T("分组2"));

	group1->AddSubItem(pProp1);
	group1->AddSubItem(pProp2);

	group2->AddSubItem(pProp3);
	group2->AddSubItem(pProp4);
	group2->AddSubItem(pProp5);



上图为初始化的界面


其实后面点击RADIO BUTTON 后的过程也类似 只不过先加入一行  REMOVE 进行清除


点击 “生成XML” 获取CMFCProperty控件所改变的属性


以我的程序为例,我的控件共有4个属性层次 ,因而先定义4个属性层次对象


CMFCPropertyGridProperty*   m_pro1 = m_grid.GetProperty(0);
	CMFCPropertyGridProperty*   m_pro2 = m_grid.GetProperty(1);
	CMFCPropertyGridProperty*   m_pro3 = m_grid.GetProperty(2);
	CMFCPropertyGridProperty*   m_pro4 = m_grid.GetProperty(3);

然后再定义一个对象用来接收子对象


CMFCPropertyGridProperty*   m_pro ;

然后通过循环接收具体内容


	m_pro=m_pro1->GetSubItem(serial1[i]);   //获取子对象
	program[i]=m_pro->GetValue();


下面  CLISTBOX 和 CSLIDERCTRL  接第二篇


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值