Canvas / Fabric.js交互式绘图不会使用MSHTA.EXE刷新图形

时间:2015-08-10 12:28:28

标签: batch-file canvas html5-canvas fabricjs hta

我认为我的问题有点不寻常。我写了一个Windows Batch .BAT文件,它读取用户的行(包含Canvas图形函​​数)并通过mshta.exe启动的管道将它们发送到.HTA窗口;在.HTA文件中,行通过fso.GetStandardStream(0).ReadLine()读取并用于通过eval()在HTA窗口上绘制图形。下面是代码,但在您开始搜索错误之前,您应该知道一切正常,除了我在下面解释的细节。

BatchFile.bat

@echo off

if "%1" equ "HTA_interface" goto HTA_interface

rem Start interactive drawing; send lines to HTA window via Stderr
"%~F0" HTA_interface 2>&1 1>&3 | mshta.exe "%~DP0\HTAwindow.hta"
goto :EOF


:HTA_interface
   set "canvas="
   set /P "canvas=Canvas function: "
   if not defined canvas goto :EOF
   echo %canvas% >&2
goto HTA_interface

HTAwindow.hta

<meta http-equiv='x-ua-compatible' content='ie=edge'/>

<HTML>

<HEAD>
<HTA:APPLICATION >
<TITLE>HTA BatchDrawing</TITLE>
</HEAD>

<BODY>
</BODY>

<canvas id="myCanvas" width="400" height="300" style="border:1px solid #000000;">
   Your browser does not support the HTML5 canvas tag
</canvas>

<SCRIPT language="JavaScript">

var fso = new ActiveXObject("Scripting.FileSystemObject"),
    stdin = fso.GetStandardStream(0),
    canvas = document.getElementById("myCanvas"),
    ctx = canvas.getContext("2d");

window.alert("HTA window started!");

while ( ! stdin.AtEndOfStream ) {
   eval(stdin.ReadLine());
}

</SCRIPT>

</HTML>

目标是用户在cmd.exe窗口中输入图形功能,按Enter键并立即 查看.HTA窗口中的相应图形。例如,用户可以输入以下三行:

ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(200,100);ctx.stroke();
ctx.beginPath();ctx.arc(95,50,40,0,2*Math.PI);ctx.stroke();
ctx.beginPath();ctx.lineWidth="10";ctx.strokeStyle="blue";ctx.rect(50,50,150,80);ctx.stroke();

问题是每个单独的图形的绘图不会立即发生:.HTA窗口不会出现在屏幕上,直到管道左侧终止,并且然后.HTA窗口出现所有图形!

我搜索了这个网站用Google搜索了类似的问题,但所有相关的示例和答案都是指通过放置在同一HTML文档中的JavaScript代码创建的交互式图形。我尝试了以下解决方案但没有成功:

  • 我在绘制每个单独的图形后安装了Fabric.js并使用了canvas.renderAll()方法。当然,我在Batch文件输入中使用Fabric的等效canvas.add(new fabric.FIG(...))函数而不是普通的Canvas函数。不行。

  • 我使用了Making and Moving Selectable Shapes教程中解释的方法:当有新图形时,使用draw()函数刷新窗口,并通过{{1}定期执行此功能}。不行。

上一页“不起作用”表示程序的所有版本在输入终止时成功显示所有图形,但在每行发送后不显示单独的图形。

我还尝试在绘制每个图形后插入setInterval(draw, INTERVAL)方法,但这只会导致无限循环。

这是什么问题?有什么办法可以解决吗? TIA

0 个答案:

没有答案
相关问题