#pragma once
using namespace System::Diagnostics;
using namespace msclr::interop; // msclr

#include "d_data.h"
#include "disp.h"
#include "shortcut.h"

namespace disp32form1 {


	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Form1 の概要
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
//		Form1(void)
  array<System::String ^> ^Args_data;
  Form1(array<System::String ^> ^args)//voiを変更

		{
			InitializeComponent();
			//
			//TODO: ここにコンストラクター コードを追加します

			Args_data = args; // 追加
//EnableWindow(ListView_GetHeader(reinterpret_cast(this->listView1->Handle.ToInt32())),FALSE); 
			//
		}

	protected:
		/// <summary>
		/// 使用中のリソースをすべてクリーンアップします。
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	protected: 

	private: System::Windows::Forms::ListBox^  listBox1;


	private: System::Windows::Forms::TextBox^  textBox2;

	private:
		/// <summary>
		/// 必要なデザイナー変数です。
		/// </summary>
		System::ComponentModel::Container ^components;
	private: System::Windows::Forms::TextBox^  textBox1;
	private: System::Windows::Forms::TextBox^  textBox3;
	private: System::Windows::Forms::TextBox^  textBox4;
	private: System::Windows::Forms::TextBox^  textBox6;
	private: System::Windows::Forms::TextBox^  textBox5;
	private: System::Windows::Forms::Button^  button3;
	private: System::Windows::Forms::Label^  label1;
	private: System::Windows::Forms::Label^  label2;
	private: System::Windows::Forms::Label^  label3;
	private: System::Windows::Forms::Label^  label4;
	private: System::Windows::Forms::Label^  label5;
	private: System::Windows::Forms::TextBox^  textBox7;
	private: System::Windows::Forms::TextBox^  textBox8;
	private: System::Windows::Forms::TextBox^  textBox9;
	private: System::Windows::Forms::TextBox^  textBox10;
	private: System::Windows::Forms::Label^  label6;
	private: System::Windows::Forms::Button^  button4;

//============================================================-
	static 	disp m_disp;

			 static shortcut shc;
/*  static array<wchar_t> awc; 
  static pin_ptr<wchar_t> ppwc;*/
//============================================================-

#pragma region Windows Form Designer generated code
		/// <summary>
		/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
		/// コード エディターで変更しないでください。
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->listBox1 = (gcnew System::Windows::Forms::ListBox());
			this->textBox2 = (gcnew System::Windows::Forms::TextBox());
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->textBox3 = (gcnew System::Windows::Forms::TextBox());
			this->textBox4 = (gcnew System::Windows::Forms::TextBox());
			this->textBox5 = (gcnew System::Windows::Forms::TextBox());
			this->textBox6 = (gcnew System::Windows::Forms::TextBox());
			this->button3 = (gcnew System::Windows::Forms::Button());
			this->label1 = (gcnew System::Windows::Forms::Label());
			this->label2 = (gcnew System::Windows::Forms::Label());
			this->label3 = (gcnew System::Windows::Forms::Label());
			this->label4 = (gcnew System::Windows::Forms::Label());
			this->label5 = (gcnew System::Windows::Forms::Label());
			this->textBox7 = (gcnew System::Windows::Forms::TextBox());
			this->textBox8 = (gcnew System::Windows::Forms::TextBox());
			this->textBox9 = (gcnew System::Windows::Forms::TextBox());
			this->textBox10 = (gcnew System::Windows::Forms::TextBox());
			this->label6 = (gcnew System::Windows::Forms::Label());
			this->button4 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->BackColor = System::Drawing::Color::IndianRed;
			this->button1->Location = System::Drawing::Point(83, 1);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(82, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"変更";
			this->button1->UseVisualStyleBackColor = false;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// listBox1
			// 
			this->listBox1->FormattingEnabled = true;
			this->listBox1->ItemHeight = 12;
			this->listBox1->Location = System::Drawing::Point(12, 115);
			this->listBox1->Name = L"listBox1";
			this->listBox1->Size = System::Drawing::Size(523, 352);
			this->listBox1->TabIndex = 2;
			this->listBox1->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::listBox1_SelectedIndexChanged);
			// 
			// textBox2
			// 
			this->textBox2->Location = System::Drawing::Point(171, 3);
			this->textBox2->Name = L"textBox2";
			this->textBox2->Size = System::Drawing::Size(193, 19);
			this->textBox2->TabIndex = 5;
			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(43, 57);
			this->textBox1->Name = L"textBox1";
			this->textBox1->Size = System::Drawing::Size(47, 19);
			this->textBox1->TabIndex = 6;
			// 
			// textBox3
			// 
			this->textBox3->Location = System::Drawing::Point(125, 57);
			this->textBox3->Name = L"textBox3";
			this->textBox3->Size = System::Drawing::Size(78, 19);
			this->textBox3->TabIndex = 7;
			// 
			// textBox4
			// 
			this->textBox4->Location = System::Drawing::Point(234, 57);
			this->textBox4->Name = L"textBox4";
			this->textBox4->Size = System::Drawing::Size(69, 19);
			this->textBox4->TabIndex = 8;
			// 
			// textBox5
			// 
			this->textBox5->Location = System::Drawing::Point(340, 58);
			this->textBox5->Name = L"textBox5";
			this->textBox5->Size = System::Drawing::Size(48, 19);
			this->textBox5->TabIndex = 9;
			// 
			// textBox6
			// 
			this->textBox6->Location = System::Drawing::Point(455, 59);
			this->textBox6->Name = L"textBox6";
			this->textBox6->Size = System::Drawing::Size(68, 19);
			this->textBox6->TabIndex = 10;
			// 
			// button3
			// 
			this->button3->BackColor = System::Drawing::Color::Chartreuse;
			this->button3->Location = System::Drawing::Point(2, 1);
			this->button3->Name = L"button3";
			this->button3->Size = System::Drawing::Size(75, 23);
			this->button3->TabIndex = 11;
			this->button3->Text = L"元に戻す";
			this->button3->UseVisualStyleBackColor = false;
			this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click);
			// 
			// label1
			// 
			this->label1->AutoSize = true;
			this->label1->Location = System::Drawing::Point(13, 58);
			this->label1->Name = L"label1";
			this->label1->Size = System::Drawing::Size(19, 12);
			this->label1->TabIndex = 12;
			this->label1->Text = L"No";
			// 
			// label2
			// 
			this->label2->AutoSize = true;
			this->label2->Location = System::Drawing::Point(102, 59);
			this->label2->Name = L"label2";
			this->label2->Size = System::Drawing::Size(17, 12);
			this->label2->TabIndex = 13;
			this->label2->Text = L"横";
			// 
			// label3
			// 
			this->label3->AutoSize = true;
			this->label3->Location = System::Drawing::Point(211, 58);
			this->label3->Name = L"label3";
			this->label3->Size = System::Drawing::Size(17, 12);
			this->label3->TabIndex = 14;
			this->label3->Text = L"縦";
			// 
			// label4
			// 
			this->label4->AutoSize = true;
			this->label4->Location = System::Drawing::Point(317, 59);
			this->label4->Name = L"label4";
			this->label4->Size = System::Drawing::Size(17, 12);
			this->label4->TabIndex = 15;
			this->label4->Text = L"色";
			// 
			// label5
			// 
			this->label5->AutoSize = true;
			this->label5->Location = System::Drawing::Point(395, 59);
			this->label5->Name = L"label5";
			this->label5->Size = System::Drawing::Size(54, 12);
			this->label5->TabIndex = 16;
			this->label5->Text = L"リフレッシュ";
			// 
			// textBox7
			// 
			this->textBox7->Location = System::Drawing::Point(129, 89);
			this->textBox7->Name = L"textBox7";
			this->textBox7->Size = System::Drawing::Size(74, 19);
			this->textBox7->TabIndex = 17;
			// 
			// textBox8
			// 
			this->textBox8->Location = System::Drawing::Point(209, 90);
			this->textBox8->Name = L"textBox8";
			this->textBox8->Size = System::Drawing::Size(80, 19);
			this->textBox8->TabIndex = 18;
			// 
			// textBox9
			// 
			this->textBox9->Location = System::Drawing::Point(305, 90);
			this->textBox9->Name = L"textBox9";
			this->textBox9->Size = System::Drawing::Size(40, 19);
			this->textBox9->TabIndex = 19;
			// 
			// textBox10
			// 
			this->textBox10->Location = System::Drawing::Point(362, 90);
			this->textBox10->Name = L"textBox10";
			this->textBox10->Size = System::Drawing::Size(42, 19);
			this->textBox10->TabIndex = 20;
			// 
			// label6
			// 
			this->label6->AutoSize = true;
			this->label6->Location = System::Drawing::Point(91, 95);
			this->label6->Name = L"label6";
			this->label6->Size = System::Drawing::Size(29, 12);
			this->label6->TabIndex = 21;
			this->label6->Text = L"引数";
			// 
			// button4
			// 
			this->button4->BackColor = System::Drawing::Color::MediumPurple;
			this->button4->Location = System::Drawing::Point(2, 24);
			this->button4->Name = L"button4";
			this->button4->Size = System::Drawing::Size(163, 27);
			this->button4->TabIndex = 22;
			this->button4->Text = L"ディスクトップにショートカットを作る";
			this->button4->UseVisualStyleBackColor = false;
			this->button4->Click += gcnew System::EventHandler(this, &Form1::button4_Click);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->BackColor = System::Drawing::Color::Plum;
			this->ClientSize = System::Drawing::Size(550, 479);
			this->Controls->Add(this->button4);
			this->Controls->Add(this->label6);
			this->Controls->Add(this->textBox10);
			this->Controls->Add(this->textBox9);
			this->Controls->Add(this->textBox8);
			this->Controls->Add(this->textBox7);
			this->Controls->Add(this->label5);
			this->Controls->Add(this->label4);
			this->Controls->Add(this->label3);
			this->Controls->Add(this->label2);
			this->Controls->Add(this->label1);
			this->Controls->Add(this->button3);
			this->Controls->Add(this->textBox6);
			this->Controls->Add(this->textBox5);
			this->Controls->Add(this->textBox4);
			this->Controls->Add(this->textBox3);
			this->Controls->Add(this->textBox1);
			this->Controls->Add(this->textBox2);
			this->Controls->Add(this->listBox1);
			this->Controls->Add(this->button1);
			this->Name = L"Form1";
			this->Text = L"画面解像度変更";
			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
			this->ResumeLayout(false);
			this->PerformLayout();

		}

#pragma endregion
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
	//			 disp m_disp;

				int width_x = int::Parse(textBox3->Text); // 解像度横サイズ（width x）
				int height_y =int::Parse(textBox4->Text); // 解像度縦サイズ（hight y）
				int perpel =int::Parse(textBox5->Text); // 解像度縦サイズ（hight y）
				int frequency_hz =int::Parse(textBox6->Text); // リフレッシュ周波数
  int y;
			
			y=m_disp.disp_chang( width_x, height_y, perpel,  frequency_hz);
  	if(y==1) MessageBox::Show("解像度変更失敗");

			 }
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
  //フォームへの引数の引き渡し 横　縦　色　リフレッシュ　例１０２８　７６８　３２　６０
			 int h_data0;
			 int h_data1;
			 int h_data2;
			 int h_data3;
/*======================================
  if(0 < CommandLineArgs->Length)
	 
  { System::Diagnostics::Debug::WriteLine("引数の個数 = " + CommandLineArgs->Length);
   for(int i = 0;i < CommandLineArgs->Length;i++)System::Diagnostics::Debug::WriteLine("No." + i + " = " + CommandLineArgs[i]);
  }else
  {  CommandLineArgs = gcnew array<String ^>(2);
     CommandLineArgs[0] = "";
  } 
  
   { MessageBox::Show("引数の個数 = " + CommandLineArgs->Length);
   for(int i = 0;i < CommandLineArgs->Length;i++) MessageBox::Show("No." + i + " = " + CommandLineArgs[i]);
  }else
  {  CommandLineArgs = gcnew array<String ^>(2);
     CommandLineArgs[0] = "";
  } 
  //==========================*/
  if(Args_data->Length==4){
              h_data0=int::Parse(Args_data[0]);
			  h_data1=int::Parse(Args_data[1]);
			  h_data2=int::Parse(Args_data[2]);
			  h_data3=int::Parse(Args_data[3]);
  }else{ Args_data = gcnew array<String ^>(2);
     Args_data[0] = "";}
  if( h_data0>1900*2 || h_data1>1200*2 || h_data2>32 || h_data3>240) { //1900*2 1200*2 以上はエラーとする
	                     h_data0=0;
						 h_data1=0;
						 h_data2=0;
						 h_data3=0;

						}
   
	//フォームへの引数の引き渡し終わり	
//disp m_disp;
			 //現在のモード
			   textBox3->Text=m_disp.old_x_data.ToString();
			   textBox4->Text=m_disp.old_y_data.ToString();
			   textBox5->Text=m_disp.old_perpel.ToString();
			   textBox6->Text=m_disp.old_hz.ToString();
			   //引数
			       textBox7->Text=h_data0.ToString();
				   textBox8->Text=h_data1.ToString();
				   textBox9->Text=h_data2.ToString();
				   textBox10->Text=h_data3.ToString();

			   
static  DEVMODE dispmode; // デバイス構造体

				
//使用できるディスプレイモードの確認
 m_disp.disp_use();
  String^ text;
  		text="";
  int disp_no=0;
	
/*-------------------
  richTextBox1->SaveFile("C:\\dispmode.rtf");　保存する場合
  richTextBox1->LoadFile("C:\\dispmode.rtf");
-------------------*/
		// 使用できるディスプレイモードをリストボックスに表示
		disp_no = 0;
		int flag=0;
		if(h_data0==0 && h_data1==0 && h_data2==0 && h_data3==0 ) flag=-1;
		int y;
	
	
	
	//while( TRUE )
	//	while(m_disp.disp_data[disp_no]->no = -1)
		for(disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++)
		{
			//全モードの列挙
			//if( m_disp.disp_data[disp_no]->no==-1  ) break; 
			// リッチテキストに表示する
			text=disp_no.ToString()+" "+m_disp.disp_data[disp_no]->x_data.ToString()+" "+m_disp.disp_data[disp_no]->y_data.ToString()+
				" "+m_disp.disp_data[disp_no]->perpel.ToString()+" "+m_disp.disp_data[disp_no]->hz.ToString()+"\n";
			listBox1->Items->Add(text);
			//フォームへの引数が解像度と適合しているかのチェック
			if( m_disp.disp_data[disp_no]->x_data==h_data0 &&
				m_disp.disp_data[disp_no]->y_data==h_data1 &&
				m_disp.disp_data[disp_no]->perpel==h_data2 &&
				m_disp.disp_data[disp_no]->hz==h_data3) flag=1; 
		  //	disp_no++;

		}
	textBox1->Text=flag.ToString();
			 //フォームへの引数の引き渡しがあったときの処理
	if(flag==1){
		        y=m_disp.disp_chang( h_data0,h_data1,h_data2,h_data3); //フォームへの引数で解像度変更
				this->WindowState = FormWindowState::Minimized; //現在のフォームを最小化
					 MessageBox::Show("現在のフォームを最小化しました。");	
				}
	else       {
		if(flag !=-1){
			text= h_data0.ToString()+" "+h_data1.ToString()+" "+h_data2.ToString()+" "+h_data3.ToString()+" ";
		 if (MessageBox::Show(text+"対応していない解像度です。強制変更してみますか?", "確認", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
			 y=m_disp.disp_chang( h_data0,h_data1,h_data2,h_data3);
		             }
		 }

	           }
    if(y==1) MessageBox::Show("解像度変更失敗");
	/*
現在のフォームを最小化
this->WindowState = FormWindowState::Minimized;
現在のフォームを最大化
this->WindowState = FormWindowState::Maximized;
現在のフォームを最小化、あるいは最大化から元に戻す
this->WindowState = FormWindowState::Normal;
現在のフォームを非表示
this->Hide();
現在のフォームを非表示から表示
this->Show();
	*/

}
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
		// disp m_disp;
			   int s_no=0;
			   textBox2->Text=listBox1->Text;
			   textBox1->Text=listBox1->SelectedIndex.ToString();
			   s_no=listBox1->SelectedIndex;
			   textBox3->Text=m_disp.disp_data[s_no]->x_data.ToString();
			   textBox4->Text=m_disp.disp_data[s_no]->y_data.ToString();
			   textBox5->Text=m_disp.disp_data[s_no]->perpel.ToString();
			   textBox6->Text=m_disp.disp_data[s_no]->hz.ToString();	  

		 }
private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
			  
			  m_disp.disp_old();
			  


		 }

private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {

//http://code.msdn.microsoft.com/VisualC-7c6bc862
//http://yokohama.cool.ne.jp/chokuto/urawaza/com/shell.html
//http://minidx.blogspot.com/2007/03/vc_14.html 文字ニツイテ
//http://fatalita.sakura.ne.jp/Junk/_T/index.html
//const TCHAR * text = _T("文字列"); と LPCTSTR text = _T("文字列");  は同じ意味です。
//http://ysmt.blog21.fc2.com/blog-entry-244.html
//http://support.microsoft.com/kb/311259/ja
//http://codezine.jp/article/detail/4774

shortcut stc;
int ret;
String^ option1;
String^ option2;
option1= textBox3->Text + " "+ textBox4->Text + " " + textBox5->Text + " " + textBox6->Text;
option2="\\resolution_change "+option1+".lnk";
 MessageBox::Show(option1+"解像度の準備をします");
/*
String^ -> char*
//marshal_contextのインスタンスを作ってメソッドのmarshal_asを呼ぶ
#include <msclr/marshal.h>
using namespace msclr::interop;
//
String^ str = "test_text";
marshal_context context;
const char* ptr = context.marshal_as<const char*>(str);
*/  

//LPTSTR pszStr; //exeample ="1024 768 32 60";
const char* pszStr1; 
  marshal_context ctx1; 
  pszStr1 = ctx1.marshal_as<const char*>(option1); 
const char* pszStr2; 
  marshal_context ctx2; 
  pszStr2 = ctx2.marshal_as<const char*>(option2); 
//  s2 = ctx.marshal_as<const wchar_t*>(s0); 
  ret=stc.Stcut(pszStr1,pszStr2);
if(ret) MessageBox::Show("デスクトップのショートカットを確認してください");

		 }

private: System::Void listBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {
	//		  disp m_disp;
			   int s_no=0;
			   textBox2->Text=listBox1->Text;
			   textBox1->Text=listBox1->SelectedIndex.ToString();
			   s_no=listBox1->SelectedIndex;
			   textBox3->Text=m_disp.disp_data[s_no]->x_data.ToString();
			   textBox4->Text=m_disp.disp_data[s_no]->y_data.ToString();
			   textBox5->Text=m_disp.disp_data[s_no]->perpel.ToString();
			   textBox6->Text=m_disp.disp_data[s_no]->hz.ToString();
		 }
};
}

			   /*
1. 名前空間を記述します。 
using namespace System::Diagnostics;

2. コードを記述します。 
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e)
{
  listBox1->Items->Add("NEC");
  listBox1->Items->Add("SONY");
  listBox1->Items->Add("DELL");
}

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
  Debug::WriteLine(listBox1->Text);
  Debug::WriteLine(listBox1->SelectedItem->ToString());
}
Text プロパティ、SelectedItem プロパティのいずれかを使うことができますが、
まったく選択されていなとき、Text プロパティには Empty が入りますが、SelectedItem プロパティには null が入ります。
null の値に対して ToString メソッドを実行すると、例外が発生しますので、注意が必要です。
			   */
/*
[Win32ＡＰＩの件]

Windowsヘッダーファイルを
#include <windows.h>
というようにインクルードすれば、普通にWindowsAPIをそのまま使えます。

ただし、細かな点で違うところもあります。
例えば、WindowsAPIで使われる文字列型のLPCWSTRでは、VC++6.0以前では、

LPCWSTR StringObj = "任意の文字列";

と生成していたのに、VC++ 2008ではエラーになります。そこで、以下のようにします。

LPCWSTR StringObj = L"任意の文字列";
*/
 //listBox1->Items->add(text);
  /*
  richTextBox1->LoadFile("C:\\dispmode.rtf");
  richTextBox1->SaveFile("D:\\test.rtf");
  数値から文字列への変換には、
　　　　textBox1->Text=a.ToString();

	*/
   /*
   private:
   void WriteTextToRichTextBox()
   {
      // Clear all text from the RichTextBox;
      richTextBox1->Clear();

      // Set the font for the opening text to a larger Arial font;
      richTextBox1->SelectionFont = gcnew System::Drawing::Font( "Arial",16 );

      // Assign the introduction text to the RichTextBox control.
      richTextBox1->SelectedText = "The following is a list of bulleted items: \n";

      // Set the Font for the first item to a smaller size Arial font.
      richTextBox1->SelectionFont = gcnew System::Drawing::Font( "Arial",12 );

      // Specify that the following items are to be added to a bulleted list.
      richTextBox1->SelectionBullet = true;

      // Set the color of the item text.
      richTextBox1->SelectionColor = Color::Red;

      // Assign the text to the bulleted item.
      richTextBox1->SelectedText = "Apples \n";

      // Apply same font since font settings do not carry to next line.
      richTextBox1->SelectionFont = gcnew System::Drawing::Font( "Arial",12 );
      richTextBox1->SelectionColor = Color::Orange;
      richTextBox1->SelectedText = "Oranges \n";
      richTextBox1->SelectionFont = gcnew System::Drawing::Font( "Arial",12 );
      richTextBox1->SelectionColor = Color::Purple;
      richTextBox1->SelectedText = "Grapes \n";

      // End the bulleted list.
      richTextBox1->SelectionBullet = false;

      // Specify the font size and string for text displayed below bulleted list.
      richTextBox1->SelectionFont = gcnew System::Drawing::Font( "Arial",16 );
      richTextBox1->SelectedText = "Bulleted Text Complete!";
   }



   */	

   /*
   // Get current Device Mode.
DEVMODE DeviceMode = { 0 };
EnumDisplaySettings( NULL,
 ENUM_CURRENT_SETTINGS,
 &DeviceMode );

// Change display mode upside down.
DeviceMode.dmDisplayOrientation = DMDO_180;
ChangeDisplaySettings( &DeviceMode, 0 );

// Sleep for 10 seconds.
Sleep( 10000 );

// Change display mode back.
DeviceMode.dmDisplayOrientation = DMDO_DEFAULT;
ChangeDisplaySettings( &DeviceMode, 0 );

*/


 // size->Width=800;
//  size->Height=600;
  //SystemInformation::PrimaryMonitorSize = size;
				 				//yh
				  // Win32 API
 /* WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
    "Hello World!\n",13,&dummy,NULL);
			
	static DEVMODE devmode;          // ディスプレイモード
	static int index;
	index = 0;*/

	        //yh
	/*BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, LPDEVMODE lpDevMode);
	第１引数にNULLを指定すると、現在のディスプレイからディスプレイモードを取得できます。
	第２引数には、取得するグラフィックモードのインデックス番号を指定します。グラフィックモードは、何通りも存在しており、
	最初のインデックス番号を０と考え、その後は＋１されていきます。先程のサンプルプログラムで出力されたテキストファイルを見れば分かりますが、
	１行目がインデックス番号０、２行目が１・・・ということです。最後に第３引数ですが、
	ここに取得したディスプレイモードの情報を格納するDEVMODE構造体のアドレスを指定します。戻り値は単純に成否を返します。

EnumDisplaySettings()での列挙は、第２引数を０から順次インクリメントしていき、呼び出しを繰り返します。
毎回、第３引数に情報がセットされるので、それを一覧表示するなりすれば、ユーザにどれか１つを選択させるアプリケーションが作れます。
*/


				// if( !EnumDisplaySettings( NULL, index, &devmode ));
				

				 

			// テキストファイルに書き出す
		//	fprintf( fp, "%d * %d  %dbit\n", devmode.dmPelsWidth, devmode.dmPelsHeight, devmode.dmBitsPerPel );
/*
下記のようなクラスを作りました。
ref class Card
{
private:
String^name;// カード名
DateTimedate;// 直近引落日
intmoney;// 直近精算金額
DateTimedate2;// 来月引落日
intmoney2;// 金額
DateTime３月後;
private:
以下省略　プロパティー、コンストラクタ等は、設定しています。

呼び出し側で、以下のように配列宣言し、インスタンス化しました。
private:array<Card^>^ orgCard;
this->orgCard=gcnew array<Card ^>(3);

これで、
orgCard->　としても、インテリセンスにこのクラス各フィールドが表示されません。どうしたらいいのでしょうか？


orgCard の型は array<Card^>^ であって Card^ ではないですから, 
orgCard-> のところで Cardクラスのフィールドが表示されることはない
(存在するなら array<Card^> のフィールドが出る) ような気がするんだ
*/
/*
分類:[C++/CLI]　


Visual Stdio 2010 C++ Expressを使用しています。
windowsフォームアプリケーションを作成しています。

クラスを定義し、それを配列として確保したいのですが、インスタンスに設定されていないという実行エラーになります。

＜クラス定義＞
public ref class aaa{
	private:
		int n;

	public:
		aaa(){
			n=0;
		}

		void func(){
			int m;
			m = 3;
			n = 3;
		}
	};

＜クラス使用＞
array<aaa^ >^ bbb;
bbb = gcnew array<aaa^>(2);

bbb[0]->func();

これを実行すると、func()内のn=3のところで「オブジェクト参照がオブジェクト インスタンスに設定されていません。」という実行エラーが起きてしまいます。

 

 > bbb = gcnew array<aaa^>(2);
これだけでは配列という箱を作っただけで、その中身までは作られません。bbb[0] などは null のままです。
それぞれの要素について gcnew aaa() などを行う必要があります。
 
 

*/
/*
Form^ form1 = gcnew Form; 
array<Label^>^adr=gcnew array<Label^>(3); 

for(i=0;i<3;i++){ 
adr[i]=gcnew Label; 
adr[i]->Text=i.ToString("X"); 
adr[i]->Location=Point(15,25+i*15); 
adr[i]->AutoSize=true; 
form1->Controls->Add(adr[i]); 
} 

*/
/*=====================================
//yuzuru my ディスプレイモードクラス
#include <windows.h>
#include <afxwin.h>
class DisplayChangeMode
{
//private:
public:
	//旧モード
	DEVMODE dMode;
	//旧モードを格納
	DEVMODE dModeList[ 1000 ];
	//変数
    	int ModeNo;
		int setModeNo;
		int colors;
        int genzai_x;
		int genzai_y;
		int genzai_r;

//public:
	//変更できるディスプレイモードｎｏを取得
	int GetDispModeNo();
	//変更できるディスプレイモード一覧取得
	void GetDispMode();
	//起動時、元の設定に戻す
	int ChangeDispMode();
	//指定した解像度に変更
	int ChangeDispMode( int );
	//コンストラクタ　作成時　呼び出し
	DisplayChangeMode(){ GetDispMode(); GetDispModeNo(); }
	//ディストラクタ　終了時　呼び出し
	~DisplayChangeMode(){ ChangeDispMode(); }
};
//my ディスプレイモードクラス end 
int DisplayChangeMode::ChangeDispMode()
{
		if    (ChangeDisplaySettings(&dMode,CDS_TEST) == DISP_CHANGE_SUCCESSFUL)
		return ChangeDisplaySettings(&dMode,0);
     return 0;
}

int DisplayChangeMode::ChangeDispMode(int no)
{
	if(no>=0 && no< ModeNo) 
		if    (ChangeDisplaySettings(&dModeList[no],CDS_TEST) == DISP_CHANGE_SUCCESSFUL)
        return ChangeDisplaySettings(&dModeList[no],0);
     return 0;
}
void DisplayChangeMode::GetDispMode()
{
	HDC hdc=GetDC( NULL );
	 colors =GetDeviceCaps(hdc,BITSPIXEL);
	 genzai_y=GetDeviceCaps(hdc,VERTRES);
	 genzai_x=GetDeviceCaps(hdc,HORZRES);
	 genzai_r=GetDeviceCaps(hdc,VREFRESH); //windows NT 2000

	ReleaseDC( NULL , hdc );
	
}


int DisplayChangeMode::GetDispModeNo()
{
    ModeNo = 0;
    colors = 0;
    genzai_x = 0;
    genzai_y = 0;
	genzai_r = 0;
    setModeNo=0;
	while( EnumDisplaySettings( NULL , ModeNo , &dModeList[ ModeNo ] ) ){
		if( dModeList[ ModeNo ].dmBitsPerPel == (unsigned)colors && 
			dModeList[ ModeNo ].dmPelsWidth == genzai_x &&
			dModeList[ ModeNo ].dmPelsHeight == genzai_y ){
            dMode = dModeList[ ModeNo ]; //旧モードの保存
			setModeNo=ModeNo;
		    }
   			ModeNo++;
	}
	return ModeNo;
}


//-----------------my end


// CChangeDisplaySettingView

IMPLEMENT_DYNCREATE(CChangeDisplaySettingView, CFormView)

BEGIN_MESSAGE_MAP(CChangeDisplaySettingView, CFormView)
	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
	ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1)
	ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7)
	ON_BN_CLICKED(IDC_BUTTON8, OnBnClickedButton8)
	ON_BN_CLICKED(IDC_BUTTON9, OnBnClickedButton9)
	ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)
END_MESSAGE_MAP()

// CChangeDisplaySettingView コンストラクション/デストラクション

CChangeDisplaySettingView::CChangeDisplaySettingView()
	: CFormView(CChangeDisplaySettingView::IDD)
	, set_DispNO(0)
	, oldNO(0)
	, gen_X(0)
	, gen_Y(0)
	, gen_R(0)
	, gen_B(0)
{
	// TODO: 構築コードをここに追加します。
		
}

CChangeDisplaySettingView::~CChangeDisplaySettingView()
{
}

void CChangeDisplaySettingView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, DispMode);
	DDX_Control(pDX, IDC_EDIT2, genzai_List);
	DDX_Control(pDX, IDC_EDIT1, changList);
	DDX_Control(pDX, IDC_EDIT3, setNO);
	DDX_Control(pDX, IDC_LIST2, RegList);
}

BOOL CChangeDisplaySettingView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
	//  修正してください。

	return CFormView::PreCreateWindow(cs);
}

void CChangeDisplaySettingView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	}
========================================*/
/*
DEVMODE DevMode0; // 現在の画面設定
	DEVMODE DevMode1; // 目的の画面設定
	EnumDisplaySettings(
		NULL,
		ENUM_CURRENT_SETTINGS,
		&DevMode0)
	;
	EnumDisplaySettings(
		NULL,
		ENUM_CURRENT_SETTINGS,
		&DevMode1)
	;
	// 現在の画面の情報を DEVMODE 構造体のインスタンスに入れている

	DevMode1.dmBitsPerPel =32; // 色数
	DevMode1.dmPelsWidth =640; // 横ドット
	DevMode1.dmPelsHeight =480; // 縦ドット
	// これが変更させる画面の情報
	
	long result =ChangeDisplaySettings (&DevMode1, 0);
	// 画面の解像度を変える

	if( result ==DISP_CHANGE_SUCCESSFUL ){
		MessageBox (NULL, "Succeed", "test", MB_OK);
		ChangeDisplaySettings (&DevMode0, 0);
		// もとの解像度に戻す
	}
	else{
		MessageBox (NULL, "Failed", "test", MB_OK);
	}
	return 0;

*/

/*
ショートカットというのはWindowsですよね 
C++で電卓のショートカットを作ってみました 
#define _CRT_SECURE_NO_WARNINGS 
#include <shlobj.h> 

int main(void) 
{ 
LPCTSTR programPath = TEXT("%SystemRoot%\\system32\\calc.exe"); // 電卓のパス 
wchar_t linkPath[MAX_PATH]; // ショートカット名はユニコード限定 

// デスクトップフォルダ取得（デスクトップかスタートメニューにしか作れない） 
LPITEMIDLIST pidl; 
SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidl); 
SHGetPathFromIDListW(pidl, linkPath); 
wcscat(linkPath, L"\\calc.lnk"); 

IShellLink* sl; 
IPersistFile* pf; 
CoInitialize(NULL); // COMライブラリを初期化 
if (CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&sl) == S_OK) 
{ 
if (sl->QueryInterface(IID_IPersistFile,(void **)&pf) == S_OK) 
{ 
sl->SetPath(programPath); // プログラムパス 
sl->SetDescription(NULL); // 説明（＝ ツールチップス） 
sl->SetArguments(NULL); // コマンドライン引数 
sl->SetWorkingDirectory(NULL); // 作業ディレクトリ 
sl->SetIconLocation(NULL, 0); // Iconのパスまたはインデックス 
sl->SetShowCmd(SW_SHOWNORMAL); // 起動時のウィンドウ表示 
pf->Save(linkPath, TRUE); // ショートカットを保存 
pf->Release(); // IPersistFileへのポインタを破棄 
pf = NULL; 
} 
sl->Release(); // IShellLinkへのポインタを破棄 
sl = NULL; 
} 
CoUninitialize (); // COMライブラリをクローズ 
return 0; 
}
*/

/*
コマンドライン引数(Visual C++2005 Express Edition / CLR)

しばらく書いてなかった。復活・・・するかな？



コマンドラインから引数を読み取るプログラムの作り方
赤字で書いてあるところを追加する



????.cpp



-----------------------------------------------------------------
// ????.cpp : メイン プロジェクト ファイルです。
------------------------------------------------------------------



#include "stdafx.h"
#include "Form1.h"



using namespace GMCT1;



[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
 // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
 Application::EnableVisualStyles();
 Application::SetCompatibleTextRenderingDefault(false); 




 // メイン ウィンドウを作成して、実行します
 Application::Run(gcnew Form1(args));
 return 0;
}



-----------------------------------------------------------------------
form1.h
-----------------------------------------------------------------------



//public:
  array<System::String ^> ^CommandLineArgs;
  Form1(array<System::String ^> ^args)//元は　void
  {
   InitializeComponent();
   //
   //TODO: ここにコンストラクタ コードを追加します
   //



   CommandLineArgs = args; // 追加



・・・・



}



private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
 {
   //
  if(0 < CommandLineArgs->Length)
  { System::Diagnostics::Debug::WriteLine("引数の個数 = " + CommandLineArgs->Length);
   for(int i = 0;i < CommandLineArgs->Length;i++)System::Diagnostics::Debug::WriteLine("No." + i + " = " + CommandLineArgs[i]);
  }else
  {  CommandLineArgs = gcnew array<String ^>(2);
     CommandLineArgs[0] = "";
  }  
 }



//////　簡単な説明　///////



main関数のargsにコマンドラインからの引数が渡される。
Application::Run(gcnew Form1(args));
でargsをForm1に渡す。



array<System::String ^> ^CommandLineArgs;//　グローバルで型だけ宣言
Form1(array<System::String ^> ^args)//Form1で受け取る
引数の個数はCommandLineArgs->Lengthでわかる。



else以降の
  {  CommandLineArgs = gcnew array<String ^>(2);
     CommandLineArgs[0] = "";
  } 
は引数が何もない時にif(CommandLineArgs[0] =="")とかするとエラーが出るので実体確保！

/////// 使い方 ////////



VC++2005EEのソリューション エクスプローラーでプロジェクトのプロパティを開き「構成プロパティ」「デバッグ」「コマンド引数」を指定すると確認できる。



パス名などで半角文字を含む場合　" " で括ると一つに扱ってくれる。



例　"c:\temp folder\test.txt" 
CommandLineArgs[0] = c:\temp folder\test.txt



例　c:\temp folder\test.txt 
CommandLineArgs[0] = c:\temp
CommandLineArgs[1] = folder\test.txt

http://space.geocities.yahoo.co.jp/gl/fafnirsousi/view/20090218/1234915047
*/
/*
include <windows.h>
#include <tchar.h>
#include <shlobj.h> // for IShellLink

// ショートカットの作成
// (C++ 用)
bool CreateShortcut(LPCTSTR targetFileName 
// ショートカットのリンク先 
, LPCTSTR targetArgument
// コマンドライン引数 
, LPCTSTR linkFileName // ショートカットのパス名 
)
{
   bool            isSuccess(false);
   HRESULT         result = ::CoInitialize(NULL);
   if (SUCCEEDED(result)) {
       IShellLink* pShellLink;
       result = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pShellLink);
       if (SUCCEEDED(result)) {
           IPersistFile*   pPersistFile;
           result = pShellLink->QueryInterface(IID_IPersistFile, (void**)&pPersistFile);
           if (SUCCEEDED(result)) {
               result = pShellLink->SetPath(targetFileName);
               if (SUCCEEDED(result)) {
                   result = (targetArgument == NULL) ? S_OK : pShellLink->SetArguments(targetArgument);
                   if (SUCCEEDED(result)) {
#ifdef  _UNICODE
                       result = pPersistFile->Save(linkFileName, true);
#else   //  _UNICODE
                       //  Unicodeに変換
                       wchar_t wlinkFileName[MAX_PATH];
                       ::MultiByteToWideChar(CP_ACP, 0, linkFileName, -1, wlinkFileName, MAX_PATH);
                       result = pPersistFile->Save(wlinkFileName, true);
#endif  //  _UNICODE
                       if (SUCCEEDED(result))
                           isSuccess = true;
                   }
               }
               pPersistFile->Release();
           }
           pShellLink->Release();
       }
       CoUninitialize();
   }
   return isSuccess;
}

// ディレクトリ名の正規化 (サブルーチン)
// (C++ 用)
static void RegulateDirectoryName(LPTSTR directoryName)
{
   const size_t directoryNameTextLength(::_tcslen(directoryName));
   if (directoryName[directoryNameTextLength - 1] != _T('\\')) {
       directoryName[directoryNameTextLength    ] = _T('\\');
       directoryName[directoryNameTextLength + 1] = _T('\0');
   }
}

// ディレクトリ名とファイル名を連結してパス名へ (サブルーチン)
// (C++ 用)
static void MakePathName(LPTSTR pathName, LPCTSTR directoryName, LPCTSTR fileName)
{
   ::_tcscpy(pathName, directoryName);
   RegulateDirectoryName(pathName);
   ::_tcscat(pathName, fileName);
}

// ショートカットの作成
// (C++ 用)
bool CreateShortcut(LPCTSTR targetPathName
// ショートカットのリンク先 ,
LPCTSTR targetArgument 
// コマンドライン引数 
, LPCTSTR linkDirectoryName 
// ショートカットを置くディレクトリ 
, LPCTSTR linkName
// ショートカットの名称 
)
{
   TCHAR linkFileName[_MAX_PATH];
   ::_tcscpy(linkFileName, linkName  );
   ::_tcscat(linkFileName, _T(".lnk"));
   TCHAR linkPathName[_MAX_PATH];
   MakePathName(linkPathName, linkDirectoryName, linkFileName);
   return CreateShortcut(targetPathName, targetArgument, linkPathName);
}

*/