hur.cn - 华软网

 热门搜索

MFC中,怎样拦下所有的窗口绘制的操作?

  作者:未知    来源:网络    更新时间:2010/12/5
我开启一个Dialog,在OnInitDiag和OnPaint,OnCreate等函数中调用DC的SelectObject函数把自己的Bitmap选入,但每次获得的前往值都是0,正常不是应该获得设备位图的指针的吗?
我现在想,SelectObject之后如果不把设备位图设置回去,那么所有的窗口绘制会不会都绘制到我自己的Bitmap上。
试过很多地方,很多函数,GetDC,GetWindowDC都试过了。照旧失利,SelectObject前往值总是0,窗口照旧自己画了出来。窗口上的控件一个也没拦住。
---华软 网友回答---
给点代码看看
---华软网友回复---
BOOL CSettings::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
TRACE("OnEraseBkgnd\n");
int nCount = pDC->GetDeviceCaps(BITSPIXEL);
CBitmap bitmap,*pOldbitmap = NULL;
bitmap.CreateBitmap(500,800,1,nCount,NULL);
pOldbitmap = pDC->SelectObject(&bitmap);

return CDialog::OnEraseBkgnd(pDC);
}

比如在这个函数里,从pDC里能够取到设备位图吗?
---华软网友回复---
Bitmaps can be selected for memory device contexts only
0表示毛病
---华软网友回复---
你只需不调用基类的OnPaint,就什么也画不出来了.
如果是想截获这类消息,能够重写PreTranslteMessage函数,在这里拦截掉OnPaint消息,自己措置惩罚.
---华软网友回复---
引用 3 楼 schlafenhamster 的回复:
Bitmaps can be selected for memory device contexts only
0表示毛病


pOldbitmap = pDC->SelectObject(&bitmap);
我的代码的用法那里有毛病吗?
我现在不是要禁止绘制,而是要所有的绘制都绘制到我自己的Bitmap上。
---华软网友回复---
Bitmaps can be selected for memory device contexts only
只有内存DC能够用来选择位图
---华软网友回复---
楼主怎么能够用屏幕的DC直接Selectobject呢,必需自己建立一个内存的CDC再去selectobject。
---华软网友回复---
jf,结果已经很明显了
---华软网友回复---
我的本意是暂时替换屏幕DC的设备位图,这样的话,在这个窗口里所有的绘制都不经设置画到我自己的位图,当所有的控件绘制完成后,我再把设备位图替换回来。
MemDC,我只可把我能够控制的OnPaint函数画到MemDC上,其余的控件怎么办?
---华软网友回复---
需要自己开启一个DC的

用完了之后记得重新选择回原本的dc
---华软网友回复---
好像有个PrintWindow函数能够把控件也绘制到自己的DC上,如果楼主需要这个效果,能够试试这个函数
---华软网友回复---
你是否是想给这个窗口做个截图的功能啊?
创建一个bitmap选到memdc里,然后把dc的东西复制到memdc里,这样dc里的东西就全数到bitmap里了
---华软网友回复---
你要是不想让窗口画出来就直接隐藏窗口,或把不需要显示的控件隐藏起来
---华软网友回复---
HOOK后,然后子类化
---华软网友回复---
我说的拦下所有的绘图举措,主要是想自己管理图像,但又需要MFC帮我把所有的控件都画好,在我以为需要显示之前,不要画到屏幕上。

比如,dialog在画在内存DC上,然后我就能够操作这个设备位图,我能够让这个dialog在期待一小会之后,以各种动画效果出现。此时,我只需要操作这个位图就好了,这个被MFC把所有的背景,控件都绘制完成的位图。在这之前,屏幕上不应该出现这个新的对话框。
---华软网友回复---
其实个人以为稍微显示一下你的原来窗口,然后马上拷贝屏幕,获得窗口图片,接着隐藏窗口,举行你的动画不就好了
当然如果你一定不能要原来窗口出现的话,能够用PrintWindow
用PrintWindow能够把屏幕外或被其余窗口笼罩的整个窗口(包括子控件)绘制到DC上
你能够将你的窗口移到屏幕外,获得窗口图片,然后操作图片,当需要时,再移动回来。


---华软网友回复---
对于单个控件能够:
控件.SendMessage(WM_PAINT,(WPARAM)memdc.m_hDC,0);
---华软网友回复---
看来MFC照旧有些落后而封闭的。昨天编译了QT的SDK的代码,简单看了一下好像能替换MFC的样子。虽有全套源代码,但气概异样,需要一些时间掌握。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。