Up

大きい文字表示の時計

Visual C++/CLR 2012による簡単なフォームアプリケーションプログラム例

なお、後半にフォームのサイズを変えることができるようにしたものをVisual C++/CLR 2013で作成したものを用意した。

64ビットアプリケーション作成方法も説明している。

 

 図1に示すような時刻を表示するwindowsフォームアプリケーションをVisual C++/CLR 2012で作成してみた。

図1

 

フォームとフォームを表示するソースコードファイルは、<Windowsフォームアプリケーションの作成:Visual C++ 2012>で説明している要領で作成する。図2にフォームのデザインを示す。

図2

 

フォームは、プロパティFormBorderStyleNoneに設定している。フォームには、ButtonPictureBoxTimerが張り付けられているが、Timerはフォーム上に張り付けると下のペインにtimer1として表示される。ボタンのプロパティFlatStyleFlatに設定している(図3)。ボタンのフォームのBackColorプロパティの値はLimeである。

図3

 

図3の状態で用意されたフォームは、プログラムの実行開始時に以下のコードにより図1のように設定される。

                            this->Size = System::Drawing::Size( 800, 350 );

                            buttonClose->Top = 0;

                            buttonClose->Left = this->ClientSize.Width - buttonClose->Width;

                            pictureBox1->Width = 800;

                            pictureBox1->Height = 250;

                            pictureBox1->Top = 50;

                            pictureBox1->Left = 0;

フォームへの時刻の表示は以下のコードによる。

                            //

                            //                 時刻の読み込み

                            //

                            SYSTEMTIME SysTime;

                            GetLocalTime( &SysTime );

                            //

                            //                 時刻のビットマップ上への書き出し

                            //

                     String ^s = SysTime.wHour.ToString() + ":" + SysTime.wMinute.ToString() + ":" + SysTime.wSecond.ToString();

                            using System::Drawing::Font;

                            Font ^ fnt = gcnew Font"MS ゴシック", 120, GraphicsUnit::Pixel );

                            Brush ^ bshBl = gcnew SolidBrushColor::Blue );

                            SizeF sizeStr = g->MeasureString( s, fnt );

                            g->DrawString( s, fnt, bshBl, 400 - sizeStr.Width/2, 125 - sizeStr.Height/2 );

                            //

                            //                 ビットマップの画像をpictureBox1に表示

                            //

                            pictureBox1->Image = bm;

この時刻の表示のコードは、timer1によるTickイベントによって行っている。

表示されたフォームは、中央をクリック(タッチ機能付きディスプレイの場合はタッチも可)してドラッグすることにより表示位置を変えることができる(図4)。

図4

 

このフォームのドラッグは、pictureBox1のクリックにより、ckの値が1に設定され、クリックの位置が(x0, y0)に設定されることにより行われる。これは、以下のコードによる。

private: System::Void pictureBox1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                     ck = 1;                          //     ドラッグオン

                     x0 = e->Location.X;

                     y0 = e->Location.Y;

               }

変数ckが1に設定されると、以下のコードによって、マウスによるふぉむのドラッグが行われる。

private: System::Void pictureBox1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                            if ( ck == 1){

                                   //

                                   //                 ドラッグ量に合わせてフォームの移動

                                   //

                                   int dx = e->Location.X - x0;

                                   int dy = e->Location.Y - y0;

                                   int fmx = this->Location.X;

                                   int fmy = this->Location.Y;

                                   this->Location = System::Drawing::Point( fmx + dx, fmy + dy ); 

                            }

                     }

マウスのクリックがオフになると、以下のコードによりck0に設定され、ドラッグが行われなくなる。

private: System::Void pictureBox1_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                     ck = 0;                          //     ドラッグオフ

               }

上で説明したことに関わるプログラム全体のコードは以下のようである。

 

#pragma once

 

#include <Windows.h> //     GetLocalTime を使用するため

 

namespace ClockLargeFont {

 

       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>

       /// MyForm の概要

       /// </summary>

       public ref class MyForm : public System::Windows::Forms::Form

       {

             

             

             

#pragma endregion

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

                            this->Close();

                     }

 

                     Bitmap ^ bm;       //     描画用ビットマップ

                     int ck;                   //     フォームのドラッグのチェック

                     int x0, y0;        //     フォームのドラッグ量の起点

 

                     //

                     //                 時刻の読み込みと表示

                     //

                     void DrawPictureBox(){

                            //

                            //                 ビットマップでの描画のための Graphics型ハンドル g の準備

                            //

                            Graphics ^ g = Graphics::FromImage( bm );

                            //

                            //                 フォームと同じ色で塗りつぶす

                            //

                            Brush ^ bsh = gcnew SolidBrushthis->BackColor );

                            g->FillRectangle( bsh, 0, 0, 800, 250 );

                            //

                            //                 時刻の読み込み

                            //

                            SYSTEMTIME SysTime;

                            GetLocalTime( &SysTime );

                            //

                            //                 時刻のビットマップ上への書き出し

                            //

                     String ^s = SysTime.wHour.ToString() + ":" + SysTime.wMinute.ToString() + ":" + SysTime.wSecond.ToString();

                            using System::Drawing::Font;

                            Font ^ fnt = gcnew Font"MS ゴシック", 120, GraphicsUnit::Pixel );

                            Brush ^ bshBl = gcnew SolidBrushColor::Blue );

                            SizeF sizeStr = g->MeasureString( s, fnt );

                            g->DrawString( s, fnt, bshBl, 400 - sizeStr.Width/2, 125 - sizeStr.Height/2 );

                            //

                            //                 ビットマップの画像をpictureBox1に表示

                            //

                            pictureBox1->Image = bm;

                     }

 

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

                            ck = 0;            //            ドラッグ・オフ

                            //

                            //                 フォームデザインの設定

                            //

                            this->Size = System::Drawing::Size( 800, 350 );

                            buttonClose->Top = 0;

                            buttonClose->Left = this->ClientSize.Width - buttonClose->Width;

                            pictureBox1->Width = 800;

                            pictureBox1->Height = 250;

                            pictureBox1->Top = 50;

                            pictureBox1->Left = 0;

                            //

                            //           描画用ビットマップの生成

                            //

                            bm = gcnew Bitmap( 800, 250 );

 

                            DrawPictureBox();                       //       描画

 

                            timer1->Enabled = true;          //     タイマースタート

                     }

private: System::Void pictureBox1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                            if ( ck == 1){

                                   //

                                   //                 ドラッグ量に合わせてフォームの移動

                                   //

                                   int dx = e->Location.X - x0;

                                   int dy = e->Location.Y - y0;

                                   int fmx = this->Location.X;

                                   int fmy = this->Location.Y;

                                   this->Location = System::Drawing::Point( fmx + dx, fmy + dy ); 

                            }

                     }

                     //

                     //                 タイマーイベントで描画

                     //

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

                            timer1->Enabled = false;

                            DrawPictureBox();

                            timer1->Enabled = true;

                     }

              //

              //                  pictureBoxがマウスでクリックされた

              //

private: System::Void pictureBox1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                     ck = 1;                          //     ドラッグオン

                     x0 = e->Location.X;

                     y0 = e->Location.Y;

               }

               //

               //                        ドラッグ終了

               //

private: System::Void pictureBox1_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                     ck = 0;                          //     ドラッグオフ

               }

};

}

 

 なお、プログラムを圧縮ファイルとしてまとめたものも用意した。圧縮ファイル名ClockLargeFont.zipをクリックしてダウンロードすることができる。ダウンロードした圧縮ファイルは解凍(展開)すればVisual Studio 2012で開くことができる。

 プログラムの実行形式ファイル(.NET Framework 4.5対応)も用意した。実行形式ファイル名ClockLargeFont.exeをクリックしてダウンロード実行することができる。

 

 

フォームのサイズを変える場合

 

上のプログラムでは提示フォームのサイズは固定である。これを、ディスプレイでの表示において適当にサイズを変更できるように以下のように少し変更してみた。作成はVisual C++/CLR 2013を用いた。

このプログラムClockVariableSize.exeを実行すると図5のフォームが表示される。

図5

 

右下の緑の正方形をクリックしてドラッグすることにより、フォームのサイズを変えることができる。これは、以下のコードによって行っている。

 

private: System::Void panel1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                                          ck1 = 1;                                           //            ドラッグオン(フォームのサイズ)

                                          x0 = e->Location.X;

                                          y0 = e->Location.Y;

                                          panel1->BackColor = Color::Orange;

}

private: System::Void panel1_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                                          ck1 = 0;                                           //            ドラッグオフ(フォームのサイズ)

                                          panel1->BackColor = Color::MediumSeaGreen;

}

private: System::Void panel1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                                          if (ck1 == 1){

                                                                      //                          フォームサイズ変更

                                                                      //

                                                                      int dx = e->Location.X - x0;

                                                                      int dy = e->Location.Y - y0;

                                                                      fw += dx;

                                                                      fh += dy;

                                                                      if ((fw > 200) && (fh > 160)){

                                                                                    this->Size = System::Drawing::Size(fw, fh);

                                                                                    buttonClose->Top = 0;

                                                                                    buttonClose->Left = this->ClientSize.Width - buttonClose->Width;

                                                                                    pictureBox1->Width = fw;

                                                                                    pictureBox1->Height = fh - 60;

                                                                                    pictureBox1->Top = 30;

                                                                                    pictureBox1->Left = 0;

                                                                                    panel1->Top = this->ClientSize.Height - panel1->Height;

                                                                                    panel1->Left = this->ClientSize.Width - panel1->Width;

                                                                                    DrawPictureBox();                                                      //                            描画

                                                                      }

                                                                      else{

                                                                                    //                          サイズの変更を行わない

                                                                                    //

                                                                                    fw -= dx;

                                                                                    fh -= dy;

                                                                      }

                                          }

}

 

フォームはデザイン時は図6のように用意している。

図6

 

右下にはPanelコンポーネントが張り付けられている。また、フォームのサイズを可変としたことに対応して、文字の描画を行うコードも少し変更している。詳しいことはソースコードを見て欲しい。

プログラムのソースコードなどは圧縮ファイルClockVariableSize.zipとしてまとめたので、クリックしてダウロード解凍すれば、Visual Studio 2013で開くことができる。

 

 

64ビットアプリケーションとしてビルド

 

なお、大きい画面のディスプレイにおいて、実行時にフォームを拡大したときにエラー(図7)が表示されたときは、プロジェクトを64ビットのものに変更する。64ビット版のプロジェクトへの変更は、以下に説明するように簡単にできる。

図7

 

まず、「Win32」と表示されているテキストボックスの右端の下向き黒小三角形をクリックする(図8)。

図8

 

下にプルダウンメニュリストが表示されるので、「Configuration Manager…」をクリックして選ぶ(図9)。

図9

 

表示されたConfiguration Managerウィンドウにおいて、「Win32」と表示されているボックスの右端のチェック✔印をクリックして表示されるプルダウンメニュリストから「<New…>」をクリックして選ぶ(図10)。

図10

 

表示される「New Solution Platform」ウィンドウにおいて、ボックスの右端のチェック✔印をクリックして提示されるプルダウンメニュから「x64」をクリックして選ぶ(図11)。

図11

 

OK」ボタンをクリックする(図12)。

図12

 

Close」ボタンをクリックする(図13)。

図13

 

64ビット版のプロジェクトに設定されたことを、図14において「x64」と表示されていることにより確認する。

図14

 

64ビット版のプロジェクトに設定されたことにより、メモリが十分に実装されておれば、フォームを引き延ばしてもエラーなく実行されるはずである。

 

なお、Visual C++/CLRによるプログラミングについては、<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>などを参照されたい。

 

Up