高分求教windows绘图程序中的刷子是怎么实现的?

来源:百度知道 编辑:UC知道 时间:2024/06/30 12:58:31
windows中的绘图程序可以使用选择的不同画刷画线条,但GDI中却只有画笔可以画线条。虽然可以使用GDI中的纹理画刷但是达不到那样的效果。
用画刷的方法我说过了达不到windows画图程序的效果,主要是画刷绘制的线条都是把画刷中的图形平铺在线条区域互相之间不叠加的。
而采用WM_MOUSEMOVE消息下贴图的方法一是画粗线时会卡,二是用户画线时并不是均匀慢速画线,画快了贴的图之间间隔会拉大变成虚线,画的不匀速的话图片会有的叠加有的间隔有的啥的,如果是不透明的还好只是断线,如果是半透明的话会很难看

说的是windows里的画图程序吧,那个画刷和GDI里的画刷不是一回事啊。

实现起来很简单的。
响应WM_MOUSEMOVE消息,然后在里面根据鼠标位置绘制图形就可以了,甚至可以是用字符作为画刷,然后TextOut就行了。

至于你说的“当用户移动鼠标达到一定的速度时绘出来的线条就会变成一段一段的了”那是你响应 WM_MOUSEMOVE消息太慢了,可以优化一下你的代码。

mspaint画刷不也就是画方块,线条么?
实现很简单啊。
不需要DC里面的画刷功能,
底图位图数据,相当于画布。
定义一个位图块(画刷,注意定义底色也就是透明色)。
捕捉鼠标移动消息,每收到一个wm_mousemove 取当前鼠标坐标,将位图块数据写到画布上,GDI提供了好几个掩膜位图传输的函数,你可以用 AlphaBlend (具体使用参考MSDN或网上搜代码)。
将位图块数据写到画布上,这不就成功了么?

通过这样,你还可以实现比mspaint的画刷更强的功能

答复楼主的:
“而采用WM_MOUSEMOVE消息下贴图的方法一是画粗线时会卡,二是用户画线时并不是均匀慢速画线,画快了贴的图之间间隔会拉大变成虚线,画的不匀速的话图片会有的叠加有的间隔有的啥的,如果是不透明的还好只是断线,如果是半透明的话会很难看”

——出现卡,虚线等问题是你的wm_paint wm_erasebkgnd消息没处理好,拦截这2消息,当用wm_mousemove消息绘制刷子的时候不要响应这2消息,就不会卡和虚线等问题了。

windows绘图程序指的是哪个程序啊?不知是什么样的效果?

画笔画线条时,可以定义画笔的类型,是实线还是点画线等。

画刷的效果可以用填充来实现。

WM_MOUSEMOVE消息是会产生以上所述的问题,建议改写为:
加入布尔型变量MouseHoldOn=false;
加入WM_LBUTTONUP事件
加入WM_LBUTTONDOWN事件
加入一个方法gMouseHoldo