スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【C#】自作ポップアップを表示する

2010年10月24日 00:18

右クリックしたら表示されるコンテキストメニューだと
限られたコントロールしか配置できないからな~

っと思ったのでいろいろなコントロール載せられる
方法を少し試してみた。

↓こんなの
ポップアップサンプル01
※枠をクリックしたらポップアップが表示されて、
バーを調整すると色が変わるだけのプログラムです。
1.ポップアップフォームを作る。
  デザイナで枠なしフォームを作る。
 ポップアップサンプル01_ポップアップデザイナ部分

2.ポップアップを表示させるクリックイベントの作成


※1
//ポップアップ作成用のコントロール
ToolStripDropDown popup = new ToolStripDropDown();
popup.Margin = Padding.Empty;
popup.Padding = Padding.Empty;

※2
//TopLevelプロパティをFalseにしないとAddできない。
MyPopup frm2 = new MyPopup(ColorPanel);
frm2.TopLevel = false;

※3
//通常のコントロールをToolStrip派生コントロールとして動作させるためのホストする。
ToolStripControlHost host = new ToolStripControlHost(frm2);
host.Margin = Padding.Empty;
host.Padding = Padding.Empty;

※4
//ホストされたコントロールをToolStripoDropDownへ登録する。
popup.Items.Add(host);

//マウスの位置にポップアップ表示
popup.Show(new Point(MousePosition.X, MousePosition.Y));


※1 ポップアップを作るときは、ToolStripDropDownコントロールを使う。

※2 フォームは通常TopLevelコントロール(?)みたいなので
   TopLevelプロパティをFalseにする必要があるよう。
   Trueのままだと、別のコントロールに乗せるとかいうのができないみたい。

※3 よくわからなかったけど、通常のコントロールをToolStripDropDownに乗せるために
   ToolStrip派生型に変換してるみたいな認識かと・・・

※4 ToolStripDropDownコントロールに載せれる形になったコントロールをAddで登録する。
   そしたら、show()メソッドでポップアップを表示できる。

↓ポップアップフォーム側のソース

public partial class MyPopup : Form
{
//呼び出し元受け取りコントロール
private Control BCtl;

//色設定用プロパティ
private Byte R = 0;
private Byte G = 0;
private Byte B = 0;

public MyPopup()
{
InitializeComponent();
BCtl = null;

//イベントの設定
HBG.Scroll += HScrollBar_ScrollChange;
HBR.Scroll += HScrollBar_ScrollChange;
HBB.Scroll += HScrollBar_ScrollChange;
}

//呼び出し元のコントロールを取得
public MyPopup(Control ctl):this()
{
BCtl = ctl;
}

//Mypopupの表示時処理
private void Form2_Load(object sender, EventArgs e)
{
if (BCtl != null)
{
Color cl = BCtl.BackColor;

//呼び出し元の現在の色を設定
HBR.Value = cl.R;
HBG.Value = cl.G;
HBB.Value = cl.B;

//ラベル設定
lblG.Text = HBG.Value.ToString();
lblR.Text = HBR.Value.ToString();
lblB.Text = HBB.Value.ToString();
}
else
{

//呼び出し元の現在の色を設定
HBR.Value = 0;
HBG.Value = 0;
HBB.Value = 0;

//ラベル設定
lblG.Text = HBG.Value.ToString();
lblR.Text = HBR.Value.ToString();
lblB.Text = HBB.Value.ToString();
}

}

/// スクロールバーが変化したときのイベント
private void HScrollBar_ScrollChange(object sender, EventArgs e)
{
//色設定用
Color ResultColor;

var scb = (HScrollBar)sender;

switch (scb.Name)
{
case "HBR":
R = (byte)scb.Value;
lblR.Text = R.ToString();
break;
case "HBG":
G = (byte)scb.Value;
lblG.Text = G.ToString();
break;
case "HBB":
B = (byte)scb.Value;
lblB.Text = B.ToString();
break;

}


//呼び出し元に色を適用
ResultColor = Color.FromArgb(R, G, B);

BCtl.BackColor = ResultColor;
}

}


普通のフォームでのイベント実装とやってること同じ。
ただ、コンストラクタで呼び出し元のコントロールを取得してきて、
チェンジイベント時に、色の値を呼び出し元のコントロールに設定してるだけ。

実際、自分でもそれほど理解して作ってるわけじゃないから
認識として間違っていたり、もうちょっとましな作り方があるだろって
のがある人は指摘してもらえると助かります。

【2010/10/30追記】
ポップアップ側のボタンクリックなどのイベントでポップアップで終了する場合
this.Close()でポップアップフォームを終了しても
ポップアップフォームの枠が消えずに残ってしまう現象がある。

対応策として、ボタンクリックにより呼び出し元の画面のいずれかに反映させたい
ということがほとんどのことから

ボタンクリックと同時に変更されるコントロールのChangeイベントに
下記ソースを追加することにより対応

//テキストが変化したらポップアップを閉じる
if (popup != null)
{
this.popup.Close(ToolStripDropDownCloseReason.CloseCalled);
}





今回のサンプル
http://www.mediafire.com/?qn3veabc3f3faym

参考にしたサイト
http://www.codeproject.com/KB/miscctrl/simplepopup.aspx
http://msdn.microsoft.com/ja-jp/library/ak1x5x7e.aspx


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://individualmemo.blog104.fc2.com/tb.php/19-2e5ac511
    この記事へのトラックバック



    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。