我发现中望中无法使用直接跳转式进度条(中望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();
}
效果

评论