2016-11-13 19 views
0

ユーザーが最初にクリックしたときまで、ユーザーがキャンバス上でクリックするすべての点を描画します。私はそれらを隠し入力に格納することができますが、描画/表示( "ctx.fillRect(pos_x、pos_y、1、1);")を画面上に適切に表示することはできません。私のコードは何ですか?私は最初の点を見るだけで、クリックした場所(IE Edgeを使って見る)にさえいません。最終的には、ポイントによって描画された線を追加したいと思います。ポイントを描画するHTML5の2Dコンテキストを取得できません

また、余分なものとして、コードがコンテキストメニューを検出している時間にキャンバス内にクリックが含まれていたかどうかを判断する手助けをすることができますか?

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript"> 
     var c; 
     var ctx; 

     function wireUp() 
     { 
      // Initiate context. Do only once 
      c = document.getElementById('imgContainer'); 
      ctx = c.getContext('2d'); 

      // Store points 
      keepPoints('hiddenMap'); 

      // Override context when user has clicked within the canvas 
      window.oncontextmenu = function() 
      { 
       // TO DO: Detect click was within canvas area 
       clearMap('imgContainer', 'hiddenMap'); 
       return false; // cancel default menu 
      } 

      document.getElementById('imgContainer').onclick = function (e) { 
       // Detect RMB. See: http://stackoverflow.com/questions/2405771/is-right-click-a-javascript-event 
       var isRightMB; 
       e = e || window.event; 

       if ("which" in e) // Gecko (Firefox), WebKit (Safari/Chrome) & Opera 
        isRightMB = e.which == 3; 
       else if ("button" in e) // IE, Opera 
        isRightMB = e.button == 2; 

       if(!isRightMB) 
       { 
        pointDetected('imgContainer', 'hiddenMap', e); 
       } 
       else 
       { // Clear points, drawn and on map 
        alert("RMB"); 
        clearMap('imgContainer', 'hiddenMap'); 
       } 
      }; 
     } 
     function clearMap(container, map) 
     { 
      // Clear drawn points 
      var canvas = document.getElementById(container); 
      ctx.clearRect(0, 0, canvas.width, canvas.height); 

      // Clear map 
      var hMap = document.getElementById(map); 
      hMap.value = ""; 
     } 
     function pointDetected(container, map, event) 
     { 
      //alert("Oh my! " + container); 
      pos_x = event.offsetX?(event.offsetX):event.pageX-document.getElementById(container).offsetLeft; 
      pos_y = event.offsetY?(event.offsetY):event.pageY-document.getElementById(container).offsetTop; 
      //alert(pos_x + ", " + pos_y); 

      var hMap = document.getElementById(map); 
      if(hMap.value) // Check if the map has already points and append with comma 
      { 
       hMap.value = hMap.value + "; " + pos_x + ", " + pos_y; 
      } 
      else 
      { 
       hMap.value = pos_x + ", " + pos_y; 
      } 
      alert(hMap.value); 

      // Draw a point where clicked 
      ctx.fillRect(pos_x, pos_y, 1, 1); 
     } 
     function keepPoints(container) 
     { 
      // Stores all the points that the user has selected 
      var hidden = document.createElement("input"); 
      var typeAtt = document.createAttribute("type"); 
      typeAtt.value = "hidden"; 
      hidden.setAttributeNode(typeAtt); 
      hidden.id = container; 
      document.body.appendChild(hidden); 
     } 
    </script> 
</head> 
<body onload="wireUp();"> 
    <canvas style="background:url('untitled.png');width:819px;height:460px;border-style:solid;" id="imgContainer"> 
    </canvas> 
</body> 

+1

その 'width'と' height'プロパティを使用し、唯一のCSSを通して、あなたのキャンバスのサイズを設定しないでください。 – Kaiido

+0

ありがとう、@Kaiido、それは助けた。コードを投稿する。 – Jaquio

答えて

0

Iはctx.moveToとctx.lineToを使用してラインを作成するためのコードを変更しました。それとカイードのコメントは、コードを動作させるのに役立ちました。

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript"> 
      var c; 
      var ctx; 

     function wireUp() 
     { 
      // Initiate context. Do only once 
      c = document.getElementById('imgContainer'); 
      ctx = c.getContext('2d'); 
      ctx.lineWidth = 5; 
      ctx.strokeStyle = "#FF0000"; 

      // Store points 
      keepPoints('hiddenMap'); 

      // Override context when user has clicked within the canvas 
      window.oncontextmenu = function (e) 
      { 
       // TO DO: Detect click was within canvas area 
       clearMap('imgContainer', 'hiddenMap'); 
       return false; // cancel default menu 
      } 

      document.getElementById('imgContainer').onclick = function (e) { 
       // Detect RMB. See: http://stackoverflow.com/questions/2405771/is-right-click-a-javascript-event 
       var isRightMB; 
       e = e || window.event; 

       if ("which" in e) // Gecko (Firefox), WebKit (Safari/Chrome) & Opera 
        isRightMB = e.which == 3; 
       else if ("button" in e) // IE, Opera 
        isRightMB = e.button == 2; 

       if(!isRightMB) 
       { 
        pointDetected('imgContainer', 'hiddenMap', e); 
       } 
       else 
       { // Clear points, drawn and on map 
        alert("RMB"); 
        clearMap('imgContainer', 'hiddenMap'); 
       } 
      }; 
     } 
     function clearMap(container, map) 
     { 
      // Clear drawn points 
      var canvas = document.getElementById(container); 
      ctx.clearRect(0, 0, canvas.width, canvas.height); 

      // Clear map 
      var hMap = document.getElementById(map); 
      hMap.value = ""; 
     } 
     function pointDetected(container, map, event) 
     { 
      //alert("Oh my! " + container); 
      pos_x = event.offsetX?(event.offsetX):event.pageX-document.getElementById(container).offsetLeft; 
      pos_y = event.offsetY?(event.offsetY):event.pageY-document.getElementById(container).offsetTop; 
      //alert(pos_x + ", " + pos_y); 

      var hMap = document.getElementById(map); 
      if(hMap.value) // Check if the map has already points and append with comma 
      { 
       hMap.value = hMap.value + ";" + pos_x + "," + pos_y; 
     -  // Continue from last drawn point 
       ctx.lineTo(pos_x, pos_y); 
       ctx.stroke(); 
      } 
      else 
      { 
       hMap.value = pos_x + "," + pos_y; 
       // Draw a point where clicked 
       ctx.beginPath(); 
       ctx.moveTo(pos_x, pos_y); 
      } 
      //alert(hMap.value); 

      //ctx.fillRect(pos_x, pos_y, 1, 1); 
     } 
     function keepPoints(container) 
     { 
      // Stores all the points that the user has selected 
      var hidden = document.createElement("input"); 
      var typeAtt = document.createAttribute("type"); 
      typeAtt.value = "hidden"; 
      hidden.setAttributeNode(typeAtt); 
      hidden.id = container; 
      document.body.appendChild(hidden); 
     } 
    </script> 
</head> 
<body onload="wireUp();"> 
    <canvas style="background:url('untitled.png');border-style:solid;" width="819" height="460" id="imgContainer"> 
    </canvas> 
</body> 

関連する問題