質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1959閲覧

WinForm に WebBrowser を貼りマウスベントを取得して線を引きたい

byori

総合スコア71

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/08/18 09:07

社内アプリで表題の通りWebBrowserを貼り別アプリで作成したhtmlを表示させています。
簡易コードで、JPEGを表示させています。
そのWebBrowser上に表示してる「JPEGに線を引きたい」ことになり調べていますがうまくいきません。下記のコードでMouseDownやMouseMoveを取得できますが線が引けません。線を表示できません。

下記のコードは、動的にWebBrowserを作成し、その派生クラスでマウスイベントを取得しています。どのようにしたらWebBrowser上のJpegに線を引けますか?
その線は、ラインマーカーのようにできればありがたいのですが・・・

開発環境 VS2015 C# WinForm

C# Form1

1 public partial class Form1 : Form 2 { 3 private ExWebBrowser _WebBrowser; 4 private ExWebBrowser WebBrowser 5 { 6 [MethodImpl(MethodImplOptions.Synchronized)] 7 get 8 { 9 return _WebBrowser; 10 } 11 12 [MethodImpl(MethodImplOptions.Synchronized)] 13 set 14 { 15 if (_WebBrowser != null) 16 { 17 _WebBrowser.MouseDown -= WebBrowser_MouseDown; 18 _WebBrowser.MouseEnter -= WebBrowser_MouseEnter; 19 _WebBrowser.MouseLeave -= WebBrowser_MouseLeave; 20 _WebBrowser.MouseMove -= WebBrowser_MouseMove; 21 _WebBrowser.MouseOver -= WebBrowser_MouseOver; 22 _WebBrowser.MouseUp -= WebBrowser_MouseUp; 23 } 24 25 _WebBrowser = value; 26 if (_WebBrowser != null) 27 { 28 _WebBrowser.MouseDown += WebBrowser_MouseDown; 29 _WebBrowser.MouseEnter += WebBrowser_MouseEnter; 30 _WebBrowser.MouseLeave += WebBrowser_MouseLeave; 31 _WebBrowser.MouseMove += WebBrowser_MouseMove; 32 _WebBrowser.MouseOver += WebBrowser_MouseOver; 33 _WebBrowser.MouseUp += WebBrowser_MouseUp; 34 } 35 } 36 } 37 38 39 public Form1() 40 { 41 InitializeComponent(); 42 43 _WebBrowser = new ExWebBrowser(); 44 _WebBrowser._form1Instance = this; 45 } 46 47 [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 48 static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 49 50 [System.Runtime.InteropServices.DllImport("user32.dll")] 51 static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 52 53 private void Form1_Load(object sender, EventArgs e) 54 { 55  WebBrowser.Dock = DockStyle.Fill; 56 this.Controls.Add(WebBrowser); 57 WebBrowser.GoHome(); 58 }

C#

1 public partial class ExWebBrowser : WebBrowser 2 { 3 int prevX; 4 int prevY; 5 bool mouseDrag = false; 6 public Form1 _form1Instance; 7 8 private HtmlElement _Body; 9 10 private HtmlElement Body 11 { 12 [MethodImpl(MethodImplOptions.Synchronized)] 13 get 14 { 15 return _Body; 16 } 17 18 [MethodImpl(MethodImplOptions.Synchronized)] 19 set 20 { 21 if (_Body != null) 22 { 23 _Body.MouseDown -= Body_MouseDown; 24 _Body.MouseUp -= Body_MouseUp; 25 _Body.MouseEnter -= Body_MouseEnter; 26 _Body.MouseLeave -= Body_MouseLeave; 27 _Body.MouseMove -= Body_MouseMove; 28 _Body.MouseOver -= Body_MouseOver; 29 } 30 31 _Body = value; 32 if (_Body != null) 33 { 34 _Body.MouseDown += Body_MouseDown; 35 _Body.MouseUp += Body_MouseUp; 36 _Body.MouseEnter += Body_MouseEnter; 37 _Body.MouseLeave += Body_MouseLeave; 38 _Body.MouseMove += Body_MouseMove; 39 _Body.MouseOver += Body_MouseOver; 40 } 41 } 42 } 43 44 45 public new event MouseDownEventHandler MouseDown; 46 public new delegate void MouseDownEventHandler(MouseEventArgs e); 47 public new event MouseUpEventHandler MouseUp; 48 public new delegate void MouseUpEventHandler(MouseEventArgs e); 49 public new event MouseEnterEventHandler MouseEnter; 50 public new delegate void MouseEnterEventHandler(MouseEventArgs e); 51 public new event MouseLeaveEventHandler MouseLeave; 52 public new delegate void MouseLeaveEventHandler(MouseEventArgs e); 53 public new event MouseMoveEventHandler MouseMove; 54 public new delegate void MouseMoveEventHandler(MouseEventArgs e); 55 public new event MouseOverEventHandler MouseOver; 56 public new delegate void MouseOverEventHandler(MouseEventArgs e); 57 58 protected override void OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e) 59 { 60 Body = this.Document.Body; 61 base.OnDocumentCompleted(e); 62 } 63 64 private void Body_MouseDown(object sender, System.Windows.Forms.HtmlElementEventArgs e) 65 { 66 prevX = e.MousePosition.X; //(int)m.LParam & 0xFFFF; 67 prevY = e.MousePosition.Y; //((int)m.LParam >> 16) & 0xFFFF; 68 69 mouseDrag = true; 70 71 //MouseDown.Invoke(new MouseEventArgs(e.MouseButtonsPressed, 1, e.ClientMousePosition.X, e.ClientMousePosition.Y, 0)); 72 } 73 74 private void Body_MouseUp(object sender, System.Windows.Forms.HtmlElementEventArgs e) 75 { 76 mouseDrag = false; 77 78 //MouseUp.Invoke(new MouseEventArgs(e.MouseButtonsPressed, 1, e.ClientMousePosition.X, e.ClientMousePosition.Y, 0)); 79 } 80 81 private void Body_MouseEnter(object sender, System.Windows.Forms.HtmlElementEventArgs e) 82 { 83 //MouseEnter.Invoke(new MouseEventArgs(MouseButtons.None, 0, e.ClientMousePosition.X, e.ClientMousePosition.Y, 0)); 84 } 85 86 private void Body_MouseLeave(object sender, System.Windows.Forms.HtmlElementEventArgs e) 87 { 88 //MouseLeave.Invoke(new MouseEventArgs(MouseButtons.None, 0, e.ClientMousePosition.X, e.ClientMousePosition.Y, 0)); 89 } 90 91 private void Body_MouseMove(object sender, System.Windows.Forms.HtmlElementEventArgs e) 92 { 93 // マウスカーソルの位置座標を取得. 94 //int x = LOWORD(m.LParam); // LOWORD(lParam)でマウスカーソルの位置座標xを取得. 95 //int y = HIWORD(m.LParam); // HIWORD(lParam)でマウスカーソルの位置座標yを取得. 96 97 if (mouseDrag) 98 { 99 Pen pen = new Pen(Color.Orange, 10); 100 //Graphics g = this.CreateGraphics(); 101 Graphics g = _form1Instance.CreateGraphics(); 102 g.DrawLine(pen, prevX, prevY, e.MousePosition.X, e.MousePosition.Y); 103 g.FillEllipse(Brushes.Orange, prevX - pen.Width / 2, prevY - pen.Width / 2, pen.Width, pen.Width); 104 prevX = e.MousePosition.X; 105 prevY = e.MousePosition.Y; 106 107 pen.Dispose(); 108 g.Dispose(); 109 } 110 //MouseMove.Invoke(new MouseEventArgs(MouseButtons.None, 0, e.ClientMousePosition.X, e.ClientMousePosition.Y, 0)); 111 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

画像にではなくWebBrowserにですが、こちら、参考になりませんか?
Pictureboxの透過

または、WebBrowserをキャプチャして画像化し、その上に透明な画像を表示して線を引くとか・・・。

投稿2020/08/18 15:27

toyotaku

総合スコア103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byori

2020/08/19 07:06 編集

お世話になります。 FormやPictureBoxを透明にしてWebBrowser に合わせて線を引くというアイデアですが、試すとFormのOpacityを0にするとFormやPictureBox そのものも消えてしまうようで線が引けません。 Opacityを10%や20%にしておくと線が引けますが、その分薄いです。 Opacity を0に近づけるとその上にあるコントロールも同じように薄くなります。 そこにひく線も醜くなるのは仕方ないのでしょうか? あれ? よく見ると2つのフォームを・・・って書いてある。もう少し検討をしてみます
toyotaku

2020/08/19 14:14

そうですね。 元のフォームの上に、マウス操作のイベントを受け取る(ほぼ)透明なフォームと、描画するための透明なフォームを乗せる感じですね。 頑張ってください。
byori

2020/08/20 02:27

お世話になります。 おかげさまでうまくいきました。 C# のコードも載せておきます。 ありがとうございました。 ``` C# public partial class xxxxxxxxxxxForm : Form { public xxxxxxxxxxxForm() { InitializeComponent(); m_frmdummy = new Form(); // ダミーのフォーム内でクリックすると線の描画を開始できる // 画像描画用のフォーム内でのクリックでは線を描画できない m_parent = this; // parent; m_frmdummy.TransparencyKey = Color.Transparent; m_frmdummy.Owner = m_parent; m_frmdummy.Text = "これはダミー"; m_frmdummy.Opacity = 0.30; // Opacity = 0では上手くいかなかった。 m_frmdummy.Width = this.webBrowser1.Width; m_frmdummy.Height = this.webBrowser1.Height; m_frm.Owner = m_parent; m_frm.TransparencyKey = SystemColors.Control; m_frm.Text = "画像描画用Form"; m_frm.Width = this.webBrowser1.Width; m_frm.Height = this.webBrowser1.Height; } private Form m_frm = new Form(); private Form _m_frmdummy; private Form m_frmdummy { [MethodImpl(MethodImplOptions.Synchronized)] get { return _m_frmdummy; } [MethodImpl(MethodImplOptions.Synchronized)] set { if (_m_frmdummy != null) { _m_frmdummy.MouseMove -= m_frmdummy_MouseMove; } _m_frmdummy = value; if (_m_frmdummy != null) { _m_frmdummy.MouseMove += m_frmdummy_MouseMove; } } } private Form _m_parent; private Form m_parent { [MethodImpl(MethodImplOptions.Synchronized)] get { return _m_parent; } [MethodImpl(MethodImplOptions.Synchronized)] set { if (_m_parent != null) { _m_parent.LocationChanged -= m_parent_LocationChanged; } _m_parent = value; if (_m_parent != null) { _m_parent.LocationChanged += m_parent_LocationChanged; } } } // このメソッドを外部から呼び出す public void ShowForm() { m_frmdummy.Show(); m_frm.Show(); // 描画用フォームの初期位置 Point posi = new Point(this.splitContainer1.SplitterDistance + this.webBrowser1.Left, this.webBrowser1.Top); m_frm.Location = m_parent.PointToScreen(posi); m_frmdummy.Location = m_parent.PointToScreen(posi); } private Point m_position; private void m_frmdummy_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { using (Graphics g = m_frm.CreateGraphics()) { if (e.Button == MouseButtons.Left) { Point p = m_frmdummy.PointToClient(Cursor.Position); Pen pen = new Pen(Color.Orange, 10); g.DrawLine(pen, m_position, p); g.FillEllipse(Brushes.Orange, p.X - pen.Width / 2, p.Y - pen.Width / 2, pen.Width, pen.Width); m_position = p; pen.Dispose(); } else { m_position = m_frmdummy.PointToClient(Cursor.Position); } } } protected override void OnLocationChanged(EventArgs e) { m_parent_LocationChanged(null, null); base.OnLocationChanged(e); } protected override void OnSizeChanged(EventArgs e) { m_frm.Size = this.Size; if (m_frmdummy != null) m_frmdummy.Size = this.Size; base.OnSizeChanged(e); } private void m_parent_LocationChanged(object sender, EventArgs e) { if (m_parent != null && m_parent != null) { Point posi = new Point(this.splitContainer1.SplitterDistance + this.webBrowser1.Left, this.webBrowser1.Top); m_frm.Location = m_parent.PointToScreen(posi); } if (m_frmdummy != null && m_parent != null) { Point posi = new Point(this.splitContainer1.SplitterDistance + this.webBrowser1.Left, this.webBrowser1.Top); m_frmdummy.Location = m_parent.PointToScreen(posi); } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問