修改的选项卡式 ActiveX 控件






3.25/5 (4投票s)
属性表作为 ActiveX 控件。

引言
我想告诉你,这不是一篇新文章。但是这是 Muhammad Ahmed 的文章“选项卡式 ActiveX 控件”的修改版本。所以如果你还没有阅读过它,现在就去阅读它,然后再阅读下面的内容。
背景
当我用我自己的测试容器(基于 MFC 的客户端应用程序)而不是 Microsoft 提供的 ActiveX 控件测试容器来测试 Muhammad 的控件时,我得到了这篇文章的这个版本。如果你阅读了他的文章和相关的评论,你会发现一些人(特别是 IrishaS 和 Subash.k)在使用该控件时遇到了奇怪的问题。甚至我在最近尝试时也遇到了同样的问题。然后我开始挖掘论坛,其他网站上相关主题的文章,并付出了一些努力(相信我,至少花了半天的时间来找到一个特定的解决方案),以使我自己的测试容器与该控件一起工作(我将其称为“作为 ActiveX 控件的属性表”)。
Using the Code
- 我使用了 VS 2005 来设计/更改此处附加的代码。
- 我还提供了一个基于
FormView
的 SDI 客户端应用程序(我们自己的测试容器)来测试该控件。 - 你可以自己测试 MDI 客户端应用程序。
对控件所做的主要更改
- 重写了 ActiveX 控件类中的“
PreTranslateMessage
”,如
http://www.codeguru.com/cpp/com-tech/activex/controls/article.php/c2615/ 中所述。
注意:查看 "Tihamer Levendovszky" 撰写的评论 "!! Freezing - Solution for property sheets"。
BOOL CSimpleAdditionAtxCtrl::PreTranslateMessage(MSG* pMsg)
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return TRUE; // notice about returning true instead of calling the parent version.
}
为了使代码更易于理解而进行的其他更改
- 现在,ActiveX 方法
SetFirstNumber
变得如此简单void CSimpleAdditionAtxCtrl::SetFirstNumber(LONG Num1) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_InputPage.SetIPageFirstNum(Num1); }
我在
CInputPage
类中添加了一个方法,如下所示void CInputPage::SetIPageFirstNum(long num) { m_FirstNumber=num; UpdateData(FALSE); }
注意:类似地,我对 ActiveX 方法
SetSecondNumber
做了同样的处理。查看附加的代码以获取完整信息。 - 我将代码
UpdateData(TRUE);
从OnEnChangeEdit1
和OnEnChangeEdit2
事件处理程序中分别替换为以下行,因为它们没有起到任何作用,目的是仅当用户在任何编辑框中输入值时才启用按钮。((CButton*)(GetDlgItem(IDC_BUTTON1)))->EnableWindow();
就是这样。
关注点
- 使用基于对话框的客户端应用程序/测试容器,此控件不起作用,即它仅适用于 SDI/MDI
FormView
类型的应用程序。如果有人能使它工作,将不胜感激。
- Tab 键、箭头键、Ctrl 键等在 ActiveX 控件中不起作用。为此,我尝试按照 Microsoft 此处的描述进行实现。它工作正常,但在测试控件时再次引入了应用程序冻结的问题。所以我放弃了这个想法。我希望有人能抽出时间来检查一下。
历史
- 2010 年 2 月 9 日:初始发布