因为我在子窗口中使用CMFCPropertyGridCtrl,属性中notify设为true,否则点击控件无响应
2.创建代码可以如下:
CRect r;
m_mfcPropertyGridCtrl.GetHeaderCtrl().GetClientRect(&r);
HDITEM a;
a.cxy = r.Width()/3;
a.mask = HDI_WIDTH;
m_mfcPropertyGridCtrl.GetHeaderCtrl().SetItem(0,&a);
a.pszText = "属性";
a.mask = HDI_TEXT;
m_mfcPropertyGridCtrl.GetHeaderCtrl().SetItem(0,&a);//表头控件设置,一次设置一个属性
CMFCPropertyGridProperty * group;
CMFCPropertyGridProperty * pProp;
group = new CMFCPropertyGridProperty(_T("位置"));
pProp = new CMFCPropertyGridProperty(_T("X"),(_variant_t)(GLfloat)0.0,_T(""));//一定要注意类型,一定要精确
pProp->SetData(POS_X);//此处的值不能为0,重要!!!!
group->AddSubItem(pProp);
pProp = new CMFCPropertyGridProperty(_T("Y"),(_variant_t)(GLfloat)0.0,_T(""));
pProp->SetData(POS_Y);
group->AddSubItem(pProp);
pProp = new CMFCPropertyGridProperty(_T("Z"),(_variant_t)(GLfloat)0.0,_T(""));
pProp->SetData(POS_Z);
group->AddSubItem(pProp);
group->SetData(POS);
m_mfcPropertyGridCtrl.AddProperty(group);
group = new CMFCPropertyGridProperty(_T("方向"));
pProp = new CMFCPropertyGridProperty(_T("X"),(_variant_t)(GLfloat)0.0,_T(""));
pProp->SetData(DIR_X);
group->AddSubItem(pProp);
pProp = new CMFCPropertyGridProperty(_T("Y"),(_variant_t)(GLfloat)0.0,_T(""));
pProp->SetData(DIR_Y);
group->AddSubItem(pProp);
pProp = new CMFCPropertyGridProperty(_T("Z"),(_variant_t)(GLfloat)0.0,_T(""));
pProp->SetData(DIR_Z);
group->AddSubItem(pProp);
group->SetData(DIR);
m_mfcPropertyGridCtrl.AddProperty(group);
CMFCPropertyGridColorProperty* pColorProp;
pColorProp = new CMFCPropertyGridColorProperty(_T("散射光"), RGB(255, 255, 255));
pColorProp->EnableOtherButton(_T("其他..."));
pColorProp->EnableAutomaticButton(_T("默认"), ::GetSysColor(COLOR_3DFACE));
pColorProp->SetData(DIFFUSE);
m_mfcPropertyGridCtrl.AddProperty(pColorProp);
pColorProp = new CMFCPropertyGridColorProperty(_T("反射光"), RGB(255, 255, 255));
pColorProp->EnableOtherButton(_T("其他..."));
pColorProp->EnableAutomaticButton(_T("默认"), ::GetSysColor(COLOR_3DFACE));
pColorProp->SetData(SPECULAR);
m_mfcPropertyGridCtrl.AddProperty(pColorProp);
pColorProp = new CMFCPropertyGridColorProperty(_T("环境光"), RGB(0, 0, 0));
pColorProp->EnableOtherButton(_T("其他..."));
pColorProp->EnableAutomaticButton(_T("默认"), ::GetSysColor(COLOR_3DFACE));
pColorProp->SetData(AMBIENT);
m_mfcPropertyGridCtrl.AddProperty(pColorProp);
pColorProp = new CMFCPropertyGridColorProperty(_T("全局环境光"), RGB(1, 1, 1));
pColorProp->EnableOtherButton(_T("其他..."));
pColorProp->EnableAutomaticButton(_T("默认"), ::GetSysColor(COLOR_3DFACE));
pColorProp->SetData(AMBIENTGLOBAL);
m_mfcPropertyGridCtrl.AddProperty(pColorProp);
group = new CMFCPropertyGridProperty(_T("衰减"));
pProp = new CMFCPropertyGridProperty(_T("常数系数"),(_variant_t)(GLfloat)1,_T(""));
pProp->SetData(CONSTANT_ATTENUATION);
group->AddSubItem(pProp);
pProp = new CMFCPropertyGridProperty(_T("一次项系数"),(_variant_t)(GLfloat)0,_T(""));
pProp->SetData(LINEAR_ATTENUATION);
group->AddSubItem(pProp);
pProp = new CMFCPropertyGridProperty(_T("二次项系数"),(_variant_t)(GLfloat)0,_T(""));
pProp->SetData(QUADRATIC_ATTENUATION);
group->AddSubItem(pProp);
m_mfcPropertyGridCtrl.AddProperty(group);
group = new CMFCPropertyGridProperty(_T("聚光灯选项"));
pProp = new CMFCPropertyGridProperty(_T("聚光指数"),(_variant_t)(GLfloat)0.0,_T(""));
pProp->SetData(EXPONENT);
group->AddSubItem(pProp);
pProp = new CMFCPropertyGridProperty(_T("角度"),(_variant_t)(GLfloat)180,_T(""));
pProp->SetData(CUTOFF);
group->AddSubItem(pProp);
m_mfcPropertyGridCtrl.AddProperty(group);
pGroup = new CMFCPropertyGridProperty("VertexShader");
static const TCHAR szFilter[] = _T("Vertex Shader脚本文件(*.vert)|*.vert|所有文件(*.*)|*.*||");
pProp = new CMFCPropertyGridFileProperty(_T("路径"), TRUE, "", _T("vert"), 0, szFilter, _T("指定VertexShader脚本文件"));
pProp->SetData(VERTEXSHADER);
pGroup->AddSubItem(pProp);
m_mfcPropertyGridCtrl.AddProperty(pGroup);
//我生成的SDI程序的APP类默认是从CWinApp继承,而且生成的时候是无法改变的。但是想要选择文件夹的功能能够生效,就必须从CWinAppEx继承,并且在适当的地方调用InitShellManager();
// pProp = new CMFCPropertyGridFileProperty(_T("文件夹"), _T("c:\\"));
// pGroup->AddSubItem(pProp);
3.定义更改消息
ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged) //使用这一句必须使用新版MFC,或者包含#include <afxcontrolbars.h>
LRESULT MeshPropertyLightSet::OnPropertyChanged (WPARAM,LPARAM lParam)
{
CMFCPropertyGridProperty* pProp = (CMFCPropertyGridProperty*) lParam;
int DataID = (int) pProp->GetData ();
CString strName = pProp->GetName(); //被改变的参数名
COleVariant Value = pProp->GetValue(); //改变之后的值
COleVariant OldValue = pProp->GetOriginalValue(); //改变之前的值
int lightid = GetSelectLight();
if (lightid <0||lightid>=m_pModelView->m_glscene.m_Lights.size())
{
return 0;
}
GLLight & light = m_pModelView->m_glscene.m_Lights[lightid];
SHORT ll;
COLORREF color;
switch(DataID)
{
case POS_X:
light.Position[0] = Value.fltVal;
break;
case POS_Y:
light.Position[1] = Value.fltVal;
break;
case POS_Z:
light.Position[2] = Value.fltVal;
break;
case DIR_X:
light.Direction[0] = Value.fltVal;
break;
case DIR_Y:
light.Direction[1] = Value.fltVal;
break;
case DIR_Z:
light.Direction[2] = Value.fltVal;
break;
case DIFFUSE:
color = ((CMFCPropertyGridColorProperty*)pProp)->GetColor();
light.Diffuse[0] = GetRValue(color)/255.0;
light.Diffuse[1] = GetGValue(color)/255.0;
light.Diffuse[2] = GetBValue(color)/255.0;
break;
case SPECULAR:
color = ((CMFCPropertyGridColorProperty*)pProp)->GetColor();
light.Specular[0] = GetRValue(color)/255.0;
light.Specular[1] = GetGValue(color)/255.0;
light.Specular[2] = GetBValue(color)/255.0;
break;
case AMBIENT:
color = ((CMFCPropertyGridColorProperty*)pProp)->GetColor();
light.Ambient[0] = GetRValue(color)/255.0;
light.Ambient[1] = GetGValue(color)/255.0;
light.Ambient[2] = GetBValue(color)/255.0;
break;
case AMBIENTGLOBAL:
color = ((CMFCPropertyGridColorProperty*)pProp)->GetColor();
light.AmbientGlobal[0] = GetRValue(color)/255.0;
light.AmbientGlobal[1] = GetGValue(color)/255.0;
light.AmbientGlobal[2] = GetBValue(color)/255.0;
break;
case CONSTANT_ATTENUATION:
light.Constant_Attenuation = Value.fltVal;
break;
case LINEAR_ATTENUATION:
light.Linear_Attenuation = Value.fltVal;
break;
case QUADRATIC_ATTENUATION:
light.Quadratic_Attenuation = Value.fltVal;
break;
case EXPONENT:
light.Exponent = Value.fltVal;
break;
case CUTOFF:
light.Cutoff = Value.fltVal;
break;
default:
break;
}
return 0;
}
4.获取数据
CMFCPropertyGridProperty* p;
//p = m_mfcPropertyGridCtrl.GetProperty(0);//是第几个属性
//p->GetSubItem(1);//第几个属性
m_mfcPropertyGridCtrl.FindItemByData(POS);//根据数据调用
m_mfcPropertyGridCtrl.FindItemByData(POS_X)->SetValue((_variant_t)light.Position[0]);
m_mfcPropertyGridCtrl.FindItemByData(POS_Y)->SetValue((_variant_t)light.Position[1]);
m_mfcPropertyGridCtrl.FindItemByData(POS_Z)->SetValue((_variant_t)light.Position[2]);
m_mfcPropertyGridCtrl.FindItemByData(DIR);
m_mfcPropertyGridCtrl.FindItemByData(DIR_X)->SetValue((_variant_t)light.Direction[0]);
m_mfcPropertyGridCtrl.FindItemByData(DIR_Y)->SetValue((_variant_t)light.Direction[1]);
m_mfcPropertyGridCtrl.FindItemByData(DIR_Z)->SetValue((_variant_t)light.Direction[2]);
COLORREF color;
color = RGB(light.Diffuse[0]*255,light.Diffuse[1]*255,light.Diffuse[2]*255);
((CMFCPropertyGridColorProperty*)m_mfcPropertyGridCtrl.FindItemByData(DIFFUSE))->SetColor(color);
color = RGB(light.Specular[0]*255,light.Specular[1]*255,light.Specular[2]*255);
((CMFCPropertyGridColorProperty*)m_mfcPropertyGridCtrl.FindItemByData(SPECULAR))->SetColor(color);
color = RGB(light.Ambient[0]*255,light.Ambient[1]*255,light.Ambient[2]*255);
((CMFCPropertyGridColorProperty*)m_mfcPropertyGridCtrl.FindItemByData(AMBIENT))->SetColor(color);
color = RGB(light.AmbientGlobal[0]*255,light.AmbientGlobal[1]*255,light.AmbientGlobal[2]*255);
((CMFCPropertyGridColorProperty*)m_mfcPropertyGridCtrl.FindItemByData(AMBIENTGLOBAL))->SetColor(color);
m_mfcPropertyGridCtrl.FindItemByData(CONSTANT_ATTENUATION)->SetValue((_variant_t)light.Constant_Attenuation);
m_mfcPropertyGridCtrl.FindItemByData(LINEAR_ATTENUATION)->SetValue((_variant_t)light.Linear_Attenuation);
m_mfcPropertyGridCtrl.FindItemByData(QUADRATIC_ATTENUATION)->SetValue((_variant_t)light.Quadratic_Attenuation);
m_mfcPropertyGridCtrl.FindItemByData(EXPONENT)->SetValue((_variant_t)light.Exponent);
m_mfcPropertyGridCtrl.FindItemByData(CUTOFF)->SetValue((_variant_t)light.Cutoff);