付箋紙ソフトのデータを保存できるようにします。基本的に常駐させるソフトなので普段はタスクトレイのなかに表示させて必要なときにメインフォームを表示させ操作ができるようにします。
このときアイコンが必要になるので以前作成したアイコンエディタで作成しました。
付箋紙ソフトなのでアイコンは「付」? ただこれは32ビットなので通常のアイコンのようには使えません。そこでPNG形式で保存します。そしてアイコンとして使えるようにします。
NotifyIconコントロールを使って、「×」ボタンを押しても終了せずフォームが非表示になるだけにしています。タスクトレイのアイコンをクリックすれば再度フォームが表示され、本当に終了させたいときはメニューの[終了]をクリックします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
public partial class Form1 : Form { bool IsEnd = false; NotifyIcon NotifyIcon = new NotifyIcon(); public Form1() { InitializeComponent(); this.FormClosing += Form1_FormClosing; InitNotifyIcon(); } void InitNotifyIcon() { // PNGファイルだがアイコンとして使えるようにする var bmp = Properties.Resources.icon; Icon icon = Icon.FromHandle(bmp.GetHicon()); NotifyIcon.Visible = true; NotifyIcon.Icon = icon; NotifyIcon.Click += NotifyIcon_Click; } private void NotifyIcon_Click(object sender, EventArgs e) { this.Visible = true; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if(!IsEnd) { this.Visible = false; e.Cancel = true; return; } } private void AppExitMenuItem_Click(object sender, EventArgs e) { IsEnd = true; Application.Exit(); NotifyIcon.Dispose(); // NotifyIconをDisposeしないとアプリケーション終了後も // アイコンがタスクトレイに残ってしまう(マウスを近づけると消えるが・・・) } } |
肝心の付箋紙のデータを保存するときはどうすればいいでしょうか? アプリが終了するときが適切であると思われます。そして次回起動時に保存されていたデータを手がかりに付箋紙を復元します。
新しい付箋紙を作成するとき、これまで以下の方法でやってきましたが、作成した付箋紙を管理できるように変更します。
<変更前>
1 2 3 4 5 6 7 8 |
public partial class Form1 : Form { private void buttonCreateFusen_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); } } |
<変更後>
1 2 3 4 5 6 7 8 9 10 11 12 |
public partial class Form1 : Form { List<Form2> Fusens = new List<Form2>(); private void buttonCreateFusen_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); Fusens.Add(form2); } } |
データファイルを保存する場所は実行ファイルがあるフォルダと同じでよいと考えます。
これで実行ファイルがあるフォルダと同じにData.xmlというファイルが生成されて、そのファイルにデータに保存されます。
1 2 3 4 5 6 7 8 9 10 |
public partial class Form1 : Form { string DataFilePath = ""; public Form1() { DataFilePath = Application.StartupPath + "\\Data.xml"; LoadFusenInfo(); } } |
データは終了時に保存されるので[終了]メニューがクリックされたときでいいでしょう。SaveFusenInfo()がデータを保存するためのメソッドです。
1 2 3 4 5 6 7 8 9 10 |
public partial class Form1 : Form { private void AppExitMenuItem_Click(object sender, EventArgs e) { SaveFusenInfo(); IsEnd = true; Application.Exit(); } } |
付箋のなかには使わなくなったのでDisposeされているものもあるはずです。そのようなものは対象外とします。そしてForm2..GetFusenInfo()メソッドで保存すべき情報を取り出します。そしてこれをリストに格納してXML形式で保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public partial class Form1 : Form { void SaveFusenInfo() { Fusens = Fusens.Where(x => !x.IsDisposed).ToList(); List<Form2.FusenInfo> FusenInfos = new List<Form2.FusenInfo>(); foreach(var fusen in Fusens) { Form2.FusenInfo info = fusen.GetFusenInfo(); FusenInfos.Add(info); } Doc doc = new Doc(); doc.FusenInfos = FusenInfos; XmlSerializer xml = new XmlSerializer(typeof(Doc)); StreamWriter sw = new StreamWriter(DataFilePath); xml.Serialize(sw, doc); sw.Close(); } public class Doc { public List<Form2.FusenInfo> FusenInfos = null; } } |
これは保存するデータを取得するためのメソッドです。フォームと付箋のサイズと表示位置、付箋に書かれている文字列、不透明度、背景色がFusenInfoオブジェクトとして取得されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public partial class Form2 : Form { public class FusenInfo { public bool IsFusen = false; public int FormWidth = 0; public int FormHeight = 0; public int FusenWidth = 0; public int FusenHeight = 0; public int PosX = 0; public int PosY = 0; public string FusenText = ""; public double OpacityValue = 1.0; public int BackColor = 0; } public FusenInfo GetFusenInfo() { FusenInfo info = new FusenInfo(); info.PosX = Location.X; info.PosY = Location.Y; info.FormWidth = oldFormWidth; info.FormHeight = oldFormHeight; info.FusenWidth = oldFusenWidth; info.FusenHeight = oldFusenHeight; info.FusenText = label1.Text; info.OpacityValue = opacity; info.BackColor = BackColor.ToArgb(); if(FormBorderStyle == FormBorderStyle.None) { info.IsFusen = true; info.FusenWidth = Size.Width; info.FusenHeight = Size.Height; } else { info.IsFusen = false; info.FormWidth = Size.Width; info.FormHeight = Size.Height; } return info; } } |
次にこれをつかって次回起動時に付箋を再生するためのメソッドを示します。
まずはXMLファイルを読み出します。読み出すタイミングはForm1クラスのコンストラクタでよいと思われます。
初めて起動したときはファイルは存在しないので、そのときはなにもしません。ファイルが存在するときはデシリアライズしてそこからDoc.FusenInfosを取り出します。そしてForm2.SetFusenInfoメソッドで付箋を表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.FormClosing += Form1_FormClosing; InitNotifyIcon(); DataFilePath = Application.StartupPath + "\\Data.xml"; LoadFusenInfo(); } void LoadFusenInfo() { if(!File.Exists(DataFilePath)) return; XmlSerializer xml = new XmlSerializer(typeof(Doc)); StreamReader sr = new StreamReader(DataFilePath); Doc doc = (Doc)xml.Deserialize(sr); sr.Close(); foreach(var fusen in doc.FusenInfos) { Form2 form2 = new Form2(); form2.SetFusenInfo(fusen); Fusens.Add(form2); } foreach(Form2 form in Fusens) { form.Show(); } } } |
Form2.SetFusenInfoメソッドはこのようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public partial class Form2 : Form { public void SetFusenInfo(FusenInfo info) { Location = new Point(info.PosX, info.PosY); if(info.IsFusen) { FormToFusen(); Size = new Size(info.FusenWidth, info.FusenHeight); Opacity = info.OpacityValue; } else { FormBorderStyle = FormBorderStyle.Sizable; Size = new Size(info.FormWidth, info.FormHeight); } // 必要。FormStartPosition.Manualにしないと指定した場所に付箋が表示されない StartPosition = FormStartPosition.Manual; oldFormWidth = info.FormWidth; oldFormHeight = info.FormHeight; oldFusenWidth = info.FusenWidth; oldFusenHeight = info.FusenHeight; label1.Text = info.FusenText; textBox1.Text = info.FusenText; opacity = info.OpacityValue; BackColor = Color.FromArgb(info.BackColor); } } |
これでアプリケーションを起動したときに付箋が表示されるようになります。