首页编程createfont,vc++ 为什么第二次调用createfontindirect会产生assertion

createfont,vc++ 为什么第二次调用createfontindirect会产生assertion

编程之家2023-11-0770次浏览

大家好,今天小编来为大家解答以下的问题,关于createfont,vc++ 为什么第二次调用createfontindirect会产生assertion这个很多人还不知道,现在让我们一起来看看吧!

createfont,vc++ 为什么第二次调用createfontindirect会产生assertion

vb drawtext怎样设置字体

下面是个例子:

PrivateDeclareFunctionSelectObjectLib"gdi32"(ByValhdcAsLong,ByValhObjectAsLong)AsLong

PrivateDeclareFunctionGetStockObjectLib"gdi32"(ByValnIndexAsLong)AsLong

PrivateDeclareFunctionGetObjectLib"gdi32"Alias"GetObjectA"(ByValhObjectAsLong,ByValnCountAsLong,lpObjectAsLOGFONT)AsLong

PrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLong

PrivateDeclareFunctionCreateFontIndirectLib"gdi32"Alias"CreateFontIndirectA"(lpLogFontAsLOGFONT)AsLong

createfont,vc++ 为什么第二次调用createfontindirect会产生assertion

PrivateDeclareFunctionDrawTextLib"user32"Alias"DrawTextA"(ByValhdcAsLong,ByVallpStrAsString,ByValnCountAsLong,lpRectAsRECT,ByValwFormatAsLong)AsLong

PrivateConstSYSTEM_FONT=13

PrivateConstLF_FACESIZE=32

PrivateTypeLOGFONT

lfHeightAsLong

lfWidthAsLong

createfont,vc++ 为什么第二次调用createfontindirect会产生assertion

lfEscapementAsLong

lfOrientationAsLong

lfWeightAsLong

lfItalicAsByte

lfUnderlineAsByte

lfStrikeOutAsByte

lfCharSetAsByte

lfOutPrecisionAsByte

lfClipPrecisionAsByte

lfQualityAsByte

lfPitchAndFamilyAsByte

lfFaceName(1ToLF_FACESIZE)AsByte

EndType

PrivateTypeRECT

LeftAsLong

TopAsLong

RightAsLong

BottomAsLong

EndType

PrivateSubCommand1_Click()'点击Command1运行

DimofontAsLong,nfontAsLong

DimlfAsLOGFONT,rAsRECT

DimsAsString

ofont=SelectObject(Picture1.hdc,GetStockObject(SYSTEM_FONT))'获取Picture1的当前字体对象

GetObjectofont,Len(lf),lf'从字体对象中获取字体信息

lf.lfHeight=lf.lfHeight*3'字体扩大三倍(你可以自己改其他的)

nfont=CreateFontIndirect(lf)'重新建立字体对象

ofont=SelectObject(Picture1.hdc,nfont)'替换Picture1中的字体对象

s="123你好abc"'要显示的文字

r.Left=0'此四行是设置要显示文字的区域范围(即整个Picture1)

r.Top=0

r.Right=Picture1.ScaleWidth\15

r.Bottom=Picture1.ScaleHeight\15

DrawTextPicture1.hdc,s,-1,r,0'显示文字

nfont=SelectObject(Picture1.hdc,ofont)'把Picture1的字体恢复为原来的

DeleteObjectnfont'删除新建的字体对象

EndSub

vc++ 为什么第二次调用createfontindirect会产生assertion

VC中的任何资源,包括字体、画笔、画刷、DC等,都不可以在同一个变量上二次创建。

如果需要二次创建,必须将前次的创建销毁才可以。

以CFont为例:

CFontf1;

LOGFONTlf={20,20,20,20,20,20};

f1.CreateFontIndirect(&lf);

f1.DeleteObject();//先销毁,不销毁就会二次创建失败

lf.lfWidth=30;

f1.CreateFontIndirect(&lf);

另外注意,字体资源必须在DC之外才可以操作,如果通过SelectObject放入了一个DC中,必须先释放出来再销毁,否则销毁就会失败。

文章分享结束,createfont和vc++ 为什么第二次调用createfontindirect会产生assertion的答案你都知道了吗?欢迎再次光临本站哦!

上海小程序开发 现在上海开发一个小程序怎么收费啊人脸识别java 用java写人脸识别算法有哪些