ActiveX控件的MFC设计之旅-第14步 .

来源:互联网 发布:易特店服装软件 编辑:程序博客网 时间:2024/06/06 02:01
 刚翻CodeGuru,发现一在运行时显示控件属性页的内容
http://www.codeguru.com/cpp/com-tech/activex/controls/article.php/c2649/

试着照它的样子做了下来。

还有上一步的例子tppb

1.添加HRESULT GetPages(CAUUID *pPages)

HRESULT CTppbCtrl::GetPages(CAUUID *pPages)
{
    GUID *pGUID;
    const unsigned CPROPPAGES = 4;

    pPages->cElems = 0;
    pPages->pElems = NULL;

    pGUID = (GUID*) CoTaskMemAlloc( CPROPPAGES * sizeof(GUID) );

    if( NULL == pGUID )
    {
        return ResultFromScode(E_OUTOFMEMORY);
    }

    // Fill the array of property pages now
    pGUID[0] = CTestPropPage::guid;
    pGUID[1] = CLSID_CFontPropPage;
    pGUID[2] = CLSID_CColorPropPage;
    pGUID[3] = CLSID_CPicturePropPage;

    //Fill the structure and return
    pPages->cElems = CPROPPAGES;
    pPages->pElems = pGUID;
    return NOERROR;
}
这是一个普通的成员函数,主要功能是获得显示多少个属性页,有哪些属性页等内容。

2.添加控件的方法 void ShowProperties()

void CTppbCtrl::ShowProperties()
{
    // TODO: Add your dispatch handler code here
    CAUUID    caGUID;
    HRESULT    hr;
    LPDISPATCH pIDispatch = GetIDispatch(TRUE);
    LCID lcid = AmbientLocaleID();

    GetPages(&caGUID);

    hr = OleCreatePropertyFrame(
            m_hWnd,
            10,
            10,
            OLESTR("Do something control"),
            1,
            (IUnknown**) &pIDispatch,
            caGUID.cElems,
            caGUID.pElems,
            lcid,
            0L,
            NULL );
    if( FAILED(hr) )
    {
        AfxMessageBox("无法显示属性页", MB_OK | MB_ICONERROR, 0);
    }

    CoTaskMemFree( (void*) caGUID.pElems );
    return;
}

显示属性页的函数就是OleCreatePropertyFrame,显示哪些属性页,是通过GetPages函数获得的,属性页的信息放在CAUUID caGUID结构中。
OleCreatePropetyFrame函数的原型为
STDAPI OleCreatePropertyFrame(
HWND
hwndOwner, //属性页对话框的父窗口
UINT
x, //相对于父窗口的属性页横向位置
UINT y, //相对于父窗口的属性页纵向位置
LPCOLESTR lpszCaption, //属性页标题
ULONG
cObjects, //属性页中可以设置的控件的数目
LPUNKNOWN FAR*
lplpUnk, //属性页所有可设置的控件数组
ULONG
cPages, //显示的属性页的数目
LPCLSID
lpPageClsID, //属性页的CLSID数组
LCID lcid, //语言标志,不关心的话,可设置为0
DWORD
dwReserved, //Reserved
LPVOID
lpvReserved //Reserved );


在msdn上有介绍,可参考。

3.编译,新建一VB工程,添加tppb控件,添加代码如下:
Private Sub Form_Load()
Tppb1.ShowProperties
End Sub
运行即可发现会弹出来属性页窗口。