VC图形重绘(闪烁)问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 09:11:14
想实现windows自带的画图程序的部分功能,如画直线时,按下左键后直线
会随鼠标移动而跟踪画线(网上代码一般是按下左键,再放开左键才出现一条直线),我有试过用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++做图形动画?