65.9K
CodeProject 正在变化。 阅读更多。
Home

Delphi/VB/VS.NET 风格的对象检查器控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.44/5 (8投票s)

2001年8月5日

1分钟阅读

viewsIcon

95364

downloadIcon

2205

Delphi 风格的对象检查器

Sample Image #1 Sample Image #2

引言

这个控件是 Delphi/VB/VS.NET 风格的对象检查器的实现。我将这个控件用于许多应用程序的属性页中,让用户可以快速更改应用程序设置。我尽量保持代码的简单,虽然初次使用这个控件可能会觉得有点奇怪——控件的接口并不像其他 MFC 控件的接口那样,因为它旨在成为一个专门用于更改属性的控件。

文档比较简略,因为我没有太多时间编写文档。但是,包含的演示应该有助于理解如何使用控件的功能。

特点

该控件支持许多内置属性类型(尽管添加您自己的属性类型应该不是问题)

  • bool
  • short
  • int
  • float
  • double
  • CString
  • CStringList
  • COLORREF
  • COleDateTime

用法

要在您自己的应用程序中使用此控件,请将 CObjectInspector.cpp、CColorButton.cpp 和 CColourPopup.cpp 添加到您的项目文件中。打开资源编辑器并在对话框上放置一个自定义控件。在控件的属性中,将窗口类名输入为“ObjectInspectorCtrl”。将 CObjectInspector 变量添加到您的对话框类

CObjectInspector m_OI;

在您的 DoDataExchange 函数中添加 DDX_Control 处理程序

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
	DDX_Control(pDX, IDC_OI, m_OI);
	//}}AFX_DATA_MAP
}

重写 OnInitDialog 以自定义对象检查器并添加组和属性

BOOL CMyDialog::OnInitDialog()
{
	CDialog::OnInitDialog();

	CObjectInspector::CProperty *pGroup;
	
	// Create new property group
	m_OI.AddProperty (pProp = new CObjectInspector::CProperty("Group"));

	// Add properties to the group
	pProp->AddProperty (new CObjectInspector::CProperty("Integer-Value", &m_nIntValue));
	pProp->AddProperty (new CObjectInspector::CProperty("Bool Value", &m_bBoolVal));
}

重写 OnNotify 以接收来自控件的通知消息

BOOL CMyDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
    if (wParam == IDC_OI)
    {

       CObjectInspector::NM_OIVIEW *nmHdr = (CObjectInspector::NM_OIVIEW*) lParam;

       // OIVN_ITEMCHANGED is sent after the user has changed a property
       if (nmHdr->hdr.code == OIVN_ITEMCHANGED)
       {
           // Do some stuff (use nmHdr->pProperty to access the altered property)
       }

       // OIVN_ITEMCHANGING is sent when the user is currently editing a property
       if (nmHdr->hdr.code == OIVN_ITEMCHANGING)
       {
           // Do some stuff (use nmHdr->pProperty to access the currently edited property)
       }
    }
	
    return CDialog::OnNotify(wParam, lParam, pResult);
}

已知问题

使用光标键进行导航体验不太理想。

致谢

  • 感谢 Chris Maunder 提供他的颜色选择器
  • 感谢 Keith Rule 提供他的内存 DC 类
© . All rights reserved.