使用gdi自由绘图 - 问题与alpha颜色

时间:2015-02-28 01:49:35

标签: c++ mfc draw gdi alpha

我让用户在表单上绘图。 当我的应用程序将鼠标按下时,我就开始了。 当它获得鼠标启动事件时我结束。 我在mousemove事件上画画。

I.E在鼠标按下事件中我得到了StartPoint。 然后在mousemove我检查,如果鼠标仍然是向下然后我根据鼠标位置绘制。 我使用DrawLine函数绘制。 我保存了上一点并绘制到了我在mousemove中获得的新点。 让我们说鼠标从P1(x1,y1),P2(x2,y2),P3(x3,y3)移动然后我有从P1到P2到P3的线。 一切都按预期工作。 当我用透明颜色绘制时问题开始(例如,Alpha是100)。 当我这样做时,P2会被涂两次。第一次从p1绘制到p2时,第二次是从p2绘制到p3的行。

当Alpha为255时,您没有看到它,因为当您覆盖它时,p2颜色不会改变。它保持笔颜色。 当你使用不等于255的alpha覆盖时,每次覆盖时颜色变得更暗,看起来就是线内的小点。

我附上了截图,因此您会看到问题: http://i.stack.imgur.com/7vA0k.png 是否有任何解决方案来制作没有点的线? 不要忘记,线上可以有很多点,它是自由绘制的,所以直线不是直线。 您在行中看到的每个点都是在每次调用mousemove时创建的。

1 个答案:

答案 0 :(得分:0)

一个显而易见的可能性是绘制整行(从开始到当前点),没有透明度到屏幕外位图。

然后将该位图中每个像素的Alpha通道设置为所需的值(对于您的示例为100)。

最后,使用AlphaBlend从该位图绘制到目标。