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
PrivateDeclareFunctionDrawTextLib"user32"Alias"DrawTextA"(ByValhdcAsLong,ByVallpStrAsString,ByValnCountAsLong,lpRectAsRECT,ByValwFormatAsLong)AsLong
PrivateConstSYSTEM_FONT=13
PrivateConstLF_FACESIZE=32
PrivateTypeLOGFONT
lfHeightAsLong
lfWidthAsLong
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的答案你都知道了吗?欢迎再次光临本站哦!