首页技术onmousemove怎么用(onmousemove什么意思)

onmousemove怎么用(onmousemove什么意思)

编程之家2026-06-12671次浏览

大家好,关于onmousemove怎么用很多朋友都还不太明白,今天小编就来为大家分享关于onmousemove什么意思的知识,希望对各位有所帮助!

onmousemove怎么用(onmousemove什么意思)

消息响应函数OnMouseMove是怎么调用的

鼠标移动,系统会向与鼠标有重叠的窗口发送,鼠标移动消息,进程有一个消息队列,就是用来接收各种消息。。。进程的入口程序叫做winmain,他会有一个消息处理循环,就是读各种消息,然后根据消息所属窗口,发送给窗口过程函数(所有窗口都有一个用于消息处理的回调函数,有dispathmessage()这个函数回调,这是windows系统的一个API函数)。。。。窗口过程函数接到消息,就会处理消息,你的操作可以再消息处理中进行,但通常编程软件不这么做,窗口过程只做一件事就是,置位事件(一个WINDOWS内核对象,需要向windows申请创建,可以理解为一个开关)。。。。

窗口处理函数处理后返回,winmain就会调用事件处理函数,这个函数里存有各种类似OnMouseMove,这样的函数的函数指针,每当他发现某事件置位,他就会调用相关的回调函数。。

具体过程,鼠标移动->鼠标向系统发送消息->系统根据鼠标位置向拥有改窗口的进程发送消息->

进程中消息循环得到消息并调用dispathmessage()->dispathmessage()分析后根据消息所属窗口调用窗口处理函数->窗口处理函数置位对应事件信号退出处理->winmain调用事件处理函数->

事件处理函数调用OnMouseMove。。。。。就是这么个过程,不过在窗口处理函数之前的步骤是必须的,是windows系统的处理机制,之后的是软件为了提高程序效率加的。。。。

现在的编程软件都非常智能,你只需要向OnMouseMove内些内容,其他代码都是自动生成。。。。

onmousemove怎么用(onmousemove什么意思)

onMouseover和onMousemove有什么区别

在Visual Basic中,可以利用鼠标事件来使应用程序对鼠标的位置和状态作出响应,如单击、双击、移动、松开鼠标键和按下鼠标键等。

一、onMouseOver的用法。

松开鼠标键就是onMouseOver,发生在松开鼠标的时候。可以利用松开鼠标键的事件来代替单击事件。这样做的好处是可以在检测鼠标键的同时,检测你所按下的键盘上的功能键,如控制键。

二、onMouseMove的用法。

鼠标移动事件即onMouseMove,发生在鼠标滑动的时候。鼠标在对象上移动的时候,这个事件将一直发生。

但是,不是对鼠标经过的每个像素,Visual Basic都会生成鼠标移动事件。操作环境一秒生成有限的鼠标消息。并且,鼠标指针移动得越快,在任意两点之间所能识别的鼠标移动事件就越少。

应用程序能在极短的事件内识别大量鼠标移动的事件。因此,一个鼠标移动事件过程不应去做那些需要大量计算时间的工作。否则可能会引发意想不到的结果,或者使程序的运行变得非常缓慢。

MFC编程ellipse()怎么画圆

所谓的动态画线,画矩形,画椭圆的本质就是在于消隐问题的解决以及对Windows消息循环机制的理解,消隐问题:因为MFC中有一个函数SetROP2,通过将该函数的参数设置为R2—NOT(当前绘制的像素值设为屏幕像素值的反色,这里面的“屏幕”二字是指你所绘制的图形所占据的那一部分屏幕区域,即直线所占的屏幕区域就是直线所在的那一段线的区域),利用这一点通过在同一区域重复画两次便可以将该区域的形状消隐。

而Windows消息循环机制更好的体现于MouseMove消息响应中,因为要实现动态画线、画矩形这就体现在鼠标在绘图区的移动上,鼠标在绘图区移动时,产生动态的效果,也就是说在mouse移动的过程中始终在画线、画矩形,这就要求在MouseMove消息响应中有画线、画矩形的相应函数的调用,但正是因为mouse移动的过程中画了很多的线、矩形,所以我们就要在mouse移动的过程中将之前画出的线、矩形消隐掉,才能保证实现了自己所要实现的功能——动态画线、画矩形,但又没有产生多余的线和矩形。

消隐的问题和动态画图的问题关键在于MouseMove消息响应中的函数调用的顺序:

1.首先将上次所画的图形消隐掉

2.画出临时的图形

3.消息循环的机制:循环执行上述代码(这是Windows循环的机制,不需要自己代码实现)

在最后的LButtonUp消息响应中,需要将上面的MouseMove消息响应中循环的最后一次中最后所画的临时图形消隐掉,之后根据LButtonUp消息响应中point参数画出最终的图形。综上可知:MouseMove中的代码和LButtonUp中消隐临时图形的代码所要实现的功能就是动态这一过程,而图形的最终绘制还在与LButtonUp消息响应及其point参数。

代码如下:

[cpp] view plaincopy

private:

[cpp] view plaincopy

//......

HCURSOR m_HCross;

UINT m_drawType;

CPoint m_OldPoint;

CPoint m_startPoint;

BOOL m_startRect;

[cpp] view plaincopy

CGISView::CGISView()

{

// TODO: add construction code here

//....

m_startRect=FALSE;

m_startPoint=0;

m_OldPoint=0;

m_drawType=0;

//初始化m_HCross为十字光标

m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);

}

[cpp] view plaincopy

void CGISView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_startRect=TRUE;//鼠标左键单击,设置可以开始绘制矩形框

m_startPoint=point;//记录起始点

m_OldPoint=point;//设置老点也为起始点

//设置光标为十字光标

::SetCursor(m_HCross);

CView::OnLButtonDown(nFlags, point);

}

[cpp] view plaincopy

void CGISView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CClientDC dc(this);//获取设备句柄

dc.SetROP2(R2_NOT);//此为关键

dc.SetROP2(R2_NOT);//所绘制的图形并没有消失,所以可以验证下面的连续两次颜色取反不是在一次相应中完成

//SetRop2 Specifies the new drawing mode.(MSDN)

//R2_NOT Pixel is the inverse of the screen color.(MSDN)

//即:该函数用来定义绘制的颜色,而该参数则将颜色设置为原屏幕颜色的反色

//这样,如果连续绘制两次的话,就可以恢复原来屏幕的颜色了(如下)

//但是,这里的连续两次绘制却不是在一次消息响应中完成的

//而是在第一次拖动响应的绘制可以显示(也就是看到的),第二次拖动绘制实现擦出(也就看不到了)

dc.SelectStockObject(NULL_BRUSH);//不使用画刷

if(TRUE==m_startRect)//根据是否有单击判断是否可以画矩形

{

switch(m_drawType)

{

case 1://Rectangle

::SetCursor(m_HCross);

dc.Rectangle(CRect(m_startPoint,m_OldPoint));

dc.Rectangle(CRect(m_startPoint,point));

m_OldPoint=point;

break;

case 2://Line

::SetCursor(m_HCross);

//擦去上一次绘制的临时线

dc.MoveTo(m_startPoint);

dc.LineTo(m_OldPoint);

//绘制这一次的临时线

dc.MoveTo(m_startPoint);

dc.LineTo(point);

//将临时线的终点复制给m_OldPoint,

//使其在消息循环的过程中将该值传递到

//擦去上一次画线的过程中,以便擦去上一次所画的线

m_OldPoint=point;

break;

case 3://Circle

::SetCursor(m_HCross);

//擦去上一次绘制的临时圆

//设定该圆的y坐标,因为要保证两点的x之差等于y之差

m_OldPoint.y=m_OldPoint.x-m_startPoint.x+m_startPoint.y;

dc.Ellipse(CRect(m_startPoint,m_OldPoint));

//绘制临时圆

point.y=point.x-m_startPoint.x+m_startPoint.y;

dc.Ellipse(CRect(m_startPoint,point));

m_OldPoint=point;

break;

case 4://Ellipse

::SetCursor(m_HCross);

dc.Ellipse(CRect(m_startPoint,m_OldPoint));

dc.Ellipse(CRect(m_startPoint,point));

m_OldPoint=point;

break;

case 5://Dot

break;

}

[cpp] view plaincopy

}

[cpp] view plaincopy

}

[cpp] view plaincopy

void CGISView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_startRect=FALSE;//重置绘制矩形框标志

::ClipCursor(NULL);//解锁光标,即将光标恢复为默认光标

//消隐最后的一个矩形

CClientDC dc(this);//获取设备句柄

// dc.SetROP2(R2_NOT);//在MouseMove消息响应中使用过该函数了,所以在这里再一次使用会使得其恢复为屏幕的颜色

dc.SelectStockObject(NULL_BRUSH);//设置画刷为空画刷

switch(m_drawType)

{

case 1://Retangle

//利用当前画刷绘制矩形,内部由当前空画刷(NULL_BRUSH)填充。

//擦去MouseMove消息响应中的临时矩形

dc.Rectangle(CRect(m_startPoint,m_OldPoint));

//绘制固定矩形

dc.Rectangle(CRect(m_startPoint,point));

//m_drawType=0;//该行的可以使得每画一次都要选择所画的形状

break;

case 2://Line

//擦去MouseMove消息响应中绘制的最后一次临时线

dc.MoveTo(m_startPoint);

dc.LineTo(m_OldPoint);

//绘制固定线

dc.MoveTo(m_startPoint);

dc.LineTo(point);

break;

case 3://Circle

dc.Ellipse(CRect(m_startPoint,m_OldPoint));

dc.Ellipse(CRect(m_startPoint,point));

break;

case 4://Ellipse

dc.Ellipse(CRect(m_startPoint,m_OldPoint));

dc.Ellipse(CRect(m_startPoint,point));

break;

case 5://Dot

dc.SetPixel(point,RGB(0,0,0));

break;

}

CView::OnLButtonUp(nFlags, point);

}

[cpp] view plaincopy

void CGISView::OnRectangle()

{

// TODO: Add your command handler code here

m_drawType=1;//设置所画的为矩形

}

void CGISView::OnLine()

{

// TODO: Add your command handler code here

m_drawType=2;

}

void CGISView::OnEllipse()

{

// TODO: Add your command handler code here

m_drawType=4;

}

void CGISView::OnDot()

{

// TODO: Add your command handler code here

m_drawType=5;

}

void CGISView::OnCircle()

{

// TODO: Add your command handler code here

m_drawType=3;

}

以上为自己根据实际编程练习和对博文的学习所领悟到的,如果有哪里理解的不对,还望大家指正,谢谢哈!(代码没有问题,可以正常运行。)

注:代码的排版,我多次修改,并确保整齐,但是一旦我发表后,代码的排版就会发生改变,有几行代码就会变得不规则。

关于本次onmousemove怎么用和onmousemove什么意思的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

金苹果群岛海螺位置(方舟水晶岛玛瑙螺位置)aspice?spiced