77077 发表于 2021-12-25 23:02:50

winform非模态窗口测试。

MainClass.cs
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;

namespace ModelessDialogTest
{
    public class MainClass
    {
       //注册命令
      public void UiStart()
      {
            var myfrom = new testFrom();
            //Application.ShowModalDialog(myfrom); //模态显示
            Application.ShowModelessDialog(myfrom); //非模态显示
      }
    }
}
testFrom.cs
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application;
using TransactionManager = Autodesk.AutoCAD.DatabaseServices.TransactionManager;

namespace ModelessDialogTest
{
    public partial class testFrom : Form
    {
      public testFrom()
      {
            //界面的初始化
            InitializeComponent();
      }

      //为了解决窗口切换问题,需要利用Windows API函数SetFocus实现
      //初始化窗口焦点切换功能
      
      private static extern IntPtr SetFocus(IntPtr hwnd);
      /// <summary>
      /// 测试测试
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void button_get_Click(object sender, EventArgs e)
      {
            var entopts = new PromptEntityOptions("\n在图中选择一个图元对象");
            entopts.Message = "\n在图中选择一个图元对象:";
            PromptEntityResult ent = null;
            try
            {
                SetFocus(Application.MainWindow.Handle);//焦点切换到CAD
                ent = Application.DocumentManager.MdiActiveDocument.Editor.GetEntity(entopts);
                if (ent.Status != PromptStatus.Error)
                {
                  ObjectId entid = ent.ObjectId;
                  Database db = Application.DocumentManager.MdiActiveDocument.Database;
                  TransactionManager tm = db.TransactionManager;
                  using (Transaction myT = tm.StartTransaction())
                  {
                        var entity = (Entity) tm.GetObject(entid, OpenMode.ForRead, true);
                        textBox1.Text = "所选对象Name为:" + entity.GetType().Name;
                        myT.Commit();
                  }
                }
                Focus();
            }
            catch
            {
            }
      }

      private void button_ok_Click(object sender, EventArgs e)
      {
            Close();
      }
    }
}
遗留问题:鼠标移出移进时,如何自动切换焦点?private void testFrom_MouseLeave(object sender, EventArgs e)
      {
   textBox1.Text="";
      }

      private void testFrom_MouseEnter(object sender, EventArgs e)
      {
   textBox1.SelectAll();
      }


77077 发表于 2021-12-25 23:11:12

testFrom.Designer.cs
namespace ModelessDialogTest
{
   partial class testFrom
   {
         /// <summary>
         /// Required designer variable.
         /// </summary>
         private System.ComponentModel.IContainer components = null;

         /// <summary>
         /// Clean up any resources being used.
         /// </summary>
         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
         protected override void Dispose(bool disposing)
         {
             if (disposing && (components != null))
             {
               components.Dispose();
             }
             base.Dispose(disposing);
         }

         #region Windows Form Designer generated code

         /// <summary>
         /// Required method for Designer support - do not modify
         /// the contents of this method with the code editor.
         /// </summary>
         private void InitializeComponent()
         {
             this.textBox1 = new System.Windows.Forms.TextBox();
             this.button_get = new System.Windows.Forms.Button();
             this.button_ok = new System.Windows.Forms.Button();
             this.SuspendLayout();
             //
             // textBox1
             //
             this.textBox1.Location = new System.Drawing.Point(13, 89);
             this.textBox1.Name = "textBox1";
             this.textBox1.Size = new System.Drawing.Size(244, 28);
             this.textBox1.TabIndex = 0;
             //
             // button_get
             //
             this.button_get.Location = new System.Drawing.Point(11, 22);
             this.button_get.Name = "button_get";
             this.button_get.Size = new System.Drawing.Size(102, 49);
             this.button_get.TabIndex = 1;
             this.button_get.Text = "Get";
             this.button_get.UseVisualStyleBackColor = true;
             this.button_get.Click += new System.EventHandler(this.button_get_Click);
             //
             // button_ok
             //
             this.button_ok.Location = new System.Drawing.Point(155, 22);
             this.button_ok.Name = "button_ok";
             this.button_ok.Size = new System.Drawing.Size(102, 49);
             this.button_ok.TabIndex = 2;
             this.button_ok.Text = "OK";
             this.button_ok.UseVisualStyleBackColor = true;
             this.button_ok.Click += new System.EventHandler(this.button_ok_Click);
             //
             // testFrom
             //
             this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.ClientSize = new System.Drawing.Size(282, 151);
             this.Controls.Add(this.button_ok);
             this.Controls.Add(this.button_get);
             this.Controls.Add(this.textBox1);
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
             this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
             this.MaximizeBox = false;
             this.MinimizeBox = false;
             this.Name = "testFrom";
             this.ShowInTaskbar = false;
             this.Text = "CAD交互";
             this.ResumeLayout(false);
             this.PerformLayout();

         }

         #endregion

         private System.Windows.Forms.TextBox textBox1;
         private System.Windows.Forms.Button button_get;
         private System.Windows.Forms.Button button_ok;

   }
}

Wanda 发表于 2021-12-27 08:14:27

简单方法可以hook鼠标通过全局位置判断把焦点给谁

77077 发表于 2021-12-28 23:05:34

万能的MJ,找到答案了:lol。
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=169490&extra=page%3D2%26filter%3Dtypeid%26typeid%3D85

言戲無軍 发表于 2022-3-17 13:01:54

77077 发表于 2021-12-28 23:05
万能的MJ,找到答案了。
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=169490&extra=page%3D2%2 ...

楼主在么 看到您在2015年发的一个读取文件数据绘断面帖子 有个程序 请问能否分享下代码呢谢谢您http://bbs.mjtd.com/forum.php?mod=viewthread&tid=113873&highlight=%B6%CF%C3%E6

htxhtx 发表于 2022-6-4 18:34:57

怎么总是错误,一打开非模态窗口,就提示错误,cad关闭

d1742647821 发表于 2022-7-21 12:32:27

data:image/png;base64,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

你这里面明明有个setfocus,放鼠标事件里不就好了
页: [1]
查看完整版本: winform非模态窗口测试。