请问一下,通过BitBlt复制位图到窗体DC,为什么要在au
vb吧
全部回复
仅看楼主
level 11
余思培
楼主
请问一下,通过BitBlt复制位图到窗体DC,为什么要在autoredraw=true的前提下,我尝试在autoredraw=false的情况下复制位图到窗体DC,并尝试使用refresh刷新但无法显示成功。
请问一下稍微深一点的原因是什么?或者有什么方法可以在autoredraw=false的情况下显示出来。
2020年09月22日 15点09分
1
level 13
隨風🍁缒夢
autoredraw=false时不需要用refresh刷新(但显示的图像一旦被其他窗体遮挡什么的就会擦除),autoredraw=true相当于开启了双缓冲,需要用refresh刷新,一旦显示后被其他窗体遮挡都不会擦除
2020年09月23日 00点09分
2
level 13
隨風🍁缒夢
autoredraw=false时可以在paint事件中重绘图像,被其他窗体遮挡时会执行该事件,而autoredraw=true时paint事件不会被执行了。autoredraw=false时paint重绘图像效果不好,窗体遮挡擦除重绘时被有部分背景颜色会显示一下,有闪烁感,没autoredraw=true效果好。还有就是autoredraw=false时子类化拦截WM_PAINT消息进行绘制就可以了,必要时还可以在WM_ERASEBKGND擦除时不重绘背景
2020年09月23日 01点09分
4
余思培
多谢大佬,虽然看了之后还是只会autoredraw=true,但是至少有学习方向了(虽然感觉子类化对我可能有些困难)
2020年09月23日 02点09分
隨風🍁缒夢
@余思培
Windows系统有消息机制,你鼠标按下、抬起、滚轮,窗体拖动等等都是消息控制的,只会VB的事件是不够的,VB的事件限制了你了解Windows消息,但是实质就是不断发送和接收系统消息,其实了解了就会发现很简单且强大,像VB不支持鼠标滚轮,而子类化只要处理WM_MOUSEWHEEL消息就轻松解决了
2020年09月23日 03点09分
level 13
隨風🍁缒夢
当autoredraw=true时hDC是内存DC(或者可以叫后备缓存区)是看不到的,绘制的图像需要refresh刷新才能显示正常,对于vb的print、PaintPicture方法是直接显示的,估计VB设计时内置的方法当autoredraw=true调用会自动刷新,而BitBlt等函数不会,需要借助Refresh方法。autoredraw=true可以理解为VB内部建了一个内存DC,拦截了WM_PAINT并接管了,当擦除时会自动重绘内存DC的图像到前台,所以图像不会被擦除,而Paint事件无效了
2020年09月23日 01点09分
5
level 13
隨風🍁缒夢
如果有能力的情况下,是可以完全忽略autoredraw属性和refresh方法的,连VB print、PaintPicture也都可以完全忽略。我09年做的程序基本都是用CreateCompatibleDC创建内存DC,然后BitBlt等函数绘制所有图像、TextOut等函数绘制文本,然后一次性用BitBlt提交到前台显示
2020年09月23日 01点09分
6
自控不能患者♬
BitBlt GetDC(Picture2.hwnd), 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture2.hdc, 0, 0, vbSrcCopy 'Picture2.Refresh 请问楼主为什么 bitblt可以代替refresh,getdc(hwnd)是前台dc吗
2022年03月14日 10点03分
隨風🍁缒夢
@自控不能患者♬
Picture2 Autoredraw=False时,GetDC(Picture2.hwnd)和Picture2.hDC是一样的,Autoredraw=True时,GetDC(Picture2.hwnd)和Picture2.hdc是不一样的,此时需要用Picture2.hdc而不是GetDC(Picture2.hwnd),GetDC(Picture2.hwnd)得到是前台DC,Picture2.hdc是后台DC
2022年03月14日 11点03分
隨風🍁缒夢
@自控不能患者♬
Autoredraw=False BitBlt是直接显示的,但是被其他窗口遮挡就擦除了,Autoredraw=True时BitBlt后是需要Refresh的,除了在Load时(窗口还没显示)可以不用Refresh(等Load后窗口显示出来就会自动执行WM_PAINT消息(等于执行了Refresh),其他事件中基本上都要手动Refresh
2022年03月14日 11点03分
隨風🍁缒夢
@自控不能患者♬
简单的可以说,Refresh就是将后台DC中的图像翻转到前台显示。纯GDI编程双缓存也会涉及到BitBlt翻转DC到前台,DirectX中也有Present翻转一样
2022年03月14日 11点03分
level 14
yjryym
AutoRedraw 为True时才要 Refresh,为False时不要Refresh,个人建议用这个通用写法:
If Me.AutoRedraw Then Me.Refresh
2022年03月14日 10点03分
7
自控不能患者♬
能解释下为什么BitBlt GetDC(Picture2.hwnd), 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture2.hdc, 0, 0, vbSrcCopy 能代替picture2.refresh吗
2022年03月14日 11点03分
yjryym
@自控不能患者♬
GetDC获取的始终是窗口自身的DC啊,又不受AutoRedraw影响。
2022年03月15日 02点03分
1