Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
windows form でキーを押しながらマウス操作を取得したいです
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30670#CommentId84844
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2021/11/16 20:28:26
解決はしているようですが、元コードについて気になった点を。
本題から外れますが、蛇足までに。
マウスイベントのところ:
> Private Sub Form1_MouseUp(…) Handles MyBase.MouseDown
ハンドラ名とイベント名が不一致なので誤解の元になりそうです。
> Me.CreateGraphics.FillEllipse(Brushes.Red, x - 5, y - 5, 10, 10)
Graphics を Dispose し忘れていますよ。
Click イベント の方では Dispose されているのですけれどね。
ちなみに、CreateGraphics で描いた内容は、フォームの最小化やリサイズなどといった要因で容易に消えてしまいますし、描画アイテム数が多い場合には、描画経過が表示されてちらつくことがあります。
永続的な描画が必要な場合には、CreateGraphics 以外の手法が使われることが多いです。
案1) BackgroundImage (PictureBox な Image でも可)に Bitmap を設定しておき、
その Bitmap に対して描画するようにする。(Bitmap の描画後には Invalidate メソッドを呼ぶ)
案2) 描画すべき座標をすべて覚えておき、Paint イベントで e.Graphics に再描画する
もし、CreateGraphics を使った場合でもちらつきを減らしたい場合には、
BufferedGraphics クラスを併用することで、ダブルバッファリングが可能になります。
https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/advanced/how-to-manually-render-buffered-graphics?view=netframeworkdesktop-4.8
キーイベントのところ:
> k = e.KeyCode
ではなく、「k = e.KeyCode.ToString("G")」とした方が良いですね。
そうすれば、Option Strict On の時にもエラーになりません。
列挙型の場合、"G" 書式以外には、"F"、"D"、"X" 書式が使えます。
e.KeyCode.ToString() は e.KeyCode.ToString("G") と同義です。
それと、KeyDown 時に MsgBox を表示していますが、このような確認方法をとると、
その後の KeyUp イベントを取りこぼしてしまう可能性が高くなるので、あまりお奨めしません。
マウスやキーボード操作を追跡する場合、メッセージボックスを表示すると、
処理が割り込まれてしまうため、本来のイベント処理が滞ってしまいがちです。
連続したイベント処理に対する一時的な確認が必要な場合には、
Me.Text = $"MouseUp:{e.Button} , {e.Location}"
のように、タイトルバーや Label などに記載する方が良いでしょう。
履歴をとりたい場合は、ListBox に書き連ねたり、Debug.WriteLine を使うのも便利です。