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

修改的选项卡式 ActiveX 控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.25/5 (4投票s)

2010 年 2 月 9 日

CPOL

2分钟阅读

viewsIcon

26976

downloadIcon

939

属性表作为 ActiveX 控件。

TabbedAtxNewVer.JPG

引言

我想告诉你,这不是一篇新文章。但是这是 Muhammad Ahmed 的文章“选项卡式 ActiveX 控件”的修改版本。所以如果你还没有阅读过它,现在就去阅读它,然后再阅读下面的内容。

背景

当我用我自己的测试容器(基于 MFC 的客户端应用程序)而不是 Microsoft 提供的 ActiveX 控件测试容器来测试 Muhammad 的控件时,我得到了这篇文章的这个版本。如果你阅读了他的文章和相关的评论,你会发现一些人(特别是 IrishaSSubash.k)在使用该控件时遇到了奇怪的问题。甚至我在最近尝试时也遇到了同样的问题。然后我开始挖掘论坛,其他网站上相关主题的文章,并付出了一些努力(相信我,至少花了半天的时间来找到一个特定的解决方案),以使我自己的测试容器与该控件一起工作(我将其称为“作为 ActiveX 控件的属性表”)。

Using the Code

  • 我使用了 VS 2005 来设计/更改此处附加的代码。
  • 我还提供了一个基于 FormView 的 SDI 客户端应用程序(我们自己的测试容器)来测试该控件。
  • 你可以自己测试 MDI 客户端应用程序。

对控件所做的主要更改

注意:查看 "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.
}

为了使代码更易于理解而进行的其他更改

  1. 现在,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 做了同样的处理。查看附加的代码以获取完整信息。

  2. 我将代码 UpdateData(TRUE);OnEnChangeEdit1OnEnChangeEdit2 事件处理程序中分别替换为以下行,因为它们没有起到任何作用,目的是仅当用户在任何编辑框中输入值时才启用按钮。

    ((CButton*)(GetDlgItem(IDC_BUTTON1)))->EnableWindow();

    就是这样。

关注点

  • 使用基于对话框的客户端应用程序/测试容器,此控件不起作用,即它仅适用于 SDI/MDI FormView 类型的应用程序。如果有人能使它工作,将不胜感激。
  • Tab 键、箭头键、Ctrl 键等在 ActiveX 控件中不起作用。为此,我尝试按照 Microsoft 此处的描述进行实现。它工作正常,但在测试控件时再次引入了应用程序冻结的问题。所以我放弃了这个想法。我希望有人能抽出时间来检查一下。

历史

  • 2010 年 2 月 9 日:初始发布
© . All rights reserved.