Windows アプリケーションの作成

Cc440905.download(ja-jp,MSDN.10).gif サンプル コードのダウンロード (vbmigtips_winform.exe, 102 KB)

Visual Basic 6.0 で作成していたのと同様に、Visual Basic .NET でも Windows フォームを利用することで Windows アプリケーションを作成することができます。
また、Visual Basic .NET では、Windows アプリケーションを作成するに当たり、便利な機能が追加されました。ウィンドウの大きさにかかわらず、コントロールの距離間を一定に保つことのできる設定や、Tab キーによる フォーカスを移動させる順序の設定を簡単に行うことのできる機能などが追加されました。また、特殊な動作をするフォームを作成する場合などでも、とても便利となります。そこで、Visual Basic .NET ではどれだけ簡単に実装できるかを紹介します。

図1 のアプリケーションは、数字入力を行うソフトウェアキーボードです。このアプリケーションは、非アクティブなフォーム(アクティブにならない)で、常に最前面に表示されます。各ボタンを押すと、アクティブなアプリケーションに数字が入力されます。

 Cc440905.winapp_fig01(ja-jp,MSDN.10).gif
 図1

フォームを常に最前面に表示する場合、Visual Basic 6.0 では、Win32 API の SetWindowsPos を使用し、フォームを非アクティブにする場合は、Win32 API の GetWindowLong を使用します。実装方法は以下のとおりです。
まず、最前面にする SetWindowsPos と非アクティブの設定を行う GetWindowLong の定数と宣言を行います。標準モジュールを追加し、以下のコードを記述します。

Public Const HWND_TOPMOST = (-1)
Public Const SWP_SHOWWINDOW = &H40&
Public Const SWP_NOSIZE = &H1&
Public Const SWP_NOMOVE = &H2&

Public Const WS_EX_NOACTIVATE = &H8000000
Public Const GWL_EXSTYLE = (-20)

Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

リスト1

フォームを最前面に表示する場合、上記で宣言した SetWindowPos を呼び出し、フォームを非アクティブに設定する場合は、GetWindowLong を呼び出します。呼び出し方法を以下のとおりです。

Private Sub Form_Load()
lngRet = SetWindowPos(Form1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, _
SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE)
Call SetWindowLong(Me.hWnd, GWL_EXSTYLE, GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_NOACTIVATE)
End Sub

Private Sub KeyButton_Click(Index As Integer)
SendKeys CStr(Index)
End Sub

リスト2

SetWindowPos の第 1 引数で最前面に表示するフォームのオブジェクト名を指定し、第 2 引数でフォームを常に最前面に表示されるように指定します。「SendKeys CStr(Index)」では各ボタンの数字をアクティブなアプリケーションに送ります。
上記(リスト1とリスト2)のコードを実装することで、表示した Form1 は、常に最前面に表示され、さらに非アクティブなフォームに設定されます。各ボタンを選択すると、アクティブになっているアプリケーションに数字キー ストロークが送られます。

フォームを常に最前面に表示する場合、Visual Basic 6.0 では上記のように、SetWindowsPos を使用して実装しましたが、Visual Basic .NET では、フォームの TopMost プロパティの設定を「True」にするだけで、Fom1 を常に最前面に表示することができます。
一方、フォームをアクティブにならないよう設定するためのプロパティは、Visual Basic .NET でもサポートされていないため、CreateParams をオーバーライドして実装します。実装コードは以下の通りです。

Private Const WS_EX_NOACTIVATE As Integer = &H8000000
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim p As CreateParams = MyBase.CreateParams
If Not MyBase.DesignMode Then
p.ExStyle = p.ExStyle Or (WS_EX_NOACTIVATE)
End If
Return p
End Get
End Property

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
Button0.Click, Button1.Click, Button2.Click, Button3.Click, Button4.Click, _
Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click
SendKeys.Send((CType(sender, Button)).Text)
End Sub

リスト3

Visual Basic .NET では非アクティブにするプロパティはサポートされていませんが、Visual Basic 6.0 のように Win32API を呼び出す必要がないため、簡単に実装することができます。
さらに、Visual Basic .NET で追加された、便利な機能を使用すると、図2 のようにフォームの透明度を簡単に変更したりすることができます。

 Cc440905.winapp_fig02(ja-jp,MSDN.10).gif
 図2

図2 は、Form1 の Opacity プロパティの設定を「50%」に変更しました。このほかにも、コントロールのアンカーを設定することができる Anchor プロパティを設定することで、コントロールとコントロールの距離を一定に保つことができるようになります。

このように、Visual Basic .NET の Windows フォームを使用することで、ユーザー インターフェイス機能を持つアプリケーションを簡単に作成することができます。Visual Basic 6.0 では、Win32API などを使用して実装していた機能が .NET Framework の提供により、簡単に実装することができるようになりました。