Up

スクリーン画面のファイルへの保存

 

 表示スクリーン画像をファイルに保存する関数としてvsgImageExport関数がある。この使用例プログラムSaveScreenを作成した。このプログラムを起動すると図1のフォームが表示される。

図1

 

Squareボタンのクリックで以下のコード

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

                 ::vsgSetDrawMode(vsgRADIALAXIS);

                 int h = ::vsgGetScreenHeightPixels();

                 ::vsgSetDrawPage(vsgVIDEOPAGE, 0, 0);

 

                 VSGTRIVAL c;

                 c.a = 0.0;

                 c.b = 0.0;

                 c.c = 1.0;

 

                 ::vsgPaletteSet(1, 1, &c);

                 ::vsgSetPen1(1);

 

                 ::vsgDrawRect(-h / 4, -h / 4, h / 4, h / 4);

 

                 ::vsgSetDisplayPage(0);

 

                 buttonSave->Enabled = true;

         }

が実行され、図2のように正方形が表示される。

square.bmp

図2

 

Circleボタンをクリックすると次のコード

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

                 ::vsgSetDrawMode(vsgCENTREXY);

                 int h = ::vsgGetScreenHeightPixels();

                 ::vsgSetDrawPage(vsgVIDEOPAGE, 0, 0);

 

                 VSGTRIVAL c;

                 c.a = 0.0;

                 c.b = 1.0;

                 c.c = 0.0;

 

                 ::vsgPaletteSet(1, 1, &c);

 

                 ::vsgSetPen1(1);

                 ::vsgDrawOval(0, 0, h / 2, h / 2);

                 ::vsgSetDisplayPage(0);

 

                 buttonSave->Enabled = true;

         }

が実行され、図3のように円が表示される。

circle.bmp

図3

 

これらの画面は、図1のフォームのSaveボタンをクリックすることによりファイルに保存することができる。図2あるいは図3のような描画が行われるとSaveボタンはイネーブルになっている。

 Saveボタンをクリックすると以下のコード

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

                 FormS ^ cf = gcnew FormS();

                 saveFileDialog1->Filter = "Bimap file (*.bmp)|*.bmp";

                 saveFileDialog1->Title = "File name ?";

                 if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) return;

                 cf->flnm = saveFileDialog1->FileName;

                 cf->ShowDialog();

         }

が実行されて、図4の保存先のファイル名の設定ダイアログが表示された後、図5のフォームが表示される。

図4

 

図5

 

図5のフォームのCatchボタンをクリックすると、以下のコード

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

                 String ^ s = flnm;

                 marshal_context ^ context = gcnew marshal_context();

                 const char * tcflnm = context->marshal_as<const char *>( s );

                 char * cflnm = new char[flnm->Length+1];

                 for (int i = 0; i < flnm->Length + 1; i++) cflnm[i] = tcflnm[i];

                 int h = int(::vsgGetScreenHeightPixels());

                 int w = int (::vsgGetScreenWidthPixels());

                 int ck;

                 if ((::vsgGetDrawMode() & vsgCENTREXY) != 0){

                         ck = ::vsgImageExport(vsgBMPPICTURE, 0, 0, w, h, cflnm);

                 }else{

                         ck = ::vsgImageExport(vsgBMPPICTURE, -w/2, -h/2, w/2, h/2, cflnm);

                 }

                 if(ck >= 0){

                         MessageBox::Show(flnm + " was successfully saved.");

                 }else{

                         MessageBox::Show("Saving failed.");

                 }

                 Close();

         }

が実行されて、スクリーン画面が保存される。保存が成功すると図6のダイアログにより成功した旨が表示される。

図6

 

図4のダイアログで設定したファイル名は.NETCLR/CLI)での文字列型としてString型であるので、これをViSaGeの関数で用いるためにはchar*型に変換する必要がある。この変換はマーシャリングと呼ばれているが、岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房Pp. 169-172などを参照されたい。

 上記のプログラムのソースコードファイルなどは圧縮ファイルSaveScreen.ZIPとしてまとめた。この圧縮ファイル名SaveScreen.ZIPをクリックしてダウンロードしたものを解凍すれば、Visual C++2008などで開くことができる。解凍は、Windows VistaあるいはWindows 7であれば、ファイル名をマウスの右ボタンでクリックして表示されるメニュから「展開」あるいは「解凍」などのメニュを選ぶと解凍できる。Windows XPの場合は、ZIP形式の圧縮ファイルを解凍するプログラムが必要である。Windows Vistaなどで解凍後、Windows XPにコピーすることもできる。

 

Up