[VC2005] スクリーンセーバーのプレビュー画面に画像を表示する方法
◆概要
この資料は、Microsoft(R) Visual C# 2005で スクリーンセーバーのプレビュー画面に画像を表示する方法について記述しています。
プレビュー画面に写真などの画像を表示する方法です。プレビュー画面とは画面のプロパティの[スクリーンセーバー]タブに表示されるディスプレイの中の画像のことです。
スクリーンセーバーの作り方はスクリーンセーバーを作る方法を参照してください。
◆Contents
1.画像を保存するフォルダの準備
2.画像をプロジェクトのフォルダに登録する
3.クラスの追加
4.Main プログラムの変更
5.Form1のコード
6.オプション画面
7.ソースコードのダウンロード
1.画像を保存するフォルダの準備
ソリューションエクスプローラのプロジェクト名を右クリックし、表示されたショートカットメニューから[追加]-[新しいフォルダ]を選択し、フォルダを追加します。
追加されたフォルダ名を適当な名前、ここではフォルダ名を「Bitmaps」にしています。
▼ページトップへ
◆2.画像をプロジェクトのフォルダに登録する
プレビュー画面に表示したい画像を追加します。上記1.で追加したフォルダ名を右クリックし、表示されたショートカットメニューの[追加]-[既存の項目] をクリックします。
「既存項目の追加」ダイアログボックスが表示されますので、「ファイルの種類」をイメージファイルにして、登録したい画像を選択していきます。
ここでは複数の画像(frn02.gif、frn03.gif、frn07.gif、frn11.gifの4つ)を登録します。
登録された画像
ソリューションエクスプローラのBitmapsフォルダに画像が登録されたら、それぞれの画像のビルドアクションプロパティを「埋め込まれたリソース」に変更します。
3.クラスの追加
クラスを追加します。クラスを追加するには、メニューの[プロジェクト]-[クラスの追加]をクリックします。
クラスのファイル名を「PaintThread.cs」にします。
追加されたクラスに次のコードを入力します。画像のファイル名は適時変更してください。
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace CSSaver3 { class PaintThread { IntPtr parentWindow; private PaintThread() { } public PaintThread(IntPtr parent) { parentWindow = parent; } public void Run() { while (IsWindow(parentWindow) && ! IsWindowVisible(parentWindow)) Thread.Sleep(50); if (IsWindow(parentWindow)) { //2回に1回は表示する画像 Bitmap bm1 = new Bitmap( typeof(Form1), "Bitmaps.frn02.gif"); //透過色の指定 bm1.MakeTransparent(Color.Black); //ランダムに表示する画像の変数を準備 Bitmap bmCPian = null; //乱数の準備 Random r = new Random(); //変数の宣言 bool bTos = true; RECT rc = new RECT(); if (GetClientRect(parentWindow, ref rc)) { while (IsWindow(parentWindow) && IsWindowVisible(parentWindow)) { using (Graphics g = Graphics.FromHwnd(parentWindow)) { if (null != g) { if (bTos) { //画面を黒でクリア Blackは適当に変更して可 g.Clear(Color.Black); g.DrawImage(bm1, rc.Left, rc.Top, rc.Width, rc.Height); } else { if (bmCPian != null) bmCPian.Dispose(); //ランダムに表示する画像を変数にセット switch (r.Next(3)) { case 0: bmCPian = new Bitmap(typeof(Form1), "Bitmaps.frn03.gif"); break; case 1: bmCPian = new Bitmap(typeof(Form1), "Bitmaps.frn07.gif"); break; case 2: bmCPian = new Bitmap(typeof(Form1), "Bitmaps.frn11.gif"); break; } //プレビュー画面にランダムに画像を表示する g.DrawImage(bmCPian, rc.Left, rc.Top, rc.Width, rc.Height); Application.DoEvents(); } bTos = !bTos; Thread.Sleep(500); } } Thread.Sleep(250); } } //アプリケーションを終了します Application.Exit(); } } #region WIN32 Interop [StructLayout(LayoutKind.Sequential)] private struct RECT { public int left; public int top; public int right; public int bottom; public int Left { get { return left; } } public int Top { get { return top; } } public int Right { get { return right; } } public int Bottom { get { return bottom; } } public int Width { get { return right - left; } } public int Height { get { return bottom - top; } } } [DllImport("user32.dll")] private static extern bool IsWindow(IntPtr hWnd); [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll")] private static extern bool GetClientRect( IntPtr hWnd, ref RECT rect); #endregion } } |
▼ページトップへ
◆4.Main プログラムの変更
Mainプログラムに変更を加えます。
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Diagnostics; namespace CSSaver3 { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); IntPtr hWnd = IntPtr.Zero; if (args.Length != 0) { //プレビュー if (args[0].ToLower() == "/p") { hWnd = (IntPtr) uint.Parse(args[1]); if (IntPtr.Zero != hWnd) { //スレッドを作成します System.Threading.Thread thread = new System.Threading.Thread( new System.Threading.ThreadStart( new PaintThread(hWnd).Run)); //スレッドをスタートさせます thread.Start(); //スレッドが終了するまで、 //呼び出し元のスレッドをブロックします thread.Join(); //スレッドの強制終了 thread.Abort(); //アプリケーションの終了 Application.Exit(); } } //オプション画面の表示 else if (args[0].ToLower().Trim().Substring(0, 2) == "/c") { Application.Run(new frmOption()); Application.Exit(); } //通常モード else if (args[0].ToLower() == "/s") { Application.Run(new Form1()); Application.Exit(); } //パスワードモード else if (args[0].ToLower() == "/a") { MessageBox.Show("パスワードモードには対応していません。", "C# Saver", MessageBoxButtons.OK, MessageBoxIcon.Information); Application.Exit(); } else { Application.Exit(); } } else { //ファイルをダブルクリックしたとき Application.Run(new Form1()); Application.Exit(); } } } } |
これで画像が次々にプレビュー画面に表示されます。
▼ページトップへ
◆5.Form1のコード
ついでに、メインのスクリーンセーバー画面も同じようにしてみます。 Form1にタイマー(time1)を追加し、Enableプロパティをtrueに、Intervalプロパティを10000(10秒)に設定します。Intervalプロパティを1000にすれば、1秒ごとに変化しますが、通常は10秒(10000ミリ秒)にした方がそれらしくなります。
Form1のコードを次のようにします。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace CSSaver3 { public partial class Form1 : Form { //マウスの位置を代入するための変数 private Point MouseXY; //ピクチャボックスの移動範囲を格納する変数 private Rectangle VisibleRect; //ランダムな数値を発生させる変数 private Random rand; public Form1() { InitializeComponent(); //コントロールボックスを表示しないように //FormBorderStyleをNoneに設定 this.FormBorderStyle = FormBorderStyle.None; //フォームのバックカラーを黒に設定 this.BackColor = Color.Black; //ピクチャボックスに画像を表示(埋め込まれた画像を取り出す) Bitmap bit_map1 = new Bitmap(typeof(Form1), "Bitmaps.frn02.gif"); pictureBox1.Image =bit_map1; } private void Form1_Load(object sender, EventArgs e) { this.Bounds = Screen.PrimaryScreen.Bounds; //ピクチャボックスの移動範囲を変数に代入 VisibleRect = new Rectangle( 0, 0, Bounds.Width - pictureBox1.Width, Bounds.Height - pictureBox1.Height); //ピクチャボックスの位置をランダムに設定 rand = new Random(); pictureBox1.Location = new Point(rand.Next(VisibleRect.Width) , rand.Next(VisibleRect.Height)); //マウスカーソルを非表示にする Cursor.Hide(); //フォームを最前面に設定 TopMost = true; //レジストリの読み出し Common.LoadSettings(); //タイマーのインターバルのセット timer1.Interval = Common.Settings.intChgSpeed; //このフォームの背景色のセット this.BackColor = Common.Settings.BGColor; } private void Form1_MouseClick(object sender, MouseEventArgs e) { this.Close(); } private void Form1_KeyDown(object sender, KeyEventArgs e) { this.Close(); } private void OnMouseMove(object sender, MouseEventArgs e) { if (!MouseXY.IsEmpty) { if (MouseXY != new Point(e.X, e.Y)) Close(); if (e.Clicks > 0) Close(); } MouseXY = new Point(e.X, e.Y); } //乱数の準備 Random random = new Random(); private void timer1_Tick(object sender, EventArgs e) { //ランダムに表示する画像の変数を準備 Bitmap bmpRand = null; //ランダムに表示する画像を変数にセット switch (random.Next(4)) { case 0: // 埋め込み画像からデータを取り出す bmpRand = new Bitmap(typeof(Form1), "Bitmaps.frn02.gif"); break; case 1: bmpRand = new Bitmap(typeof(Form1), "Bitmaps.frn03.gif"); break; case 2: bmpRand = new Bitmap(typeof(Form1), "Bitmaps.frn07.gif"); break; case 3: bmpRand = new Bitmap(typeof(Form1), "Bitmaps.frn11.gif"); break; } //ピクチャボックスに画像を表示 pictureBox1.Image = bmpRand; //timer1で設定した時間がきたら //ピクチャボックスの位置をランダムに変更 pictureBox1.Location = new Point(rand.Next(VisibleRect.Width) , rand.Next(VisibleRect.Height)); //バッファが割り当てられていてまだ破棄されていない場合に //現在のグラフィックス バッファを破棄します。 pictureBox1.Invalidate(); } } } |
▼ページトップへ
◆6.オプション画面
画面のプロパティで[設定]ボタンを押したとき、オプションを表示するようにします。画面の切り替えスピードと背景色を設定できます。
また、製品名、バージョン、会社名も表示します。
次の画面のようにコントロールを配置します
ラベル | lblSpeed | 切り替えスピード |
label1 | 背景色 | |
label2 | 1sec | |
label3 | 10sec | |
lblSpd | 設定時間 | |
lblProductName | lblPriductName | |
lblVer | lblVersion | |
lblCampany | lblCampany | |
ボタン | btnOK | &OK |
トラックバー | trackBar1 | |
コンボボックス | cmbColors |
オプション画面(frmOption)のコード
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Design; namespace CSSaver3 { public partial class frmOption : Form { public frmOption() { InitializeComponent(); } private void frmOption_Load(object sender, EventArgs e) { //ラベルの設定 // バージョン名(AssemblyInformationalVersion属性)を取得 string appVersion = Application.ProductVersion; // 製品名(AssemblyProduct属性)を取得 string appProductName = Application.ProductName; // 会社名(AssemblyCompany属性)を取得 string appCompanyName = Application.CompanyName; //上記で取得した情報をラベルにセット lblProductName.Text = appProductName; ; lblVer.Text = "Version: " + appVersion; Text = appProductName + " のオプション"; lblCampany.Text = "Company: " + appCompanyName; ////レジストリキーの読み出し Common.LoadSettings(); trackBar1.Value = Common.Settings.intChgSpeed; lblSpd.Text = trackBar1.Value.ToString() + "ミリ秒"; //コンボボックスcmbColorsに色名をセット cmbColors.Items.Add("Black"); cmbColors.Items.Add("AliceBlue"); cmbColors.Items.Add("AntiqueWhite"); cmbColors.Items.Add("Aqua"); cmbColors.Items.Add("Aquamarine"); cmbColors.Items.Add("Azure"); cmbColors.Items.Add("BlueViolet"); cmbColors.Items.Add("LawnGreen"); cmbColors.Items.Add("MediumBlue"); cmbColors.Items.Add("OrangeRed"); cmbColors.Items.Add("Yellow"); cmbColors.Items.Add("Cyan"); cmbColors.Items.Add("Chocolate"); cmbColors.Items.Add("Olive"); cmbColors.Items.Add("Red"); //cmbColors.SelectedIndex = 0; cmbColors.BackColor = Common.Settings.BGColor; } private void btnOK_Click(object sender, EventArgs e) { Common.Settings.intChgSpeed= trackBar1.Value; Common.Settings.BGColor = cmbColors.BackColor; Common.SaveSettings(); this.Close(); } private void trackBar1_Scroll(object sender, EventArgs e) { lblSpd.Text = trackBar1.Value.ToString() +"ミリ秒"; } private void cmbColors_SelectedIndexChanged( object sender, EventArgs e) { string str = cmbColors.SelectedItem.ToString(); switch (str) { case "Black": cmbColors.BackColor = Color.Black; break; case "AliceBlue": cmbColors.BackColor = Color.AliceBlue; break; case "AntiqueWhite": cmbColors.BackColor = Color.AntiqueWhite; break; case "Aqua": cmbColors.BackColor = Color.Aqua; break; case "Aquamarine": cmbColors.BackColor = Color.Aquamarine; break; case "Azure": cmbColors.BackColor = Color.Azure; break; case "BlueViolet": cmbColors.BackColor = Color.BlueViolet; break; case "LawnGreen": cmbColors.BackColor = Color.LawnGreen; break; case "MediumBlue": cmbColors.BackColor = Color.MediumBlue; break; case "OrangeRed": cmbColors.BackColor = Color.OrangeRed; break; case "Yellow": cmbColors.BackColor = Color.Yellow; break; case "Cyan": cmbColors.BackColor = Color.Cyan; break; case "Chocolate": cmbColors.BackColor = Color.Chocolate; break; case "Olive": cmbColors.BackColor = Color.Olive; break; case "Red": cmbColors.BackColor = Color.Red; break; } } } } |
◆7.ソースコードのダウンロード
CSSaver3.zip(941KB)
▼ページトップへ