分类: C/C++
2010-07-14 10:16:44
刚翻CodeGuru,发现一在运行时显示控件属性页的内容
试着照它的样子做了下来。
还有上一步的例子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
运行即可发现会弹出来属性页窗口。