Visio二次开发——鼠标置于Shape上显示细节信息

当鼠标置于Visio图的Shape上时,需要将当前DetailInfo显示出来。

以下程序实现当鼠标置于Shape上时间超过2s时,弹出DetailInfo的窗口。

1.在鼠标的MouseMove事件响应函数中添加

Shape moveShape = null;

Shape lastShape = null;

ShapeItem item = new ShapeItem();

private void Application_MouseMove(int Button, int KeyButtonState, double x, double y, ref bool CancelDefault)

{

if (!isMouseMiddle && buttonKey != 1)
            {

//确定弹出窗体的position
                showPoint = Control.MousePosition;// new Point((int)x, (int)y);
                showPoint.X -= 100;
                if (showPoint.X < 10)
                {
                    showPoint.X = 10;
                }
                else if (showPoint.X > this.Width - 10)
                {
                    showPoint.X = this.Width - 10;
                }
                showPoint.Y -= 220;
                if (showPoint.Y < 10)
                {
                    showPoint.Y = 10;
                }
                else if (showPoint.X > this.Width - 10)
                {
                    showPoint.Y = this.Height - 10;
                }
                //获取当前的Shape
                moveShape = Utility.GetClickedShape(axDrawingC_GJT, x, y);
                if (moveShape != null)
                {   //如果Shape不为空,则将Shape和当前时间更新到item中 ,item为包含Shape和DateTime成员的数据结构。            
                    if (moveShape != lastShape)  //鼠标在同一Shape上移动时,只有第一次更新item
                    {
                        DateTime dtPresent = DateTime.Now;
                        btimeFlag = true;
                        item.MoveShape = moveShape;
                        item.DtPresent = dtPresent;           
                    }
                    lastShape = moveShape;

 }

else  //如果moveShape为null,则关闭form1

{

if(form1 != null)

form1.close();

}

}

2. 采用另一个线程,对item进行监控

public void MonitorMouseRoute()
        {  
            while (!isStopMainT)
            {
                Thread.Sleep(200);
                DateTime dtNow = DateTime.Now;
                if ((btimeFlag == true) && (dtNow.Subtract(item.DtPresent).Seconds >= 2))
                {

btimeFlag = false;

form1.Location = ShowPoint;

form1.show()

 }

}

}

3.在主线程中定义

   monitorMouse = new Thread(MonitorMouseRoute);
            monitorMouse.Start();

总结上述代码只是提供了思路和方法,实际情况中根据需要再添加相应的函数。

你可能感兴趣的:(C#,Visio二次开发,WinForm)