チュートリアル : Visual Basic 6.0 アプリケーションから現在のバージョンの Visual Basic へのアップグレード
更新 : 2007 年 11 月
このチュートリアルでは、Visual Basic のグラフィック サンプル アプリケーションを Visual Basic 2008 にアップグレードします。アップグレード プロセスの説明に加えて、グラフィック アーキテクチャにおける Visual Basic 6.0 と Visual Basic 2008 の違いについて重点的に説明します。この情報は、アプリケーションで生じるアーキテクチャ上の問題に対処する場合にも役に立ちます。
この例では、2 つのボタン、1 つのピクチャ ボックス、1 つのタイマ、および 1 つの非表示イメージ コントロールを実装する簡単なサンプル アプリケーションを使用します。頻繁に発生することはありませんが、アプリケーションをアップグレードする場合に直面する可能性のある困難な事例をいくつか挙げます。
メモ : |
---|
このチュートリアルを使用するには、開発コンピュータに Visual Basic 6.0 がインストールされている必要があります。 |
Visual Basic 6.0 アプリケーションを作成するには
Visual Basic 6.0 を開きます。[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスの [標準 EXE] をクリックし、[OK] をクリックします。
PictureBox コントロールをフォームに追加し、下部に空白を残して、フォームの大部分を占めるようにコントロールのサイズを設定します。
AutoRedraw プロパティを True、DrawStyle プロパティを 0-Solid、FillStyle プロパティを 0-Solid に設定します。
2 つの CommandButton コントロールを PictureBox コントロールに追加します。
1 番目の CommandButton を選択し、Name プロパティを ClearPictureBox、Caption プロパティを Clear に設定します。
2 番目の CommandButton を選択し、Name プロパティを ShowImage、Caption プロパティを Show Image に設定します。
Image コントロールをフォームに追加し、Name プロパティを sourceImage、Visible プロパティを False に設定します。
Image コントロールの Picture プロパティをビットマップ イメージに設定します。マイ ピクチャ フォルダ内のいずれかの画像を使用できます。
Timer コントロールをフォームに追加します。Enabled プロパティを False、Interval プロパティを 25 に設定します。
フォームをダブルクリックしてコード エディタを開き、次のコードを入力します。
Option Explicit Private LeftPos As Double Private Sub ClearPictureBox_Click() Picture1.Cls End Sub Private Sub ShowImage_Click() LeftPos = 1 Me.Timer1.Enabled = True End Sub Private Sub Timer1_Timer() If LeftPos <= 0 Then Me.Timer1.Enabled = False Picture1.Print "Visual Basic ROCKS!" Else LeftPos = LeftPos - 0.01 Picture1.Cls Picture1.PaintPicture sourceImage, LeftPos * _ Picture1.Width, 0 End If End Sub
F5 キーを押してアプリケーションを実行します。ボタンをクリックして動作を確認し、コードを 1 ステップずつ進みながらその動作を確認します。
[ファイル] メニューの [名前を付けてプロジェクトの保存] をクリックします。
[名前を付けてファイルを保存] ダイアログ ボックスで、フォームを PicForm.frm として保存し、プロジェクトを Drawing.vbp として保存します。
アップグレード ウィザードを実行するには
Visual Basic 2008 を開きます。[ファイル] メニューの [プロジェクトを開く] をクリックします。
[プロジェクトを開く] ダイアログ ボックスで、Drawing.vbp ファイルを探してそれを開きます。
これにより、Visual Basic アップグレード ウィザードが起動します。最初のページに、ウィザードが実行する操作についての説明が表示されます。
[次へ] をクリックして、ウィザードの次のページに移動します。このページにはアップグレードのオプションが表示されますが、この場合は、選択できるオプションはありません。
[次へ] をクリックして、ウィザードの 3 ページ目に進みます。[次へ] をクリックして新規プロジェクトの既定の場所を受け入れるか、別の場所を入力します。既定の場所を受け入れた場合、新しいフォルダは Visual Basic 6.0 プロジェクト フォルダの直下に作成されます。
新しくフォルダを作成するかどうかを確認するメッセージが表示された場合は [はい] をクリックします。
ウィザードの 4 ページ目で、[次へ] をクリックしてアップグレードを開始します。
アップグレードが完了すると、ウィザードが終了し、ソリューション エクスプローラに新しいプロジェクトが表示されます。
アップグレード結果を表示するには
ソリューション エクスプローラで _UpgradeReport.htm を選択し、ダブルクリックしてアップグレード レポートを開きます。
このレポートには、対処の必要なグローバルな問題は報告されません。PicForm.vb については、6 つのエラーが示され、警告は示されません。
メモ : 警告がある場合は、[タスク一覧] ウィンドウに UPGRADE_WARNING アイテムとして表示されます。警告は、アプリケーションの実行時の動作に多少の相違が生じる原因となるコードを示します。[タスク一覧] で UPGRADE_WARNING をダブルクリックすると、変更が必要なコードに直接移動できます。
PicForm.vb セクションを展開するには、New Filename 列のプラス記号をクリックします。これにより、フォームのアップグレードに関する問題の詳細な一覧が表示されます。
問題は 3 か所 (ClearPictureBox_Click プロシージャ、Timer1_Timer プロシージャ、およびフォーム レイアウト) に対して適用されることに注意してください。各問題を説明するヘルプ トピックを表示するには、[説明] リンクをクリックします。この場合、レイアウトの問題に対する処理は必要ありません。ヘルプを確認すると、この問題は Visual Basic 6.0 PictureBox コントロールの 2 つのプロパティに相当するプロパティが Visual Basic 2008 に存在しないことが原因であることがわかります。
ClearPictureBox_Click エラーを修正するには
ソリューション エクスプローラで PicForm.vb を選択します。[表示] メニューの [コード] をクリックします。
コード エディタで、ClearPictureBox_Click プロシージャを選択します。
ヒント : プロシージャには、UPGRADE_ISSUE コメントが追加されています。このコメントの最後までスクロールすると、関連するヘルプ トピックをクリックして表示するためのリンクが用意されています。レイアウトの問題を除くすべての問題は、アップグレード時にコードのコメントとして追加されます。このコメントには、アップグレード時に生じた問題について説明する UPGRADE_NOTE コメントが含まれます。これはアップグレード レポートには報告されません。
ClearPictureBox_Click プロシージャに次のコードを追加します。
Dim g As Graphics = Picture1.CreateGraphics() g.Clear(Picture1.BackColor) g.Dispose()
元のプロシージャの唯一のエラーは、Picture1.Cls() メソッド呼び出しです。Visual Basic 6.0 とは異なり、Visual Basic 2008 の組み込みコントロールでは、メソッドによる描画サーフェイスへの直接アクセスは用意されていません。すべてのグラフィックス操作は、Graphics 型の特別なオブジェクトによって処理されます。CreateGraphics() メソッドを呼び出すことにより、コントロールの描画サーフェイスにアクセスして、Graphics オブジェクトのインスタンスを取得できます。
元の行の Picture1.Cls() を削除するか、またはコメント アウトします。
Timer1_Timer エラーを修正するには
コード エディタで、Timer1_Tick プロシージャを選択します。
メモ : Visual Basic 6.0 Timer コントロールの Timer イベントは、Visual Basic 2008Timer コンポーネントの Tick イベントにアップグレードされます。アップグレード レポートには従来のイベント名が示され、コード エディタでは新しいイベント名が使用されます。
関数の先頭に次のコードを追加します。
Dim g As Graphics = Picture1.CreateGraphics()
前のプロシージャと同様、このエラーも Graphics オブジェクトが不足していることに起因します。
最初の UPGRADE_ISSUE である Picture1.Print メソッドを検索します。次のコードを追加します。
g.DrawString("VB .NET ROCKS!", Me.Font, New SolidBrush( _ Color.Yellow), 0, 0)
Graphics オブジェクトの DrawString メソッドが、Visual Basic 6.0 の Print メソッドに置き換わります。Print メソッドが 1 つの Text 引数を受け取るのに対して、DrawString も、Font、Color オブジェクトを指定する Brush オブジェクト、およびテキストを描画する開始座標を指定する引数を受け取ります。
元の行の Picture1.Print("Visual Basic ROCKS!") を削除するか、またはコメント アウトします。
次の UPGRADE_ISSUE である Picture1.Cls() を検索します。このコードを次のコードを使って置き換えます。
g.Clear(Picture1.BackColor)
最後の UPGRADE_ISSUE である Picture1.PaintPicture を検索します。次のコードを追加します。
g.DrawImage(sourceImage.Image, CSng(LeftPos * Picture1.Size.Width), _ 0)
ここでは、Graphics クラスの DrawImage メソッドが PaintPicture メソッドに置き換えられています。
元の行の Picture1.PaintPicture(sourceImage, LeftPos * VB6.PixelsToTwipsX(Picture1.Width), 0) を削除するか、またはコメント アウトします。
プロシージャの最後に次のコードを追加します。
g.Dispose()
Graphics オブジェクトに関連付けられたメモリ リソースを解放するには、Dispose メソッドが必要です。
アプリケーションをテストするには
[デバッグ] メニューの [開始] をクリックします。
メモ : ソリューション ファイルを保存するかどうかを確認するメッセージが表示されたら、[保存] をクリックしてファイルを保存し、アプリケーションを実行します。
[ShowImage] をクリックします。
イメージの描画時に、ちらつきが生じることがあります。これは、更新された各イメージが画面に描画される前に、領域全体がクリアされるためです。
アプリケーションのさらなる変更
これを解決するには、Graphics オブジェクトで領域全体を描画するのではなく、画面内の必要な箇所だけを描画する必要があります。画面上にイメージを描画するときに、DrawImage() への最後の呼び出しの後に残ったピクセルを背景色で隠すことが必要な場合があります。イメージは右から左に移動するため、隠す必要があるのは、ピクチャの右側の余分なピクセルだけです。
画面のちらつきの問題を修正するには
Timer1_Tick プロシージャで、g.Clear(Picture1.BackColor) メソッドを次のコードに置き換えます。
Dim imageWidth As Integer = sourceImage.Image.Width Dim imageHeight As Integer = sourceImage.Image.Height Dim left As Double = imageWidth + (Picture1.Size.Width * LeftPos) g.FillRectangle(New SolidBrush(Me.BackColor), _ New Rectangle(left, 0, 6, imageHeight))
Clear メソッドの代わりに FillRectangle メソッドを使用して、描画中の現在のイメージの右側の残留ピクセルを背景色を使って隠します。これを行うには、最初に四角形の左端の座標を計算する必要があります。これは先頭の 3 行のコードによって実現されます。
[デバッグ] メニューの [開始] をクリックします。
[ShowImage] をクリックします。
今度はイメージを移動してもちらつきは発生しません。
修正が必要な問題は、もう 1 つあります。PictureBox コントロールに表示されるメッセージのフォントが、元のバージョンのフォントよりも小さいことです。フォントが小さいのは、Visual Basic 6.0 アプリケーションで、デザイン時に PictureBox コントロールの Font プロパティが Arial Bold 16 に設定されていたためです。Visual Basic 2008 の PictureBox コントロールには、Font プロパティはありません。代わりに、フォームの既定フォント (Me.Font) が使用されます。既定フォントは、新しい Font オブジェクトを宣言することで修正できます。
フォントを修正するには
Timer1_Tick プロシージャに次の宣言を追加します。
Dim f As System.Drawing.Font = New System.Drawing.Font("Arial", _ 16, FontStyle.Bold)
g.DrawString の呼び出しで、フォント パラメータを Me.Font から f に変更します。
[デバッグ] メニューの [開始] をクリックします。
[ShowImage] をクリックします。
これで、テキストが適切なフォントで表示されます。
これで、アプリケーションは元の Visual Basic 6.0 アプリケーションと等価な状態になりました。次に、このアプリケーションを強化するコードを追加します。結局のところ、Visual Basic 2008 を利用する必要がない場合は、アプリケーションをアップグレードしても意味はありません。
次の手順では、フォームを閉じるときにフェード アウトする機能を追加します。
メモ : |
---|
フェード効果は 256 色のディスプレイでは表示できません。この効果を表示するには、画面の色を High Color または True Color に設定する必要があります。Opacity プロパティは、Windows XP だけで使用できます。 |
アプリケーションを強化するには
コード エディタで、[クラス名] ボックスの一覧の [(Form1 Events)] をクリックします。
[メソッド名] ボックスの一覧で FormClosing イベントを選択します。
Form1_FormClosing プロシージャに次のコードを追加します。
Dim i As Single For i = 1 To 0 Step -0.1 Me.Opacity = i Application.DoEvents() System.Threading.Thread.Sleep(100) Next
[デバッグ] メニューの [開始] をクリックします。
フォームを閉じてフェード アウトの動作を確認します。
Step のサイズを増やすか、または Sleep の遅延を減らすことによって、フェード アウトのスピードを制御できます。
参照
概念
グラフィックス (Visual Basic 6.0 ユーザー向け)