[[TIPS/Programming/]]
[[TIPS/Programming]]

* Visual C++ 2008用 タスクトレイアイコン/レジストリアクセス サンプル [#d9e1cbc1]
** 概要 [#a16ae39f]
このアプリケーションは、Microsoft Visual C++ 2008 で

- タスクトレイアイコンの使用
- レジストリへのアクセス

を実現するためのサンプルプログラムです。

** 基本動作・機能 [#cf71625c]
このアプリケーションは、下記の機能を持っています。
- タスクトレイアイコンの使用
-- タスクバーへのタスクトレイアイコンの登録
-- タスクトレイアイコンの右クリックでコンテキストメニューを表示
-- タスクトレイアイコンのダブルクリックして、メインウィンドウを表示
-- タスクトレイアイコンのコンテキストメニューより、メインウィンドウを表示
-- メインウィンドウの最小化・×ボタンで、メインウィンドウをタスクトレイに収納
-- コンテキストメニューの「終了」でアプリケーションを終了
- レジストリへのアクセス
-- テキストボックスと、二つのチェックボックスの設定値をレジストリへ保存
-- レジストリより、テキストボックスと、二つのチェックボックスの設定値を読み出し、復元

** 技術 [#zc7884e8]
このアプリケーションは、下記の技術的要素を使用しています。
- notifyIcon コントロールの使用
-- メインウィンドウへこのコントロールを貼り付ける
-- タスクトレイへのアイコンの登録、コンテキストメニューの表示
- RegistryKey クラスの使用
-- レジストリのアクセスのために使用する。


** 実行環境(私がディバッグしていた環境です) [#qa8b1a19]
- OS: WindowsXP SP3
- 開発環境: Microsoft Visual C++ 2008 Express Edition

** ダウンロード [#f25f3f1c]
下記のファイルをダウンロードしてください。 Visual C++ 2008 のサンプルプロジェクトを丸ごとZIPしています。ダウンロード後、解凍してソリューションファイルを開いてください。

[[TaskTray_Registry100.zip(18kB)>http://www.altemasoft.com/download/TaskTray_Registry100.zip]]

** ソースコード開設 [#ic5f7688]
下記に、一部の重要なソースコードを示します。
	private: System::Void buttonReferenceFolder_Click(System::Object^  sender, System::EventArgs^  e) {
					//フォルダ設定ダイアログを開く
 					 folderBrowserDialog->ShowDialog(this);
					 if(folderBrowserDialog->SelectedPath != ""){
						 textFolderDestination->Text = folderBrowserDialog->SelectedPath;
					 }
			 }
	private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
			//「閉じる」ボタンで閉じられたときは、終了させない。そのほかの時は終了させる。
			 if(e->CloseReason == System::Windows::Forms::CloseReason::UserClosing) {
				e->Cancel = true;
				 this->Visible = false;
				}
		 }
	private: System::Void 終了ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
			//メニューから終了が選ばれた。
			notifyIcon->Visible = false;
			Application::Exit();
		 }
	private: System::Void タスクトレイに収納ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
			//メインフォームを非表示へ
			 this->Visible = false;
		 }
	private: System::Void ウィンドウを表示ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
			 this->Visible = true;	//メインフォームの表示
			if(this->WindowState != System::Windows::Forms::FormWindowState::Normal){
				this->WindowState = FormWindowState::Normal;
			}
		 }
	private: System::Void notifyIcon_DoubleClick(System::Object^  sender, System::EventArgs^  e) {
			 this->Visible = true;	//メインフォームの表示
			if(this->WindowState != System::Windows::Forms::FormWindowState::Normal){
				this->WindowState = FormWindowState::Normal;
			}
		 }
	private: System::Void バージョン情報ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
			 formVersonInformation^	VersionInformation = gcnew	formVersonInformation();
			//バージョン情報ダイアログを表示します。
			VersionInformation->ShowDialog();
		 }
	private: System::Void Form1_Resize(System::Object^  sender, System::EventArgs^  e) {
			 //最小化されたら、タスクと例に収納 → フォームを非表示
			 if(this->WindowState == System::Windows::Forms::FormWindowState::Minimized){
				 this->Visible = false;	//フォームの表示
				 this->WindowState = FormWindowState::Normal;	//次表示するときのために、通常サイズに戻しておく。
			}
		 }
	private: System::Void アプリケーションを終了ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
			 notifyIcon->Visible = false;	//アプリを終了しても、アイコンが残ることがあるので、明示的に消す。
			 Application::Exit();			//アプリの終了。
		 }
	private: System::Void バージョン情報を表示ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
			formVersonInformation^	VersionInformation = gcnew	formVersonInformation();
			VersionInformation->ShowDialog();	//メニューからバージョン情報ウィンドウの表示
		 }
	private: System::Void メッセージボックスを表示ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
			//ウィンドウを表示しなくてもいい。
			 MessageBox::Show("メッセージボックス単体の表示もできる。", "たとえば");
		 }
	private: System::Void buttonReadFromRegistory_Click(System::Object^  sender, System::EventArgs^  e) {
			String^	stringFolderDestination;
			int	boolSetting1;
			int	boolSetting2;
			//RegistryKeyのインスタンスを作成、と同時にサブキーを開く。読み込み出来るモードで。
			RegistryKey^	ReadRegistryKey = Registry::CurrentUser->CreateSubKey("Software\\TaskTary_Registry");
			//コントロールには直接設定せずに、変数を経由させる。
			stringFolderDestination	= (String^)ReadRegistryKey->GetValue("stringFolderDestination","");
			boolSetting1			= (int)ReadRegistryKey->GetValue("boolSetting1",safe_cast<System::Object^>(0));
			boolSetting2			= (int)ReadRegistryKey->GetValue("boolSetting2",safe_cast<System::Object^>(0));
			//読み込んだ値をコントロールに設定。
			textFolderDestination->Text	= stringFolderDestination;
			checkSetting1->Checked		= (bool)boolSetting1;
			checkSetting2->Checked		= (bool)boolSetting2;	
		 }
	private: System::Void buttonWriteToRegistory_Click(System::Object^  sender, System::EventArgs^  e) {
			 //RegistryKeyのインスタンスを作成、と同時にサブキーを開く。読み書きが出来るモードで。
			 //サブキーが存在しない場合は、作成される。
			RegistryKey^	WriteRegistryKey = Registry::CurrentUser->CreateSubKey("Software\\TaskTary_Registry",RegistryKeyPermissionCheck::ReadWriteSubTree);
			//キー名と値とデータ型を指定して、レジストリに書き込み。
			//キー名が存在しない場合は、新たに作成され、既存のキーがあれば、上書きされる。
			WriteRegistryKey->SetValue("stringFolderDestination",	textFolderDestination->Text->ToString()	,RegistryValueKind::String);
			WriteRegistryKey->SetValue("boolSetting1",checkSetting1->Checked,RegistryValueKind::DWord);
			WriteRegistryKey->SetValue("boolSetting2",checkSetting2->Checked,RegistryValueKind::DWord);
		 }

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS