请问用C#把AUTOCAD载入自己创建的WINDOWS窗体并且已经加载了一张图形后,如何在用鼠标点击图中某条线或某个层或某个字符串后返回它们在图中的坐标值以及其它属性等等,也就是说如何获取鼠标点击事件并通过事件参数得到它的坐标值等等,谢谢!

解决方案 »

  1.   

    热区?
    还得根据鼠标取得当前点击范围内的值?然后取e.x和e.y?
      

  2.   

    请参考:
    Sub GetSubEntityInfo()
        
        Dim Object As Object
        Dim PickedPoint As Variant
        Dim TransMatrix As Variant
        Dim ContextData As Variant
        Dim HasContextData As String
        
        On Error GoTo NOT_ENTITY
            
    TRYAGAIN:
            
        MsgBox "在这个对话框关闭后,使用鼠标选择当前图形上的图元"
            
        ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData
        
        HasContextData = IIf(VarType(ContextData) = vbEmpty, "没有", "有")
        
        MsgBox "您选择的对象是: " & TypeName(Object) & vbCrLf & _
                "拾取点坐标: " & PickedPoint(0) & ", " & _
                                                  PickedPoint(1) & ", " & _
                                                  PickedPoint(2) & vbCrLf & _
                "这个对象" & HasContextData & "具有嵌套对象."
        
        Exit Sub
        
    NOT_ENTITY:
        If MsgBox("您未选中图元。按OK重试.", _
                   vbOKCancel & vbInformation) = vbOK Then
            Resume TRYAGAIN
        End If
    End Sub
      

  3.   

    看下面代码,获取就是你要的:// Mouse Position Operation
    //Code Technology Document
    //NITI Collection
    //图片的划分
    //Bottom_Left
    //Bottom_Middle
    //Bottom_Right
    //
    //Middle_Left左边框
    //Middle_Right右边框
    //标题栏
    //Top_Left
    //Top_Middle
    //Top_Right
    //系统按钮
    //SysButton_Min
    //SysButton_Max
    //SysButton_Close
    //SysButton_Restore
    namespace mouse
    {
    //以下是上述画皮肤方法的具体实现部分,举一个画左边框的代码示例,
    private void DrawMiddle_Left(Graphics g)
    {
     Brush brush = new TextureBrush(Middle_Left, new Rectangle(0, 0,Middle_Left.Width, Middle_Left.Height));
     g.FillRectangle(brush, 0, TITLE_WIDTH, Middle_Left.Width,Height - Bottom_Middle.Height - TITLE_WIDTH);
    }  鼠标移动 ,以及反应代码  //定义了一个抽象的基类MouseAction,用来表示所有的鼠标事件,它有一个抽象方法Action:public abstract class MouseAction
    {
     public abstract void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form);
    }
    //向右拉伸窗口事件的代码响应
    // MouseSizeLeft:拉伸左边框
    // MouseSizeBottom:拉伸下边框
    // MouseSizeTop:拉伸上边框
    // MouseSizeTopLeft:拉伸左上角
    // MouseSizeTopRight:拉伸右上角
    // MouseSizeBottomLeft:拉伸左下角
    // MouseSizeBottomRight:拉伸右下角
    // MouseDrag:鼠标拖动
    public class MouseSizeRight : MouseAction
    {
     private int lx;
     public MouseSizeRight(int LocationX)
     {
      lx = LocationX;
     }
     public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)
     {
      form.Width = ScreenX - lx;
      form.Invalidate();
     }
    }
    // 鼠标拖动同样也很简单,不过却稍不同于窗口的缩放拉伸,这里举出它的实现代码:
    public class MouseDrag : MouseAction
    {
     private int x, y;
     public MouseDrag(int hitX, int hitY)
     {
      x = hitX;
      y = hitY;
     }
     public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)
     {
      form.Location = new Point(ScreenX - x, ScreenY - y);
     }
    }
    //接下来我们开始编写发出事件的代码,先定义几个变量:
    private int LEFT = 5, RIGHT = 5, BOTTOM = 5, TOP = 5, TITLE_WIDTH = 45;//边框和标题栏的大小
    private int x = 0, y = 0;//保存鼠标的临时坐标
    private MouseAction mouse;//鼠标的事件响应对象
    然后在Form的MouseDown事件中记录下鼠标的当前坐标:
    x = e.X;
    y = e.Y;
    附:e为System.Windows.Forms.MouseEventArgs
    ///根据鼠标的坐标定义出事件响应对象:  /////鼠标点击左上边框
    if((e.X <= LEFT + 10 && e.Y <= TOP) || (e.Y <= TOP + 10 && e.X <= LEFT))
    {
    mouse = new MouseSizeTopLeft(Location.X, Location.Y, Width, Height);
    return;
    }
    //鼠标点击系统关闭按纽
    if(e.X > Width - 20 && e.Y > 6 && e.X < Width - 20 + SysButton_Min.Width && e.Y < 6 + SysButton_Min.Height)
    {
    Close();
    return;
    }
    //大部分的事件响应实际上是在MouseMove事件中完成的:
    private void Form_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
     this.Parent.Cursor = CheckCursorType(e.X, e.Y);//改变鼠标的指针形状
     if(mouse != null)
     {
     mouse.Action(Control.MousePosition.X, Control.MousePosition.Y, this);//执行时间响应
     //注意坐标是Control.MousePosition这个静态变量给出的,它的值为鼠标在桌面上的全局坐标
     }
    }
    最后,MouseUp事件中将mouse变量释放掉:
    private void Form_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    mouse = null;
    }
    加上标题栏的双击最大化或者还原的事件:
    private void Form_DoubleClick(object sender, System.EventArgs e)
    {
      if(y > TOP && y < TITLE_WIDTH)
      {
      if(WindowState == FormWindowState.Normal)
      {
       WindowState = FormWindowState.Maximized;
       SysButton = SysButton_Restore;
       Invalidate();
      }
      else if(WindowState == FormWindowState.Maximized)
      {
       WindowState = FormWindowState.Normal;
       SysButton = SysButton_Max;
       Invalidate();
      }
      }
    }
    //防止窗体被缩小成一个点,最好给窗口的MinimumSize赋上一个适当的值,例如200,200
    }
      

  4.   

    楼上两位朋友,我要获得的是AUTOCAD里面的图形里面的某个点的坐标值,并不是获得C#开发的应用程序客户区或非客户区的坐标值!
      

  5.   

    你们实现的是当数标点击应用程序后获得应用程序的坐标值,而并不是真实的AUTOCAD里面图形里面的坐标值!
      

  6.   

    请问q2onq2朋友在不在,如果在的话麻烦进来看看我这个问题,谢谢!
      

  7.   

    GetSubEntityInfo返回的是真实的AUTOCAD里面图形里面的坐标值.
    再参考:Sub GetSubEntityInfo()
        
        Dim Object As Object
        Dim PickedPoint As Variant
        Dim TransMatrix As Variant
        Dim ContextData As Variant
        Dim HasContextData As String
        
        On Error GoTo NOT_ENTITY
            
    TRYAGAIN:
            
        MsgBox "在这个对话框关闭后,使用鼠标选择当前图形上的图元"
            
        ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData
        
        HasContextData = IIf(VarType(ContextData) = vbEmpty, "没有", "有")
        
        MsgBox "您选择的对象是: " & TypeName(Object) & vbCrLf & _
                "拾取点坐标: " & PickedPoint(0) & ", " & _
                                                  PickedPoint(1) & ", " & _
                                                  PickedPoint(2) & vbCrLf & _
                "这个对象" & HasContextData & "具有嵌套对象."
        
        Select Case TypeName(Object)
            Case "IAcadPolyline", "IAcadLWPolyline", "IAcad3DPolyline"
              'Dim n As Long: n = Object.GetVertexCount
                For i = 0 To GetVertexCount(Object) - 1
                  OutStr = OutStr & vbCrLf & Utility.RealToString(Object.Coordinate(i)(0), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(Object.Coordinate(i)(1), acDefaultUnits, 3)
                  If TypeName(Object) = "IAcad3DPolyline" Then
                      OutStr = OutStr & vbCrLf & " " & Utility.RealToString(Object.Coordinate(i)(2), acDefaultUnits, 3)
                  Else
                      OutStr = OutStr & vbCrLf & " " & Utility.RealToString(Object.Elevation, acDefaultUnits, 3)
                  End If
                Next
            Case "IAcadPoint"
                  pt = Object.Coordinates
                  OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
            Case "IAcadBlockReference2", "IAcadShape"
                  pt = Object.InsertionPoint
                  OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
        End Select
        
        MsgBox OutStr
        
        
        Exit Sub
        
    NOT_ENTITY:
        If MsgBox("您未选中图元。按OK重试.", _
                  vbOKCancel & vbInformation) = vbOK Then
            Resume TRYAGAIN
        End If
    End SubPublic Function GetVertexCount(Polyline) As Integer
    On Error Resume Next
    Select Case TypeName(Polyline)
      Case "IAcadLWPolyline"
          VertList = Polyline.Coordinates
          GetVertexCount = (UBound(VertList) + 1) / 2
      Case "IAcadPolyline", "IAcad3DPolyline"
          VertList = Polyline.Coordinates
          GetVertexCount = (UBound(VertList) + 1) / 3
    End Select
    End Function
      

  8.   

    仓促修改一下:Sub GetSubEntityInfo()
        
        Dim Object As Object
        Dim PickedPoint As Variant
        Dim TransMatrix As Variant
        Dim ContextData As Variant
        Dim HasContextData As String
        
        On Error GoTo NOT_ENTITY
            
    TRYAGAIN:
            
        MsgBox "在这个对话框关闭后,使用鼠标选择当前图形上的图元"
            
        ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData
        
        HasContextData = IIf(VarType(ContextData) = vbEmpty, "没有", "有")
        
        MsgBox "您选择的对象是: " & TypeName(Object) & vbCrLf & _
                "拾取点坐标: " & PickedPoint(0) & ", " & _
                                                  PickedPoint(1) & ", " & _
                                                  PickedPoint(2) & vbCrLf & _
                "这个对象" & HasContextData & "具有嵌套对象."
        
        Select Case TypeName(Object)
            Case "IAcadPolyline", "IAcadLWPolyline", "IAcad3DPolyline"
                For i = 0 To GetVertexCount(Object) - 1
                  OutStr = OutStr & vbCrLf & Utility.RealToString(Object.Coordinate(i)(0), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(Object.Coordinate(i)(1), acDefaultUnits, 3)
                  If TypeName(Object) = "IAcad3DPolyline" Then
                      OutStr = OutStr & " " & Utility.RealToString(Object.Coordinate(i)(2), acDefaultUnits, 3)
                  Else
                      OutStr = OutStr & " " & Utility.RealToString(Object.Elevation, acDefaultUnits, 3)
                  End If
                Next
            Case "IAcadPoint"
                  pt = Object.Coordinates
                  OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
            Case "IAcadBlockReference2", "IAcadShape"
                  pt = Object.InsertionPoint
                  OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
                  OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
        End Select
        
        MsgBox OutStr
        
        
        Exit Sub
        
    NOT_ENTITY:
        If MsgBox("您未选中图元。按OK重试.", _
                  vbOKCancel & vbInformation) = vbOK Then
            Resume TRYAGAIN
        End If
    End SubPublic Function GetVertexCount(Polyline) As Integer
    On Error Resume Next
    Select Case TypeName(Polyline)
      Case "IAcadLWPolyline"
          VertList = Polyline.Coordinates
          GetVertexCount = (UBound(VertList) + 1) / 2
      Case "IAcadPolyline", "IAcad3DPolyline"
          VertList = Polyline.Coordinates
          GetVertexCount = (UBound(VertList) + 1) / 3
    End Select
    End Function
      

  9.   

     Dim Object As Object 
        Dim PickedPoint As Variant 
        Dim TransMatrix As Variant 
        Dim ContextData As Variant 这么些个数据类型在C#中都不知道用什么类型来替换!6楼朋友能解释一下这些类型吗?
      

  10.   

    C#没有Variant数据类型,可否用Object代替呢?