您的位置:程序门 -> vc/mfc -> 界面



关于绘制的问题.大家帮帮忙.分一定是给.


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于绘制的问题.大家帮帮忙.分一定是给.[已结贴,结贴人:janlex]
发表于:2007-10-12 14:03:51 楼主
mydlg类数据成员:
cwindowdc   *windowdc;
cdc   memdc;


void   mydlg::oninitdialog()
{
      //.......
      windowdc   =   new   cwindowdc(null);
      memdc.createcompatible(windowdc);
      cbitmap   membitmap;
      membitmap.createcompatiblebitmap(windowdc,   1024,   768);       //@1
      memdc.selectobject(&membitmap);                                                     //@2
      memdc.bitblt(0,   0,   1024,   768,   windowdc,   0,   0,   srccopy);
}

void   mydlg::ontimer(uint   nidevent)
{
      cdc   tempdc;
      tempdc.createcompatible(windowdc);
      cbitmap   bit;
      bit.createcompatiblebitmap(windowdc,   1024,   768);
      tempdc.selectobject(&bit);
      tempdc.bitblt(0,   0,   1024,   768,   &memdc,   0,   0,   srccopy);
      //.......
      //..在tempdc设备上绘图
      //.......
      windowdc-> bitblt(0,   0,   1024,   768,   &memdc,   0,   0,   srccopy);
}


上面的大家都能看懂,   在oninitdialog()初始化时,   创建了一个memdc保存了桌面的截图,   然后在定时器中在桌面截图上绘制

我有两上问题:

1>   去掉@1   @2两行为什么就绘制时背景是黑色的呢?     难道默认创建的dc没有画布(cbitmap对象),必须自己创建?

2>   oninitdialog函数中membitmap;是临时变量,被选进memdc后会马上因为oninitdialog函数的结束而结束生命期.  
而最后在tempdc把memdc的membitmap通过bitblt复制过来时却是正常的.   为什么?
发表于:2007-10-12 14:08:491楼 得分:0
1、默认的背景就是黑的
2、membitmap里的东西已经拷贝到memdc里去了
发表于:2007-10-12 14:32:492楼 得分:0
问题一感觉不像楼上所说.

如果是黑色,   那memdc.bitblt(0,   0,   1024,   768,   windowdc,   0,   0,   srccopy);   已经将windowdc背景拷贝过去了.怎么还是黑色.       不用@1   @2是不行的.   为什么...

发表于:2007-10-12 15:13:523楼 得分:0
没人帮助吗?
发表于:2007-10-12 15:51:294楼 得分:0
再顶
发表于:2007-10-12 16:28:585楼 得分:0
push
发表于:2007-10-12 17:18:436楼 得分:0
发表于:2007-10-12 17:51:417楼 得分:0
hdc   代表了一个大的数据结构,其中包括了当前字体,字体颜色,图像等
selectbitmap不会进行数据复制
没有selectbitmap就进行bitblt,出现黑色涉及到windows底层实现了吧,
也许windows默认是如果当前选择的图像句柄无效就使用黑色画刷来填充也说不定

bitmap处于被某个dc选中的状态时,deleteobject无法删除   其实已经造成了gdi   资源泄露
发表于:2007-10-12 18:30:358楼 得分:0
问题一:   如创建内存兼容位图并选入memdc,   默认的memdc中只有一个单色单像素位图
发表于:2007-10-12 18:31:099楼 得分:20
如未创建内存兼容位图并选入memdc,   默认的memdc中只有一个单色单像素位图
发表于:2007-10-12 21:38:2110楼 得分:0
如问题一像楼上所说.那问题二呢?

2   >   oninitdialog函数中membitmap;是临时变量,被选进memdc后会马上因为oninitdialog函数的结束而结束生命期.    
而最后在tempdc把memdc的membitmap通过bitblt复制过来时却是正常的.   为什么?
发表于:2007-10-13 00:02:0711楼 得分:0
发表于:2007-10-13 02:10:2712楼 得分:0
你的memdc应该是个成员变量吧,窗口销毁时memdc才会被清除。
发表于:2007-10-13 09:13:1913楼 得分:0
memdc是dc的一个内存副本,它保存有membitmap的数据拷贝,而不只是一个索引
发表于:2007-10-13 13:34:3814楼 得分:0
memdc.selectobject(&membitmap);

这里memdc选择对象函数是引用,   会改变对象membitmap的数据的.   所以从这点上面看不应该是数据拷贝.
发表于:2007-10-13 19:51:3115楼 得分:0
selectobject()难道选进的对象都是拷贝???,   那为什么还要用引用呢?


快速检索

最新资讯
热门点击