本帖最后由 d1742647821 于 2026-2-9 14:42 编辑

我在中望2025中使用Utils类中的进度条函数会报错,应该是中望提供了接口但未实现,虽然`ProgressMeter`类的进度条可以用,但是ProgressMeter每次都要从0开始走,无法实现直接跳转到某个进度。

这里使用PE技术导出中望的入口点,使用`PInvoke`实现了相同的3个方法。

  1. #if zcad
  2.     [DllImport("zwcad.exe", EntryPoint = "?zcedSetStatusBarProgressMeter@@YAHPEB_WHH@Z",
  3.         CallingConvention = CallingConvention.Cdecl)]
  4.     private static extern void ZcedSetStatusBarProgressMeter(
  5.         [MarshalAs(UnmanagedType.LPWStr)] string label, int minPos, int maxPos);

  6.     [DllImport("zwcad.exe", EntryPoint = "?zcedSetStatusBarProgressMeterPos@@YAHH@Z",
  7.         CallingConvention = CallingConvention.Cdecl)]
  8.     private static extern void ZcedSetStatusBarProgressMeterPos(int position);

  9.     [DllImport("zwcad.exe", EntryPoint = "?zcedSetStatusBarProgressMeterStop@@YAHXZ",
  10.         CallingConvention = CallingConvention.Cdecl)]
  11.     private static extern void ZcedSetStatusBarProgressMeterStop();
  12. #endif


再经过一层封装即可进行Auto和中望代码兼容(这里acad和zcad的条件编译符需要在项目中定义好)


  1. /// <summary>
  2. /// 进度条
  3. /// </summary>
  4. public static class ProgressMeterUtils
  5. {
  6.     /// <summary>
  7.     /// 设置状态栏进度条
  8.     /// </summary>
  9.     public static void SetApplicationStatusBarProgressMeter(string str, int mixPos, int maxPos)
  10.     {
  11. #if acad
  12.         Utils.SetApplicationStatusBarProgressMeter(str, mixPos, maxPos);
  13. #elif zcad
  14.         ZcedSetStatusBarProgressMeter(str, mixPos, maxPos);
  15. #endif
  16.     }

  17.     /// <summary>
  18.     /// 设置状态栏进度条
  19.     /// </summary>
  20.     public static void SetApplicationStatusBarProgressMeter(int nPos)
  21.     {
  22. #if acad
  23.         Utils.SetApplicationStatusBarProgressMeter(nPos);
  24. #elif zcad
  25.         ZcedSetStatusBarProgressMeterPos(nPos);
  26. #endif
  27.     }

  28.     /// <summary>
  29.     /// 关闭进度条
  30.     /// </summary>
  31.     public static void RestoreApplicationStatusBar()
  32.     {
  33. #if acad
  34.         Utils.RestoreApplicationStatusBar();
  35. #elif zcad
  36.         ZcedSetStatusBarProgressMeterStop();
  37. #endif
  38.     }

  39.     // 上面的代码放到这里
  40. }


---

**测试代码**

  1. [CommandMethod(nameof(Test2))]
  2. public static void Test2A()
  3. {
  4.     ProgressMeterUtils.SetApplicationStatusBarProgressMeter("开始",0,100);
  5.     for (var i = 0; i < 100; i++)
  6.     {
  7.         ProgressMeterUtils.SetApplicationStatusBarProgressMeter(i);
  8.         Thread.Sleep(50);
  9.     }
  10.     ProgressMeterUtils.RestoreApplicationStatusBar();
  11. }







网友答:

网友答: 本帖最后由 你有种再说一遍 于 2026-2-9 19:19 编辑

戴老师牛逼啊
放入IFox了吗?

网友答: 技术很强!谢谢分享!

网友答: 给戴老师点个大大的赞!
  • 上一篇:cad.net 自制在位编辑器
  • 下一篇:没有了