我发现中望中无法使用直接跳转式进度条(中望Utils中的进度条函数会报错),虽然ProgressMeter可以用,但是ProgressMeter每次都要从0开始走,无法实现直接跳转到某个进度。

于是经过我的一番摸索,读取了中望的入口函数,使用PInvoke实现了相同的3个方法。

#if zcad
    [DllImport(DllFileNames.ZwCadExe, EntryPoint = "?zcedSetStatusBarProgressMeter@@YAHPEB_WHH@Z",
        CallingConvention = CallingConvention.Cdecl)]
    private static extern void ZcedSetStatusBarProgressMeter(
        [MarshalAs(UnmanagedType.LPWStr)] string label, int minPos, int maxPos);

    [DllImport(DllFileNames.ZwCadExe, EntryPoint = "?zcedSetStatusBarProgressMeterPos@@YAHH@Z",
        CallingConvention = CallingConvention.Cdecl)]
    private static extern void ZcedSetStatusBarProgressMeterPos(int position);

    [DllImport(DllFileNames.ZwCadExe, EntryPoint = "?zcedSetStatusBarProgressMeterStop@@YAHXZ",
        CallingConvention = CallingConvention.Cdecl)]
    private static extern void ZcedSetStatusBarProgressMeterStop();
#endif

再经过一层封装即可进行代码兼容

/// <summary>
/// 进度条
/// </summary>
public static class ProgressMeterUtils
{
    /// <summary>
    /// 设置状态栏进度条
    /// </summary>
    public static void SetApplicationStatusBarProgressMeter(string str, int mixPos, int maxPos)
    {
#if acad
        Utils.SetApplicationStatusBarProgressMeter(str, mixPos, maxPos);
#elif zcad
        ZcedSetStatusBarProgressMeter(str, mixPos, maxPos);
#endif
    }

    /// <summary>
    /// 设置状态栏进度条
    /// </summary>
    public static void SetApplicationStatusBarProgressMeter(int nPos)
    {
#if acad
        Utils.SetApplicationStatusBarProgressMeter(nPos);
#elif zcad
        ZcedSetStatusBarProgressMeterPos(nPos);
#endif
    }

    /// <summary>
    /// 关闭进度条
    /// </summary>
    public static void RestoreApplicationStatusBar()
    {
#if acad
        Utils.RestoreApplicationStatusBar();
#elif zcad
        ZcedSetStatusBarProgressMeterStop();
#endif
    }
}

测试代码

[CommandMethod(nameof(Test2))]
public static void Test2A()
{
    ProgressMeterUtils.SetApplicationStatusBarProgressMeter("开始",0,100);
    for (var i = 0; i < 100; i++)
    {
        ProgressMeterUtils.SetApplicationStatusBarProgressMeter(i);
        Thread.Sleep(50);
    } 
    ProgressMeterUtils.RestoreApplicationStatusBar();
}

效果
进度条.gif