ATL向控件添加私有属性-成员变量

时间:2024-07-11 15:07:20

https://msdn.microsoft.com/zh-cn/library/cc451389(v=vs.71).aspx

----------------------------------------------

下面步骤为给控件添加属性的标准步骤。其中如果涉及到COM多线程编程的使用全局变量会造成多线程之间共享全局变量的效果,但是也会出现相应的问题,比如

启动多个页面也就是启动了多个activex控件的时候如果每个控件都在使用一个全局变量作为标识进行判断线程是否继续运行。

如果其中一个页面(也就是activex) 把该全局变量置成了false的话,会影响其他线程运行。

不过使用全局变量也有一定的好处,就是可以防止多开。在activex启动的时候可以判断该全局变量然后决定是否运行另一个;

上面的多线程使用全局变量有影响,解决方案就是使用类的私有变量,也就是给类添加成员变量;

然后添加get方法 注意参数为引用。

====================================================================

步骤 3:向控件添加属性

Visual Studio .NET 2003

IPolyCtl 是包含控件的自定义方法和属性的接口,您将在其中添加属性。

使用“添加属性向导”添加属性

  1. 在“类视图”中右击 IPolyCtl(展开“Polygon”分支找到它)。
  2. 在快捷菜单上单击“添加”,然后单击“添加属性”。

    “添加属性向导”随即出现。

  3. 在属性类型的下拉列表中,选择“short”。
  4. 键入 Sides 作为属性名:

    ATL向控件添加私有属性-成员变量

  5. 单击“完成”完成属性的添加。

将属性添加到接口时,MIDL(编译 .idl 文件的程序)定义检索其值的 Get 方法和设置新值的 Put 方法。这些方法的命名方式是在属性名的前面加上 put_ 和 get_

“添加属性向导”将必需的行添加到 .idl 文件。它还将 Get 和 Put 函数原型添加到 PolyCtl.h 中的类定义,并将一个空实现添加到 PolyCtl.cpp。您可以通过打开 PolyCtl.cpp 并查找函数 get_Sides 和 put_Sides 来进行检查。

虽然现在有了设置和检索属性的主干函数,但需要有地方存储属性。您将创建存储属性的变量,并相应地更新函数。

创建存储属性的变量并更新 put 和 get 方法

  1. 从解决方案资源管理器中,打开 PolyCtl.h 并在类定义末尾的 m_clrFillColor 定义后添加下行:
    short m_nSides;
    
  2. 设置 m_nSides 的默认值。向 PolyCtl.h 中的构造函数添加一行,使默认形状成为三角形:
    CPolyCtl()
    {
    m_nSides = 3;
    }
  3. 实现 Get 和 Put 方法。get_Sides 和 put_Sides 函数声明已经添加到 PolyCtl.h。将以下代码添加到 PolyCtl.cpp 以完成这两个方法:
    STDMETHODIMP CPolyCtl::get_Sides(short *pVal)
    {
    *pVal = m_nSides;
    return S_OK;
    }
    STDMETHODIMP CPolyCtl::put_Sides(short newVal)
    {
    if (newVal > 2 && newVal < 101)
    {
    m_nSides = newVal;
    return S_OK;
    }
    else
    return Error(_T("Shape must have between 3 and 100 sides"));
    }

get_Sides 方法通过 pVal 指针返回 Sides 属性的当前值。在 put_Sides 方法中,代码确保用户将 Sides 属性设置为可接受的值。最小值必须是 2,而且由于对每个边都要使用一系列点,100 是合理的最大值限制。

您现在有了一个名为 Sides 的属性。下一步,您将更改绘图代码以便使用它。