这是一个完整的项目界面
包含了以下控件 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 接第二篇