API绘图的基础问题

fj218 2004-09-15 09:48:06
var
oldpen,Pen:Hpen;
....

pen:=createpen(ps_solid,0,0);
oldpen:=selectobject(dc,pen);
movetoex(dc,0,0,nil);
lineto(dc,10,10);
selectobject(dc,oldpen);
delectobject(dc,pen);

pen:=ceatepen(ps_solid,1,$00FFFFFF);
oldpen:=slectobject(dc,pen);
movetoex(dc,10,10,nil);
lineto(dc,20,20);
selectobject(dc,oldpen);
deleteobject(dc,pen);

能不能写成
var
Pen:Hpen;
....

pen:=createpen(ps_solid,0,0);
selectobject(dc,pen);
movetoex(dc,0,0,nil);
lineto(dc,10,10);
delectobject(dc,pen);

pen:=ceatepen(ps_solid,1,$00FFFFFF);
slectobject(dc,pen);
movetoex(dc,10,10,nil);
lineto(dc,20,20);
deleteobject(dc,pen);


...全文
110 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
graycarl 2004-09-16
  • 打赏
  • 举报
回复
如果系统能自行提供一个默认画笔,那么也许不会发生泄漏……只是也许,难道你愿意自己的程序存在那么多“也许”吗?

不论如何 即使系统做了所有事情,
还是有造成程序出错的可能性
打个比方:
某个控件需要在一个Panel上绘画许多"Button"
它设定了一个Brush,然后在一个循环中一次填充每个Button区域的背景,
而当填充完一个Button区域的时候就调用一个OnDrawButtonFace的事件
这样你在这个事件中绘画的时候如果选择了一个新的Brush,并且最后没有恢复原先的Brush的话……后续的Button填充显然就会出现不是期望的结果

我想这既然是作为一种既成的习惯,为什么不去遵守它呢?
fj218 2004-09-15
  • 打赏
  • 举报
回复
我的理解是
create的GDI对象必须一对一的进行deleteobject
selectobject出(进)的对象不一定要selectobject进(出)
就比如第二种写法没有选回原先的画笔,只是影响绘画结果,并不发生泄漏和程序错误。
甚至
pen:=createpen(ps_solid,0,0);
selectobject(dc,pen);
movetoex(dc,0,0,nil);
lineto(dc,10,10);
delectobject(dc,pen); //------->A

//pen:=ceatepen(ps_solid,1,$00FFFFFF);
//slectobject(dc,pen);
movetoex(dc,10,10,nil);
lineto(dc,20,20);
//deleteobject(dc,pen);
把这三句去掉,程序也能正常执行且不发生泄漏。也就是说A处删除画笔后,即使没有将原先画笔恢复,系统也能自行再提供一个默认画笔。
不知我的理解对否?

graycarl 2004-09-15
  • 打赏
  • 举报
回复
你必须选回原先的画笔,
否则在下一次绘图的时候可能会出错
不论怎样,你何必要节省这么几个字符呢?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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