[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)

▼ページトップへ