明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3208|回复: 5

[界面] ShowModalDialog窗体在打印预览时出现的问题

[复制链接]
发表于 2011-3-24 17:02:55 | 显示全部楼层 |阅读模式
本帖最后由 hnzgs 于 2011-3-25 07:58 编辑

'环境:VS2008+CAD2010
  1. ‘启动打印窗体
  2. <CommandMethod("ShowPrint")> Public Shared Sub ShowPrint()
  3.         Dim frm As New FrmPrint
  4.        Application.ShowModalDialog(frm)
  5.     End Sub
用命令行方式(窗体没有运行时)调用过程一切正常

  1. '测试函数
  2.     <CommandMethod("cs")> Public Shared Sub CS()
  3.         MultiSheetPreview()'过程代码见二楼、三楼
  4.     End Sub
但在窗体里用按钮调用的时候会出预览界面鼠标点击无反应的情况,好像无法获得焦点

  1. '预览按钮代码
  2.     Private Sub BtnYuLan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnYuLan.Click
  3.         Me.Visible = False
  4.         MultiSheetPreview()'过程代码见二楼、三楼
  5.         Me.Visible = True
  6.     End Sub
求助如何解决?
 楼主| 发表于 2011-3-25 07:55:31 | 显示全部楼层
本帖最后由 hnzgs 于 2011-3-25 07:57 编辑

附Kean代码

  1. Public Shared Sub MultiSheetPreview()

  2.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  3.         Dim ed As Editor = doc.Editor
  4.         Dim db As Database = doc.Database
  5.         Dim layoutsToPlot As New ObjectIdCollection()
  6.         Dim tr As Transaction = db.TransactionManager.StartTransaction()
  7.         Using tr

  8.             ' First we need to collect the layouts to
  9.             ' plot/preview in tab order

  10.             Dim layoutDict As New SortedDictionary(Of Integer, ObjectId)()
  11.             Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)

  12.             For Each btrId As ObjectId In bt
  13.                 Dim btr As BlockTableRecord = DirectCast(tr.GetObject(btrId, OpenMode.ForRead), BlockTableRecord)
  14.                 If btr.IsLayout AndAlso btr.Name.ToUpper() <> BlockTableRecord.ModelSpace.ToUpper() Then
  15.                     ' The dictionary we're using will
  16.                     ' sort on the tab order of the layout
  17.                     Dim lo As Layout = DirectCast(tr.GetObject(btr.LayoutId, OpenMode.ForRead), Layout)
  18.                     layoutDict.Add(lo.TabOrder, btrId)
  19.                 End If
  20.             Next

  21.             ' Let's now get the layout IDs and add them to a
  22.             ' standard ObjectIdCollection
  23.             Dim vc As SortedDictionary(Of Integer, ObjectId).ValueCollection = layoutDict.Values
  24.             For Each id As ObjectId In vc
  25.                 layoutsToPlot.Add(id)
  26.             Next
  27.             ' Committing is cheaper than aborting
  28.             tr.Commit()
  29.         End Using

  30.         ' PlotEngines do the previewing and plotting
  31.         If PlotFactory.ProcessPlotState = Autodesk.AutoCAD.PlottingServices.ProcessPlotState.NotPlotting Then
  32.             Dim layoutNum As Integer = 0
  33.             Dim isFinished As Boolean = False
  34.             Dim isReadyForPlot As Boolean = False
  35.             While Not isFinished
  36.                 ' Create the preview engine with the appropriate
  37.                 ' buttons enabled - this depends on which
  38.                 ' layout in the list is being previewed
  39.                 Dim flags As PreviewEngineFlags = PreviewEngineFlags.Plot
  40.                 If layoutNum > 0 Then
  41.                     flags = flags Or PreviewEngineFlags.PreviousSheet
  42.                 End If
  43.                 If layoutNum < layoutsToPlot.Count - 1 Then
  44.                     flags = flags Or PreviewEngineFlags.NextSheet
  45.                 End If
  46.                 Dim pre As PlotEngine = PlotFactory.CreatePreviewEngine(CInt(flags))
  47.                 Using pre
  48.                     Dim stat As PreviewEndPlotStatus = MultiplePlotOrPreview(pre, True, layoutsToPlot, layoutNum, "")
  49.                     ' We're not checking the list bounds for
  50.                     ' next/previous as the buttons are only shown
  51.                     ' when they can be used
  52.                     If stat = PreviewEndPlotStatus.[Next] Then
  53.                         layoutNum += 1
  54.                     ElseIf stat = PreviewEndPlotStatus.Previous Then
  55.                         layoutNum -= 1
  56.                     ElseIf stat = PreviewEndPlotStatus.Normal OrElse stat = PreviewEndPlotStatus.Cancel Then
  57.                         isFinished = True
  58.                     ElseIf stat = PreviewEndPlotStatus.Plot Then
  59.                         isFinished = True
  60.                         isReadyForPlot = True
  61.                     End If
  62.                 End Using
  63.             End While

  64.             ' If the plot button was used to exit the preview...
  65.             If isReadyForPlot Then
  66.                 Dim ple As PlotEngine = PlotFactory.CreatePublishEngine()
  67.                 Using ple
  68.                     Dim stat As PreviewEndPlotStatus = MultiplePlotOrPreview(ple, False, layoutsToPlot, -1, "c:\multisheet-previewed-plot")
  69.                 End Using
  70.             End If
  71.         Else
  72.             ed.WriteMessage(vbLf & "Another plot is in progress.")
  73.         End If

  74.     End Sub
 楼主| 发表于 2011-3-25 07:56:11 | 显示全部楼层

  1. Private Shared Function MultiplePlotOrPreview(ByVal pe As PlotEngine, ByVal isPreview As Boolean, ByVal layoutSet As ObjectIdCollection, ByVal layoutNumIfPreview As Integer, ByVal filename As String) As PreviewEndPlotStatus
  2.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  3.         Dim ed As Editor = doc.Editor
  4.         Dim db As Database = doc.Database
  5.         Dim ret As PreviewEndPlotStatus = PreviewEndPlotStatus.Cancel
  6.         Dim layoutsToPlot As ObjectIdCollection

  7.         If isPreview AndAlso layoutNumIfPreview >= 0 Then
  8.             ' Preview is really pre-sheet, so we reduce the
  9.             ' sheet collection to contain the one we want
  10.             layoutsToPlot = New ObjectIdCollection()
  11.             layoutsToPlot.Add(layoutSet(layoutNumIfPreview))
  12.         Else
  13.             ' If we're plotting we need all the sheets,
  14.             ' so copy the ObjectIds across
  15.             Dim ids As ObjectId() = New ObjectId(layoutSet.Count - 1) {}
  16.             layoutSet.CopyTo(ids, 0)
  17.             layoutsToPlot = New ObjectIdCollection(ids)
  18.         End If

  19.         Dim tr As Transaction = db.TransactionManager.StartTransaction()
  20.         Using tr
  21.             ' Create a Progress Dialog to provide info
  22.             ' and allow thej user to cancel
  23.             Dim ppd As New PlotProgressDialog(isPreview, layoutsToPlot.Count, True)
  24.             Using ppd
  25.                 Dim numSheet As Integer = 1
  26.                 For Each btrId As ObjectId In layoutsToPlot
  27.                     Dim btr As BlockTableRecord = DirectCast(tr.GetObject(btrId, OpenMode.ForRead), BlockTableRecord)
  28.                     Dim lo As Layout = DirectCast(tr.GetObject(btr.LayoutId, OpenMode.ForRead), Layout)
  29.                     ' We need a PlotSettings object
  30.                     ' based on the layout settings
  31.                     ' which we then customize
  32.                     Dim ps As New PlotSettings(lo.ModelType)
  33.                     ps.CopyFrom(lo)
  34.                     ' The PlotSettingsValidator helps
  35.                     ' create a valid PlotSettings object
  36.                     Dim psv As PlotSettingsValidator = PlotSettingsValidator.Current
  37.                     ' We'll plot the extents, centered and
  38.                     ' scaled to fit
  39.                     psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents)
  40.                     psv.SetUseStandardScale(ps, True)
  41.                     psv.SetStdScaleType(ps, StdScaleType.ScaleToFit)
  42.                     psv.SetPlotCentered(ps, True)
  43.                     ' We'll use the standard DWFx PC3, as
  44.                     ' this supports multiple sheets
  45.                     psv.SetPlotConfigurationName(ps, "DWFx ePlot (XPS Compatible).pc3", "ANSI_A_(8.50_x_11.00_Inches)")
  46.                     ' We need a PlotInfo object
  47.                     ' linked to the layout
  48.                     Dim pi As New PlotInfo()
  49.                     pi.Layout = btr.LayoutId
  50.                     ' Make the layout we're plotting current
  51.                     LayoutManager.Current.CurrentLayout = lo.LayoutName
  52.                     ' We need to link the PlotInfo to the
  53.                     ' PlotSettings and then validate it
  54.                     pi.OverrideSettings = ps
  55.                     Dim piv As New PlotInfoValidator()
  56.                     piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled
  57.                     piv.Validate(pi)
  58.                     ' We set the sheet name per sheet

  59.                     ppd.PlotMsgString(PlotMessageIndex.SheetName) = (doc.Name.Substring(doc.Name.LastIndexOf("") + 1) & " - ") + lo.LayoutName
  60.                     If numSheet = 1 Then
  61.                         ' All other messages get set once
  62.                         ppd.PlotMsgString(PlotMessageIndex.DialogTitle) = "Custom Preview Progress"
  63.                         ppd.PlotMsgString(PlotMessageIndex.CancelJobButtonMessage) = "Cancel Job"
  64.                         ppd.PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage) = "Cancel Sheet"
  65.                         ppd.PlotMsgString(PlotMessageIndex.SheetSetProgressCaption) = "Sheet Set Progress"
  66.                         ppd.PlotMsgString(PlotMessageIndex.SheetProgressCaption) = "Sheet Progress"

  67.                         ppd.LowerPlotProgressRange = 0
  68.                         ppd.UpperPlotProgressRange = 100
  69.                         ppd.PlotProgressPos = 0
  70.                         ' Let's start the plot/preview, at last
  71.                         ppd.OnBeginPlot()
  72.                         ppd.IsVisible = True
  73.                         pe.BeginPlot(ppd, Nothing)
  74.                         ' We'll be plotting a single document
  75.                         pe.BeginDocument(pi, doc.Name, Nothing, 1, Not isPreview, filename)
  76.                     End If

  77.                     ' Which may contains multiple sheets
  78.                     ppd.LowerSheetProgressRange = 0
  79.                     ppd.UpperSheetProgressRange = 100
  80.                     ppd.SheetProgressPos = 0
  81.                     Dim ppi As New PlotPageInfo()
  82.                     pe.BeginPage(ppi, pi, (numSheet = layoutsToPlot.Count), Nothing)
  83.                     ppd.OnBeginSheet()
  84.                     pe.BeginGenerateGraphics(Nothing)
  85.                     ppd.SheetProgressPos = 50
  86.                     pe.EndGenerateGraphics(Nothing)
  87.                     ' Finish the sheet
  88.                     Dim pepi As New PreviewEndPlotInfo()
  89.                     pe.EndPage(pepi)
  90.                     ret = pepi.Status
  91.                     ppd.SheetProgressPos = 100
  92.                     ppd.OnEndSheet()
  93.                     numSheet += 1
  94.                     ' Update the overall progress
  95.                     ppd.PlotProgressPos += (100 / layoutsToPlot.Count)
  96.                 Next

  97.                 ' Finish the document
  98.                 pe.EndDocument(Nothing)
  99.                 ' And finish the plot
  100.                 ppd.PlotProgressPos = 100
  101.                 ppd.OnEndPlot()
  102.                 pe.EndPlot(Nothing)
  103.             End Using
  104.         End Using

  105.         Return ret

  106.     End Function
发表于 2023-6-29 19:50:29 | 显示全部楼层
ShowModalDialog窗体在打印预览时出现的问题
发表于 2023-8-6 23:59:25 | 显示全部楼层
有答案了吗
发表于 2023-8-7 19:12:34 | 显示全部楼层
搞定了,采用StartUserInteraction 就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 02:22 , Processed in 0.163169 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表