- PR -

デザイナのような縁取り。

投稿者投稿内容
はたけ
常連さん
会議室デビュー日: 2006/02/08
投稿数: 27
投稿日時: 2009-02-13 20:40
お世話になります。

C#でフォームのデザイン時に
フォームに配置しているオブジェクトを押下すると、
選択されているオブジェクトが一目でわかるような縁取りがされます。

このような効果をプログラム内で、表示されているオブジェクトに対して、
行いたい場合、どのような手段があるのでしょうか?
簡単に行えるのでしょうか?

選択されているオブジェクトの背景色を変えるとか、枠線を変えるとかではなく、
デザイナのような選択表示をしたいです。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-13 21:19
具体的にどうしたいのですか?
選択したコントロールの周りに点線を付けたいのでしょうか。
はたけ
常連さん
会議室デビュー日: 2006/02/08
投稿数: 27
投稿日時: 2009-02-13 21:28
ありがとうございます。
はい。点線をつけるだけでもかまいません。

欲を言えば、デザイナと全く同じ様にできればベターです。

ぱっと見で選択されていることがわかれば良いと思っています。
しかし先にも書きましたが、選択オブジェクトそのものには、
手を入れたくないです。(オブジェクトそのものの背景色や枠線の変更)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2009-02-13 21:38
引用:

はたけさんの書き込み (2009-02-13 20:40) より:
このような効果をプログラム内で、表示されているオブジェクトに対して、
行いたい場合、どのような手段があるのでしょうか?
簡単に行えるのでしょうか?


いわゆる「ラバーバンド(Rubber Band)」と言われる処理になり、この用語で検索すると見つけやすいと思います。あとは用語としてはピッカーとかトラッカーなどでしょうか。

ただ、使いやすいライブラリーなどは普通はないように思います。みなさんは自分で、地道に描画され、マウスの操作に対する応答をコーディングされることが多いようです。
最近の動向は知りませんが、ただ、そういうライブラリーも市販はされていないこともなかったと思います。もしかしたら Visual Studio などにそういう機能が付いていたりする可能性もひょっとしたらあるかもしれませんが、たぶんないと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2009-02-13 21:43
たとえば、

件名:C#
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=20938&forum=7

などが近い話題だと思います。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-13 21:48
> はい。点線をつけるだけでもかまいません。
> 欲を言えば、デザイナと全く同じ様にできればベターです。

点線以外というとコントロールのサイズを変更する為の小さい四角などがありますが
これらも付けたいという事ですか?

> ぱっと見で選択されていることがわかれば良いと思っています。
> しかし先にも書きましたが、選択オブジェクトそのものには、
> 手を入れたくないです。(オブジェクトそのものの背景色や枠線の変更)

何か矛盾している様な気がしますが・・・。
何もせずにオブジェクトに変化を持たせるのですか?
オブジェクトそのもののプロパティも変えてはダメなのですよね。
(背景色や枠線の変更がダメなのなら)
オブジェクトそのものではなく何になら手を加えても良いのでしょうか。

コントロールの周りに点線を描画すれば良いだけとか?
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-13 21:49
こういう事?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30342&forum=7&start=0
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2009-02-14 11:39
引用:

はたけさんの書き込み (2009-02-13 20:40) より:
このような効果をプログラム内で、表示されているオブジェクトに対して、
行いたい場合、どのような手段があるのでしょうか?



そのまんまコントロールの外周に枠線を表示するとか。
以下は一例です。Enterイベントを使ってそのとき
フォーカスのあるコントロールの外周に枠線を表示します。
(ただし、このコードの場合、DomainUpDownコントロールのような
自分のコントロールの構成上で、Control.Controlsを使ってしまっているコントロールには期待通りに動作しません。何らかの対策を考えねばなりません)

コード:

using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Diagnostics;

namespace YKSample
{
public partial class Form1 : Form
{
/// <summary>
/// 枠線とコントロールのマージン
/// </summary>
private const int BandMargin = 3;
/// <summary>
/// 現在フォーカスを持っているコントロール
/// </summary>
private Control current;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.current = null;
this.AttachEnterEvent(this);
}

private void AttachEnterEvent(Control parent)
{
foreach (Control child in parent.Controls)
{
child.Enter += EnterEventHandler;
Debug.WriteLine(child); // Enterとの紐づけの確認用
this.AttachEnterEvent(child);
}
}

private void EnterEventHandler(object sender, EventArgs e)
{
Control c = (Control)sender;
Debug.Write("Enter "); Debug.WriteLine(c); // Enterイベントの発生状況確認用
if (current == c) return;

if (current != null)
{
current.Parent.Paint -= PaintEventHandler;
}
current = c;
current.Parent.Paint += PaintEventHandler;
this.Invalidate();
}

private void PaintEventHandler(object sender, PaintEventArgs e)
{
Rectangle rect = this.current.Bounds;
rect.Inflate(BandMargin, BandMargin);

using (Pen p = new Pen(Color.Black))
{
p.DashStyle = DashStyle.Dot;
e.Graphics.DrawRectangle(p, rect);
}

// 取っ手の四角。不要なら以下は省く
this.DrawHandle(e.Graphics, rect.Left, rect.Top);
this.DrawHandle(e.Graphics, rect.Left, rect.Bottom);
this.DrawHandle(e.Graphics, rect.Right, rect.Top);
this.DrawHandle(e.Graphics, rect.Right, rect.Bottom);
this.DrawHandle(e.Graphics, (rect.Left + rect.Right) / 2, rect.Top);
this.DrawHandle(e.Graphics, (rect.Left + rect.Right) / 2, rect.Bottom);
this.DrawHandle(e.Graphics, rect.Left, (rect.Top + rect.Bottom)/2);
this.DrawHandle(e.Graphics, rect.Right, (rect.Top + rect.Bottom) / 2);
}

private void DrawHandle(Graphics g, int x, int y)
{
int size = BandMargin - 1;
Rectangle rect = new Rectangle(x - size, y - size, size * 2, size * 2);
g.FillRectangle(Brushes.White, rect);
g.DrawRectangle(Pens.Black, rect);
}

}
}




[ メッセージ編集済み 編集者: よねKEN 編集日時 2009-02-14 11:41 ]

スキルアップ/キャリアアップ(JOB@IT)