VC图形重绘(闪烁)问题
来源:百度知道 编辑:UC知道 时间:2024/05/30 09:11:14
会随鼠标移动而跟踪画线(网上代码一般是按下左键,再放开左键才出现一条直线),我有试过用CPtrArray来存储关键信息,再在OnDraw中重绘保存的对象,但每响应一次MouseMove都得调用一次OnDraw,效率很低,所以会明显的看到闪烁,希望哪位高人指点。
还有当画线时,鼠标(快速)移出窗口会明显感到由于OnMouseMove延迟导致画出的线条不行到达边界;windows自带的画图程序好像鼠标移出窗口外也能在客户区有所反应,请教下它实现原理。
1.画直线问题
实现鼠标移动中画线的思路是这样的
按下鼠标后,保存住按下时的鼠标位置,并设置一标记指明现在鼠标按下了
鼠标移动事件中,如果有鼠标按下的标记,就先重绘界面,然后在画一条线
鼠标释放的时候再画一条线
2.效率问题
频繁调用OnDraw并不是效率低的原因
一个函数被频繁调用也不是效率低的体现
3.闪烁问题
这是一个经典问题
界面刷新的时候先要清空一次然后绘制
过程频繁的话必然引起闪烁
解决的办法是双缓冲
关键是取消背景擦除
就是响应WM_ONERASEBKGND消息然后什么也不做
构建一个后台的内存位图
每次作图的时候在这个位图上作
然后在OnDraw中将这个位图复制到界面上来
整幅图的复制是非常快的
这样的话就消除了闪烁
注:这里界面上的背景擦除去掉了
内存中的还是需要的
每次画线要先清空内存位图
涉及到你做的具体程序
你可能需要保持住之前已经画好的图形
这样你还需要一个内存位图协调工作
仔细想想
4.边界问题
鼠标出了边界
一般情况下鼠标的移动消息也就得不到了
Windows提供了专门的函数解决这个问题
即在鼠标按下的同时捕获鼠标(SetCapture)
这样鼠标出了边界,捕获鼠标的窗口也能收到鼠标移动消息
在鼠标弹起的时候注意释放捕获的鼠标(ReleaseCapture)
5.双缓冲的资料
我学习这个时候的笔记,看看吧
C#中图形的重绘问题
VC++关于窗口重绘的问题,急!
在线等:VC画图重绘的问题
VC++打印图形
vc下图形编程教程
VC++2005重麻烦问题,请高手进指点
单文档里窗口滚动时的图形重绘
图形问题
图形问题~
如何用VC++做图形动画?