5

假设我在我的程序中生成了几个数字。我想给用户一次打印它们的选项。我不想为每一页显示打印对话框。因此,我只显示一次,并且只显示第一个图。这是我到目前为止提出的解决方案:

figHandles = get(0, 'Children');
for currFig = 1:length(figHandles)
    if(currFig == 1)
        printdlg(figHandles(currFig)); % Shows the print dialog for the first figure
    else
        print(figHandles(currFig)); % Does not show the print dialog and uses the latest printer selection
    end
end

但问题是,如果用户取消第一个图形的打印,我无法捕捉它并取消其他打印。我应该如何做到这一点?

4

1 回答 1

1

好吧,这是一个非常肮脏的把戏,绝对不能保证它适用于所有版本。它在 Matlab 2013a / win 7 上对我有用。

要让 Matlab 返回一个关于它是否执行打印作业的值,您需要在print.m函数中插入一个小技巧。


黑客攻击print.m

  • 找到print.m函数。它应该在您的 matlab 安装文件夹中..\toolbox\matlab\graphics\print.m

  • 找到后,制作备份副本!这个技巧是次要的,不应该破坏任何东西,但我们永远不知道)。

  • 打开文件print.m并找到 line LocalPrint(pj);,它应该在 main 函数的附近或末尾(对我来说是 ~line 240)。

  • 将行替换为:

.

pj = LocalPrint(pj); %// Add output to the call to LocalPrint
if (nargout == 1)
    varargout{1} = pj ; %// transfer this output to the output of the `print` function
end
  • 保存文件。

完成黑客攻击。现在每次调用该print函数时,都可以有一个包含信息的返回参数。


适用于您的案例:

首先,请注意,在 Windows 机器上,该printdlg函数等效于print使用参数调用该函数'-v'
所以printdlg(figHandle)是完全一样的print('-v',figHandle)'-v'代表verbose。我们将使用它。

该函数的输出将是一个包含许多字段print的结构(我们称之为它)。pj您要检查以了解打印命令是否实际执行的字段是pj.Return.

pj.return == 0 => job cancelled
pj.return == 1 => job sent to printer

因此,在您的情况下,在对 进行调整之后print.m,它可能如下所示:

pj = print('-v',figHandles(1)); %// Shows the print dialog for the first figure
if pj.Return %//if the first figure was actually printed (and not cancelled)
    for currFig = 2:length(figHandles)
        print(figHandles(currFig)); %// Does not show the print dialog and uses the latest printer selection
    end
end

注意:该pj结构包含更多可重复使用的信息,包括打印作业选项、当前选择的打印机等...

于 2014-10-09T19:22:24.767 回答