[C#]モーダルダイアログとモードレスダイアログ
モーダルダイアログとモードレスダイアログ
[環境]
VisualStudio2008
C# Windowsフォームアプリケーション
マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!
2つのフォーム(Form1、Form2)を用意し、一方(今回はForm2)をモーダルまたは
モードレスダイアログとして表示する。
[Form1側]
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// モーダルダイアログ
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
using (Form2 dlg = new Form2("モーダル"))
{
dlg.ShowDialog(this);
}
}
/// <summary>
/// モードレスダイアログ
/// </summary>
private void button2_Click(object sender, EventArgs e)
{
Form2 dlg = new Form2("モードレス");
dlg.Show(this);
}
}
[Form2側]
public partial class Form2 : Form
{
public Form2(string str)
{
InitializeComponent();
label1.Text = str;
}
}
モーダルとして表示するときは「ShowDialog()」、モードレスとして表示するときは
「Show()」メソッドを使用する。
各々のメソッドに「this」を渡しているのは、Form1がForm2のオーナーである
ことを意味するため。
これにより、Form2がForm1より下に表示されることがなくなる。
(特にモードレスの際)
注意すべき点は、FormクラスがIDisposableを実装しているということ。
モードレスダイアログを何回も起動してDisposeを行わないと、そのうちメモリがなくなる。
[C#]多重起動の抑止
多重起動を抑止する
[環境]
VisualStudio2008
C# Windowsフォームアプリケーション
マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!
Program.cs の最初に以下のようなコードを書く。
static class Program
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
if (IsAlreadyStarted()) return;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
/// <summary>
/// 多重起動制御
/// </summary>
/// <returns>true:起動中/false:起動していない</returns>
static private bool IsAlreadyStarted()
{
string thisProcess = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
if (System.Diagnostics.Process.GetProcessesByName(thisProcess).Length > 1)
{
return true;
}
return false;
}
}
[C#]ファイルドロップ起動
アプリケーションのアイコンにファイルをドラッグして起動する
[環境]
VisualStudio2008
C# Windowsフォームアプリケーション
マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!
ファイルをドロップすることで、ドロップしたファイルをアプリへの引数として
渡すことができる。
上記イメージは、test.exeに対してtest.pdbをドロップさせ、起動したもの。
起動したフォームにはコマンド引数を表示させている。
public partial class Form1 : Form
{
private string[] _cmd = System.Environment.GetCommandLineArgs();
public Form1()
{
InitializeComponent();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
using (Brush br = new SolidBrush(Color.Black))
{
e.Graphics.DrawString(_cmd[0], Font, br, 0, 0);
try
{
e.Graphics.DrawString(_cmd[1], Font, br, 0, 10);
}
catch (IndexOutOfRangeException)
{
}
}
}
}
[C#]スクリーンサイズの取得
スクリーンサイズを取得する
[環境]
VisualStudio2008
C# Windowsフォームアプリケーション
マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!
スクリーンサイズを取得し、フォームに表示してみた。
private void Form1_Paint(object sender, PaintEventArgs e)
{
Rectangle screen = Screen.PrimaryScreen.Bounds;
using (Brush br = new SolidBrush(Color.Black))
{
e.Graphics.DrawString(screen.Width.ToString(), Font, br, 0, 0);
e.Graphics.DrawString(screen.Height.ToString(), Font, br, 0, 10);
}
}
[C#]MenuStripドロップダウンアイテムのチェック切り替え
MenuStrip内のリストのチェック状態を切り替える
[環境]
VisualStudio2008
C# Windowsフォームアプリケーション
上記のように、「テスト」メニューが「テスト1」をもち、その「テスト1」がさらに
「サブアイテムX」の3つのアイテムをもっているとき、チェック状態を排他的に
切り替える(ラジオボタンのように扱う)方法。
各アイテムがクリックされたときに、全てのサブアイテムにたいして
Checkedプロパティをtrue/falseで切り替えるのは美しくないので
メソッドにまとめる。
そんなことするヤツいねーよと言われるかも知れないが、コレを調べだすまでは
上記の方法でやっていた。
実現したときはちょっとした感動。つか、Frameworkで対応しろよ。
マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!
[デザイナ]
テスト1
Name:_menuTest1
サブアイテム1
Name:_menuSub1
サブアイテム2
Name:_menuSub2
CheckOnClick:true
サブアイテム3
Name:_menuSub3
[コード]
_menuSub1/2/3 の 「Click」クリックイベントハンドラと、それらを排他的に切り替える
メソッド、「SelectCheckedItem(適当な名前)」を用意する。
/// サブアイテム1Clickイベントハンドラ
private void _menuSub1_Click(object sender, EventArgs e)
{
SelectCheckedItem(sender);
}
/// サブアイテム2Clickイベントハンドラ
private void _menuSub2_Click(object sender, EventArgs e)
{
SelectCheckedItem(sender);
}
/// サブアイテム3Clickイベントハンドラ
private void _menuSub3_Click(object sender, EventArgs e)
{
SelectCheckedItem(sender);
}
/// チェック状態切り替え
private void SelectCheckedItem(object sender)
{
foreach (ToolStripMenuItem item in _menuTest1.DropDownItems)
{
if (item.Equals(sender))
{
item.Checked = true;
}
else
{
item.Checked = false;
}
}
}
サブアイテムを3つもつ、親のToolStripMenuItemである_menuTest1がもつ
プロパティ、DropDownItemsをforeachでまわして、チェックされたオブジェクトと
等しかったらチェックを有効にしている。