我做了一个activeX控件,继承了库存font属性,现在在使用的时候想把当前字体改为隶书黑体,该怎么办?

yushulei 2003-10-16 11:44:26
我做了一个activeX控件,继承了库存font属性,现在在使用的时候想把当前字体改为隶书黑体,该怎么办?
想调用SetFont函数,但不知道怎么传参数,看了msdn还是不太明白,可能是英文不太好吧!还有字体大小等等都不知道怎么传进去。
如果建一个CFont对象也不行,用setfont也不行。郁闷!请高手赐教!谢谢。
...全文
114 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yushulei 2003-10-28
  • 打赏
  • 举报
回复
to ayqlj()
谢谢你的帮助,你给我发的欣我才看到,因为公司里上国外网站很慢,经常打不开·
我慢慢研究研究,因为最近忙了起来,可能耽搁一端时间,以后要是不懂还请继续指教,
谢谢。
yushulei 2003-10-24
  • 打赏
  • 举报
回复
setfont是继承控件的库存font属性后自带的。
ayqlj 2003-10-24
  • 打赏
  • 举报
回复
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);
...
};
...
}
warmchang 2003-10-23
  • 打赏
  • 举报
回复
LeeZi(临渊羡鱼,不如退而结网) ( ) 的方法是对的!
ayqlj 2003-10-22
  • 打赏
  • 举报
回复
setfont什么意思,是自己写的函数吗?
还是一个接口?
LeeZi 2003-10-20
  • 打赏
  • 举报
回复
在控件的SetClientSite不要调用GetAmbientFontDisp。
换成:

FONTDESC DefaultFont;
ZeroMemory(&DefaultFont, sizeof(DefaultFont));
DefaultFont.cbSizeofstruct = sizeof(DefaultFont);
DefaultFont.lpstrName = L"隶书";
DefaultFont.cySize.Hi = 0;
DefaultFont.cySize.Lo = 10 * 10000;
OleCreateFontIndirect(&DefaultFont, IID_IFontDisp, reinterpret_cast<void**>(&m_pFont));

yushulei 2003-10-20
  • 打赏
  • 举报
回复
还是不能用setfont啊?
yushulei 2003-10-20
  • 打赏
  • 举报
回复
恕在下笨拙啊!我看不懂,这该用在什么地方呢?
SetClientSite和GetAmbientFontDisp也不知道什么用处。
我现在最重要的问题是不知道怎么使用SetFont,也就是不知道怎么给他
传参数,以改变字体的属性。请继续,谢谢。
ayqlj 2003-10-17
  • 打赏
  • 举报
回复
LPFONT m_pFont;
FONTDESC fd =
{sizeof(FONTDESC), OLESTR("隶书"), FONTSIZE( 10 ),
FW_NORMAL, ANSI_CHARSET, FALSE, FALSE, FALSE };
::OleCreateFontIndirect(&fd, IID_IFont, (void**)&m_pFont);

这样行吧?
yushulei 2003-10-16
  • 打赏
  • 举报
回复
up
wudhu 2003-10-16
  • 打赏
  • 举报
回复
gz

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧