ATL问题集-#13 ~ #14

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

/*此文是我将网上的一些文章,自已遇到的问题进行整理,有些是翻译,所有只供学习讨论,如有版权还属于原作者——作者:黄森堂*/

#13 如何使我的控件对IE来说是安全的?

要使控件对IE来说是安全的话,则必需实现IObjectSafety接口,ATL提供了IObjectSafetyImpl包装类,以下代码是演示这个功能,加精是新增加的:

class ATL_NO_VTABLE CNoteCtl :

public CComObjectRootEx<CComSingleThreadModel>,

...

// Derive from IObjectSafety

public IObjectSafety

{

...

BEGIN_COM_MAP(CNoteCtl)

COM_INTERFACE_ENTRY(INoteCtl)

COM_INTERFACE_ENTRY(IDispatch)

...

// Add it to our interface map

COM_INTERFACE_ENTRY(IObjectSafety)

END_COM_MAP()

...

// IObjectSafety implementation

STDMETHODIMP GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions )

{

ATLTRACE(_T("CNoteCtl::GetInterfaceSafetyOptions()\n"));

*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER |

INTERFACESAFE_FOR_UNTRUSTED_DATA;

*pdwEnabledOptions = *pdwSupportedOptions;

return S_OK;

}

STDMETHODIMP SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)

{

ATLTRACE(_T("CNoteCtl::SetInterfaceSafetyOptions\n"));

return S_OK;

}

...

};

#14 如何在控件中使用字体?

在ATL 2.x开始支持内置字体属性,首先,处理这个属性不像MFC那么简单;第二,你需要在你的控件的IDL文件中加入字体属性的声明(其实在VC6的ATL向导中支持这些属性了,你在向导中选上的话,向导自动会在idl文件中加入相关声明)

ATL并没有完全实现内置字体属性,它提供了内部成员变量指向IFontDisp接口,可是你仍然需要进行OLE字体的初始化,以下代码是演示:

在你的控件类的构造函数中加入以下代码:

CMyCtl()

{

static FONTDESC _fontDesc =

{ sizeof(FONTDESC), OLESTR("MS Sans Serif"),

FONTSIZE( 12 ), FW_BOLD,

ANSI_CHARSET, FALSE, FALSE, FALSE };

OleCreateFontIndirect( &_fontDesc,IID_IFontDisp,(void **)&m_pFont );

}

在你需要使用的地方使用以下代码,一般是在控件的OnDraw方法中,如下:

//取得字体

CComQIPtr<IFont, &IID_IFont> pFont( m_pFont );

if ( pFont )

{

HFONT hOldFont = 0;

HFONT hFont;

pFont->get_hFont( &hFont );

hOldFont = (HFONT) SelectObject( hdc, hFont );

// 使用它...

if ( hOldFont )

SelectObject( hdc, hOldFont );

}

一般在VC6的ATL向导中选择了Font字体属性的话,向导会在IDL文件中自动产生以下代码,没有的话手工加入以下声明(加粗部分):

#include <olectl.h>

import "oaidl.idl";

[

uuid(E63A22F1-9BD3-11D0-A6D7-0000837E3100),

version(1.0),

helpstring("NoteIt 1.0 Type Library")

]

library NOTEITLib

{

importlib("stdole32.tlb");

importlib("stdole2.tlb");

// Interface is now inside the library block

[

object,

uuid(E63A2306-9BD3-11D0-A6D7-0000837E3100),

dual,

helpstring("INoteCtl Interface"),

pointer_default(unique)

]

interface INoteCtl : IDispatch

{

...

[propputref, id(DISPID_FONT)]

HRESULT Font([in]IFontDisp* pFont);

[propput, id(DISPID_FONT)]

HRESULT Font([in]IFontDisp* pFont);

[propget, id(DISPID_FONT)]

HRESULT Font([out, retval]IFontDisp** ppFont);

...

};

...

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航