我有CMFCPropertyGrid
控件,我添加了一个Combobox属性与CMFCPropertyGridProperty::AddOption()
:
foreach(auto i, list)
{
str.Format(_T("<%s> %s"), i.first, i.second);
pProp->AddOption(str);
}
现在我需要做一些代码,当用户在这个CMFCPropertyGrid
下拉列表。
我会使用CBN_DROPDOWN
,如果它是一个对话框窗口中的组合框控件(它有ID)。但是在CMFCPropertyGrid
的情况下我怎么做呢?
对于combobox样式的CMFCPropertyGridProperty
,当用户单击控件右上角附近的向下箭头按钮(这会导致下拉列表出现)时,框架调用OnClickButton
成员。
因此,为您的控件创建一个类(从CMFCPropertyGridProperty
派生)并覆盖OnClickButton
成员以添加您想要运行的代码。下面是你可以做的事情的大纲:
class MyComboControl : public CMFCPropertyGridProperty
{
public:
// Constructor: add some options ...
MyComboControl(void) : CMFCPropertyGridProperty(L"Choice:", _variant_t(L""), L"Description Text") {
AllowEdit(FALSE);
for (int i = 0; i < 3; ++i) {
CString text;
text.Format(L"Option #%d", i);
AddOption(text.GetString());
if (i == 0) SetValue(text.GetString());
}
}
// Override to handle the dropdown activation ...
void OnClickButton(CPoint pt) override {
//... Add any pre-drop code here.
CMFCPropertyGridProperty::OnClickButton(pt); // Call base class
//... Add any post-drop code here
}
};
MFC将通过AFX_WM_PROPERTY_CHANGED
通知父窗口属性更改
发送给属性网格的所有者控件(
CMFCPropertyGridCtrl
)的值选择的属性。
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged)
END_MESSAGE_MAP()
afx_msg LRESULT CMyDialog::OnPropertyChanged(WPARAM wparam, LPARAM lparam)
{
if (!lparam)
return 0;
auto prop = reinterpret_cast<CMFCPropertyGridProperty*>(lparam);
if (prop != m_pProp)
{
auto str_variant = prop->GetValue();
CString str;
if(str_variant.vt == VT_BSTR)
str = CString(str_variant.bstrVal);
}
return 0;
}
如果你有多个网格控件控件,你想要声明pProp
作为一个类成员m_pProp
,这样它的值可以被测试。