【发布时间】:2011-03-21 19:42:51
【问题描述】:
我想写一个MS Paint风格的绘画程序。
为了在用户移动鼠标时在屏幕上绘制东西,我必须等待鼠标移动事件并在收到鼠标移动事件时在屏幕上绘制。显然,mose 移动事件并不经常发送,所以我必须通过在当前鼠标位置和前一个鼠标位置之间画一条线来插入鼠标移动。在伪代码中,这看起来像这样:
var positionOld = null
def handleMouseMove(positionNew):
if mouse.button.down:
if positionOld == null:
positionOld = positionNew
screen.draw.line(positionOld,positionNew)
positionOld = positionNew
现在我的问题:用直线段插值对我来说看起来太锯齿了,你能推荐一个更好的插值方法吗? GIMP 或 Adobe Photoshop 是用什么方法实现的?
或者,有没有办法增加我收到的鼠标移动事件的频率?我使用的 GUI 框架是wxWidgets。
GUI 框架:wxWidgets。
(编程语言:Haskell,但这里无关)
编辑:澄清:我想要看起来比直线段更平滑的东西,请看图片(原始尺寸):
EDIT2:我使用的代码如下所示:
-- create bitmap and derive drawing context
im <- imageCreateSized (sy 800 600)
bitmap <- bitmapCreateFromImage im (-1) -- wxBitmap
dc <- memoryDCCreate -- wxMemoryDC
memoryDCSelectObject dc bitmap
...
-- handle mouse move
onMouse ... sw (MouseLeftDrag posNew _) = do
...
line dc posOld posNew [color := white
, penJoin := JoinRound
, penWidth := 2]
repaint sw -- a wxScrolledWindow
-- handle paint event
onPaint ... = do
...
-- draw bitmap on the wxScrolledWindow
drawBitmap dc_sw bitmap pointZero False []
这可能会有所作为。也许我选择 wx-classes 是我得到相当低频率的鼠标移动事件的原因。
【问题讨论】:
-
我不知道这是否可能,但是您是否考虑过运行一个计时器来检查鼠标位置?然后你就可以控制消息的频率了。
标签: user-interface wxwidgets mouseover interpolation paint