C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: エリア枠の表示方法


(過去ログ 141 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■82594 / inTopicNo.1)  エリア枠の表示方法
  
□投稿者/ 夜叉丸 (39回)-(2017/01/20(Fri) 10:07:22)

分類:[.NET 全般] 

デスクトップでマウスをクリックして
クリックしたままマウスを移動すると
エリアが表示されますよね。

これってどうやってするのでしょうか?

前回 Capture = true を使用してフォーム外のマウスを
取得しようとしたのですが、うまくいきませんでした
マウスをクリックすると Capture が false になったり
最悪PCの操作自体できなくなったりして
うまく使いこなせませんでした。

なので、タイマーを使ってマウスの位置やボタンを監視して
マウスのダウン(開始点)とマウスアップ(終了点)
を取得することはできるようになったのですが、
この時選択しているエリアを表示する方法がわかりません。

参考になるサイトも探したのですが、見つけられませんでした。
どうすればよいのでしょうか?



引用返信 編集キー/
■82595 / inTopicNo.2)  Re[1]: エリア枠の表示方法
□投稿者/ kaina (23回)-(2017/01/20(Fri) 11:06:58)
こんな感じで。

1.MouseDownイベントで開始点の座標を記録する。
2.MouseMoveイベントでカーソル位置の座標を記録し、開始点からの座標を計算し、描画する。
3.MouseUpイベントでMouseを離した座標を記録し、開始点からの座標を計算し、描画する。

引用返信 編集キー/
■82596 / inTopicNo.3)  Re[2]: エリア枠の表示方法
□投稿者/ 夜叉丸 (40回)-(2017/01/20(Fri) 11:37:32)
No82595 (kaina さん) に返信

回答ありがとうございます。
既に位置情報は取得できています。

スクリーン上にエリアの枠を描画するための方法がわからないのです。

PictureBox 上であれば、表示するエリア
1.枠表示する元のBMPを取得
2.DrawRectangleで枠を表示
3.移動中は元のBMPを描画して、DrawRectangleで枠を表示

のようなやり方でできるような気がするのですが

どうもすみませんでした。
引用返信 編集キー/
■82598 / inTopicNo.4)  Re[3]: エリア枠の表示方法
□投稿者/ kaina (24回)-(2017/01/20(Fri) 11:46:00)
PictureBoxであれば、夜叉丸さんが書かれているような感じで出来ます。
出来るような気がするではなく、実際にやってみましょう。
引用返信 編集キー/
■82629 / inTopicNo.5)  Re[3]: エリア枠の表示方法
□投稿者/ Jitta (265回)-(2017/01/21(Sat) 14:57:49)
No82596 (夜叉丸 さん) に返信

「ラバーバンド c#」で検索。


> PictureBox 上であれば、表示するエリア
> 1.枠表示する元のBMPを取得

元の Bitmap に描いてしまったら、消せないよね。

引用返信 編集キー/
■82638 / inTopicNo.6)  Re[3]: エリア枠の表示方法
□投稿者/ 魔界の仮面弁士 (1073回)-(2017/01/23(Mon) 11:20:47)
No82596 (夜叉丸 さん) に返信
> スクリーン上にエリアの枠を描画するための方法がわからないのです。

ControlPaint.DrawReversibleFrame メソッドで描画してみました。
今回は PictureBox 領域内に限定していますが、自フォーム外の座標も指定できます。

public partial class Form1 : Form
{
  Point posMouseDown, posMouseUp;
  public Form1()
  {
    InitializeComponent();
    pictureBox1.MouseDown += (object sender, MouseEventArgs e) =>
    {
      if (e.Button == MouseButtons.Left)
      {
        posMouseDown = MousePosition;
      }
    };
    pictureBox1.MouseMove += (object sender, MouseEventArgs e) =>
    {
      if (e.Button == MouseButtons.Left)
      {
        posMouseUp = MousePosition;
        ((Control)sender).Refresh();
        DrawRegion(posMouseDown, posMouseUp, FrameStyle.Dashed);
      }
    };
    pictureBox1.MouseUp += (object sender, MouseEventArgs e) =>
    {
      if (e.Button == MouseButtons.Left)
      {
        ((Control)sender).Refresh();
        DrawRegion(posMouseDown, posMouseUp, FrameStyle.Thick);
      }
    };
  }
  private void DrawRegion(Point start, Point end, FrameStyle style)
  {
    Rectangle rect = new Rectangle(
      Math.Min(start.X, end.X), Math.Min(start.Y, end.Y),
      Math.Abs(start.X - end.X), Math.Abs(start.Y - end.Y)
    );
    rect.Intersect(pictureBox1.RectangleToScreen(pictureBox1.ClientRectangle));
    ControlPaint.DrawReversibleFrame(rect, Color.Black, style);
  }
}



No82594 (夜叉丸 さん) に返信
> クリックしたままマウスを移動すると
ドラッグのことでしょうか?


> エリアが表示されますよね。
> これってどうやってするのでしょうか?
Desktop の実体は ListView であり、ListView 自体に
ドラッグで描画するための仕組みが用意されていますね。


> 前回 Capture = true を使用してフォーム外のマウスを
> 取得しようとしたのですが、うまくいきませんでした

「前回」と言うと、No82429 のことでしょうか。

[2017/01/10 15:38:18] No82429 : フォーム外のクリックでフォームを閉じたい
[2017/01/11 18:05:14] No82488 : フォームタイトルバーのマウスイベント取得について
[2017/01/19 08:39:48] No82583 : QRコードの読取について
[2016/12/08 17:41:11] No82082 : 違いはなんなのでしょうか?
[2016/12/07 17:20:15] No82077 : 複数選択するにはどうすればよいのでしょうか?


たとえば、ComboBox のドロップダウンリストや、ツールチップなどのように、
フォームの外がクリックされた時にフォームを閉じたいというのなら、
Deactivate イベントで代用できるかもしれません。
 var f = new Form2();
 f.FormClosing += delegate { this.Activate(); };
 f.Deactivate += delegate { f.Close(); };
 f.Show(this);
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -