22
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VB.NETでGUIアプリ入門(.NET Framework 4.x)

Last updated at Posted at 2020-07-08

■はじめに

Visual Basic .NET(VB.NET)と.NET FrameworkでGUIアプリを作ってみます。

■環境

  • Windows 10
  • Visual Studio 2019 Community
  • .NET Framework 4.8

■準備

Visual Studio 2019のコミュニティ版をダウンロードしてインストールします。

Visual Studio 2019 for Windowsのダウンロード

インストールが終わったらVisual Studio Installerを起動し、ワークロードタブの.NET デスクトップ開発にチェックが入っていることを確認します。チェックが入っていなかったらチェックを入れてインストールします。
vb001a.png

■STEP1. 画面を表示する

◇1-1. プロジェクトの作成

Visual Studio 2019を起動します。
新しいプロジェクトの作成ボタンを押します。
vb001b.png

右上のドロップダウンリストからVisual Basic, Windows, デスクトップを選択して候補を絞り込み、
WPFアプリ(.NET Framework)を選択して次へボタンを押します。
vb002.png

プロジェクト名を付けます。ここではGuiTest1にしました。
フレームワークを選択します。ここでは4.8にしました。4.8が選択肢にない場合、なるべく新しいバージョン(4.5以上)を選択してください。
作成ボタンを押します。
vb003.png

編集画面が表示されました。
vb004.png

各エリアの名称と役割は以下の通りです。

  • (1)ツールボックス
    • 配置できるコントロールが一覧表示されています。
  • (2)デザイナー デザインエリア(以後「画面デザイナ」と表記)
    • 画面イメージです。
  • (3)デザイナー XAMLエリア(以後「Xamlエディター」と表記)
    • 画面定義です。
  • (4)ソリューションエクスプローラー
    • プログラムのファイル構成が表示されます。

そしてこれがコントロールの設定値(プロパティ)を編集するためのプロパティウィンドウです。

レイアウト例1)
vb101.png
レイアウト例2)
vb102.png

これらが表示されていない場合、表示メニューから表示させてください。
vb005.png

◇1-2. Visual Studioから実行

まずはいきなり実行してみます。
ツールバーの開始ボタンを押してください。
EXEファイルが作成され、プログラムが起動します。
vb004b.png

まっさらな画面が表示されました。
×ボタンで終了してください。
vb004c.png

◇1-3. 直接EXEを実行

さきほど実行したときにEXEが作られたので今度はエクスプローラーから直接実行してみます。
ソリューションエクスプローラーでプロジェクトGuiTest1を右クリックし、エクスプローラーでフォルダを開くを選択してください。
vb004d.png

エクスプローラーが起動するので binDebugとフォルダを開いていってください。
vb004e.png
 ↓
vb004f.png

GuiTest1.exeをダブルクリックしてください。
先ほどと同じ画面が表示されました。
×ボタンで閉じてください。
vb004g.png

■STEP2. StackPanelとボタン

次はボタンをいくつか配置してみます。

◇2-1. 土台をGridからStackPanelに変更

コントロールを配置する前に、土台となる部分をGridからStackPanelに変更します。
画面デザイナ中のウィンドウの白い部分(Grid)で右クリックし、レイアウトの種類の変更 - StackPanelを選択します。
vb100.png

画面デザイナ上では見た目の変化はありませんが、XamlエディターのGridタグがStackPanelタグに変わりました。
ツールボックスからButtonStackPanelにドラッグ&ドロップします。
vb101.png

◇2-2. ボタン配置

Buttonが追加されました。
位置やサイズを指定しなくても自動的に上端に配置されます。
引き続き、追加で2つボタンをドラッグ&ドロップします。
vb102.png

積み重なるようにButtonが配置されました。
これがStackPanelの機能です。
vb103.png

◇2-3. ボタンのプロパティ変更

真ん中のButtonを選択し、プロパティウィンドウで共通 - Contentプロパティにぼたんと入力してEnterしてください。
画面デザイナのボタンテキストとXamlエディターに反映されます。
vb104.png

一番下のButtonを選択し、プロパティウィンドウでブラシ - Backgroundプロパティを選択し、右端のブラシリソースタブを選択、InfoBrushKeyを選択します。
これでボタン背景色が変わります。
vb105.png

◇2-4. ボタンクリック処理の作成

一番上のボタンをダブルクリックします。
vb106.png

自動的にコードエディタに移動します。
MainWindow.xamlのタブがデザイナー、MainWindow.xaml.vbのタブがコードです。
vb107.png

メッセージボックスを表示するコードを書きます。

MainWindow.xaml.vb
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    MessageBox.Show("こんにちは")
End Sub

◇2-5. 実行

ここまで作成したら開始ボタンを押して実行してみます。
vb108.png

一番上のボタンを押すとメッセージボックスが表示されます。
vb109.png

メッセージボックスと画面を閉じてください。

◇2-6. 共通ボタン処理

次は別の方法でボタンクリック時の処理を作ります。
画面デザイナで真ん中のボタンを選択し、プロパティウィンドウの稲妻マークを選択してください。
ボタンに設定できるイベントの一覧が出てきます。
(プロパティの一覧に戻るには、稲妻マークの左にある工具のマークをクリックしてください)
vb110.png

Clickイベントにボタンクリック共通処理と入力してEnterしてください。
vb110.png

コードを以下のように書いてください。
'から始まる行はコメントです。

MainWindow.xaml.vb
Private Sub ボタンクリック共通処理(sender As Object, e As RoutedEventArgs)
    ' 押されたボタンのテキストをタイトルバーに表示
    Me.Title = CType(sender, Button).Content & "が押されました。"
End Sub

引数のsenderには押したボタンが渡されるので、そのボタンのテキスト(Content)をウィンドウのタイトルバーに表示します。

MainWindow.xamlのタブを選択してデザイナーに戻り、
真ん中のボタンに設定したClickイベントの ボタンクリック共通処理の文字列をコピーし、
一番下のボタンを選択し、Clickイベントに貼り付けてEnterしてください。
vb111.png

ここまででXamlのStackPanel配下は以下のようになっているはずです。
(見やすいように改行を入れています)

MainWindow.xaml
<StackPanel>
    <Button 
        Content="Button" 
        Click="Button_Click"/>
    <Button 
        Content="ぼたん" 
        Click="ボタンクリック共通処理"/>
    <Button 
        Content="Button" 
        Background="{DynamicResource {x:Static SystemColors.InfoBrushKey}}" 
        Click="ボタンクリック共通処理"/>
</StackPanel>

◇2-7. 実行

実行してみます。
開始ボタンを押し、画面が表示されたら真ん中のボタンを押します。
vb112.png

次は一番下のボタンを押してみます。
vb113.png

1つのボタンクリック処理を2つのボタンで利用しました。

■STEP3. 別画面表示

別の画面を表示する処理を作ってみます。

◇3-1. 画面追加

ソリューションエクスプローラーのGuiTest1プロジェクトを右クリック、追加 - ウィンドウを選択します。
vb201.png

名前にWindow1.xamlが指定されているのでそのまま追加ボタンを押します。
vb202.png

新しい画面が追加されました。
vb203.png

◇3-2. 画面表示処理作成

MainWindow.xamlタブを選択します。
Buttonを新たに追加し、Contentプロパティに画面表示を設定します。
vb204.png

稲妻マークを選択し、Clickのテキストボックス内をダブルクリックします。
vb205.png

コードエディタに移動するので先ほど追加したWindow1を生成して表示する処理を書きます。

MainWindow.xaml.vb
Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
    Dim window = New Window1()
    window.ShowDialog()
End Sub

◇3-3. 実行

実行してみます。
画面表示ボタンを押すとWindow1が表示されました。
vb206.png

■STEP4. Gridと計算

次はGridを使ってみます。

◇4-1. Grid分割

まずは画面のGridを以下のように分割します。
vb026b.png

画面デザイナでGridを選択した状態で下図の赤く塗ったあたりにマウスカーソルを持っていくと+マークが付きます。
vb301.png

マウスカーソルが変わったらクリックします。
vb302.png

分割されました。
vb303.png

もう一列分も分割します。
vb304.png

横も分割します。
vb305.png

vb306.png

◇4-2. 分割サイズ変更

分割の割合を調整します。
(1)で囲ったあたりにマウスカーソルをポイントします。
(2)の数字部分に1*を入力します。
vb307.png

1列目が見えなくなりましたが、気にせず2列目に2*を入力します。
vb308.png

3列目に3*を入力します。
1行目に1*を入力します。
vb309.png

2行目に4*を入力します。
vb310.png

2*1*の2倍のサイズ、3*1*の3倍のサイズという意味です。

◇4-3. Gridに配置

◎4-3-1. 左側(Rectangle)

ツールボックスからRectangleをGridの左上のマスにドラッグ&ドロップします。
プロパティウィンドウでブラシ - Fillを選択します。
単色ブラシタブを選択し、色を適当に選択します。
vb311.png

配置したRectangleを選択し、プロパティウィンドウのレイアウトを確認します。

プロパティ 設定値 説明
Row 0 行位置。0始まりで上から。
Column 0 列位置。0始まりで左から。
RowSpan 2 行結合数。
ColumnSpan 1 列結合数。

vb312.png

Rectangleを右クリックし、レイアウト - すべてリセットを選択します。
vb313.png

位置・サイズ情報がクリアされて領域いっぱいに表示されました。
vb314.png

◎4-3-2. 上側(足し算)

StackPanelを上段2列目にドラッグ&ドロップします。

vb315.png

レイアウトを以下のように設定します。

プロパティ 設定値 説明
Row 0 行位置。0始まりで上から。
Column 1 列位置。0始まりで左から。
RowSpan 1 行結合数。
ColumnSpan 1 列結合数。

配置したStackPanelを右クリックし、レイアウト - すべてリセットを選択します。
プロパティでブラシ - Backgroundを選択し、単色ブラシタブを選択します。
RGBを以下のように設定します。

プロパティ 設定値
R 240
G 255
B 240

vb316.png

緑のStackPanelOrientationプロパティを横配置のHorizontalに変更します。
vb317.png

TextBoxk, TextBlock, TextBoxの順に配置します。
vb318.png

2つのTextBoxを一度にプロパティ設定します。
左側のTextBoxを選択し、次にCtrlキーを押しながら右側のTextBoxを選択します。
そうするとプロパティの名前の部分が2個のオブジェクトが選択されていますになります。
vb319.png

以下のようにプロパティを設定します。

プロパティ 設定値 説明
Width 50
Height 30 高さ
Margin左 10 他のコントロールとの左余白
Margin右 10 他のコントロールとの右余白
Text 空欄 テキスト内容

vb320.png

TextBoxの間にあるTextBlockを選択し、以下のようにプロパティを設定します。

プロパティ 設定値 説明
VerticalAlignment Center 縦位置
FontSize 18 文字サイズ
Text + テキスト内容

vb321.png

配置したコントロールが多くなってきたため、ドキュメントアウトラインを使うようにします。
メニューの表示 - その他のウィンドウ - ドキュメントアウトラインを選択します。
vb322.png

ButtonをドキュメントアウトラインのStackPanel上にドラッグ&ドロップします。
vb323.png

vb324.png

ボタンのプロパティを設定します。

プロパティ 設定値 説明
名前 CalcButton コントロール名
Width 30
VerticalAlignment Center 縦位置
FontSize 18 文字サイズ
Content = ボタンテキスト内容

vb325.png

テキストボックスにも名前を付けます。
左側をNum1Text, 右側をNum2Textにします。
vb326.png

画面デザイナでボタンをダブルクリックします。
vb327.png

テキストボックスに入力された数値を足した結果をタイトルバーに表示する処理を書きます。

Window1.xaml.vb
Private Sub CalcButton_Click(sender As Object, e As RoutedEventArgs) Handles CalcButton.Click
    Dim num1 As Integer
    Dim num2 As Integer
    Dim total As Integer

    ' Num1Textに数値が入力されているか?
    If Integer.TryParse(Num1Text.Text, num1) Then
        ' Num2Textに数値が入力されているか?
        If Integer.TryParse(Num2Text.Text, num2) Then
            ' 計算してタイトルバーに表示
            total = num1 + num2
            Me.Title = $"{num1} 足す {num2} は {total} です。"
            Exit Sub
        End If
    End If

    Me.Title = "計算失敗"
End Sub

Integer.TryParseで1つ目の引数の文字列が数値に変換できるか確認します。
数値に変換できる場合、2つ目の引数に変換後の数値が設定され、戻り値がTrueで返ってきます。

先頭に$を付けた""で囲った文字列は、{変数名}で変数の中身を文字列中に埋め込むことができます。

◇4-4. 実行

実行してみます。
Window1を表示し、テキストボックスに数値を入力して=ボタンを押します。
タイトルバーに計算結果が表示されました。
vb328.png

■STEP5. WrapPanelとファイル読み書き

◇5-1. 画面追加

新しい画面を追加します。
ソリューションエクスプローラーのGuiTest1プロジェクトを右クリック、追加 - ウィンドウを選択します。
名前にWindow2.xamlが指定されているのでそのまま追加ボタンを押します。
vb401.png

◇5-2. 土台をGridからWrapPanelに変更

GridWrapPanelに変更します。
vb402.png

◇5-3. コントロール配置

ドキュメントアウトラインのWrapPanelStackPanelを2つドラッグ&ドロップします。
vb403.png

ドキュメントアウトラインで2つのStackPanelを選択状態(1つ目でクリック、2つ目でCtrlを押しながらクリック)にします。
そしてWidthプロパティに450を設定します。
vb404.png

1つ目のStackPanelTextBox, Buttonの順にドラッグ&ドロップします。
2つ目のStackPanelButton, TextBoxの順にドラッグ&ドロップします。
vb405.png

◇5-4. プロパティ設定

一番上のTextBoxのプロパティ設定をします。

プロパティ 設定値 説明
名前 InputText コントロール名
Height 100 高さ
Margin左 10 他のコントロールとの左余白
Margin右 10 他のコントロールとの右余白
Margin上 10 他のコントロールとの上余白
Margin下 10 他のコントロールとの下余白
VerticalScrollBarVisibility Visible 縦スクロールバー
AcceptsReturn True テキスト内で改行するか

vb406.png

その下のButtonのプロパティ設定をします。

プロパティ 設定値 説明
名前 SaveButton コントロール名
Width 150
HorizontalAlignment Left 横位置
Margin左 10 他のコントロールとの左余白
Margin下 10 他のコントロールとの下余白
Content 保存 ボタンのテキスト

vb407.png

下のStackPanel内のButtonのプロパティ設定をします。

プロパティ 設定値 説明
名前 LoadButton コントロール名
Width 150
HorizontalAlignment Left 横位置
Margin左 10 他のコントロールとの左余白
Margin上 10 他のコントロールとの上余白
Content 開く ボタンのテキスト

vb408.png

一番下のTextBoxのプロパティ設定をします。

プロパティ 設定値 説明
名前 LoadText コントロール名
Height 100 高さ
Margin左 10 他のコントロールとの左余白
Margin右 10 他のコントロールとの右余白
Margin上 10 他のコントロールとの上余白
Margin下 10 他のコントロールとの下余白
VerticalScrollBarVisibility Visible 縦スクロールバー
IsReadOnly True 読み取り専用

vb409.png

vb410.png

◇5-5. レイアウト確認用コントロール配置

WrapPanelの効果がわかりやすくなるよう、WrapPanelCheckBoxを4つ、ドラッグ&ドロップします。
vb411.png

◇5-6. ファイル保存処理作成

画面デザイナで保存ボタンをダブルクリックします。
vb412.png

以下の処理を書きます。

Window2.xaml.vb
Private Sub SaveButton_Click(sender As Object, e As RoutedEventArgs) Handles SaveButton.Click
    ' 保存ダイアログの生成
    Dim dialog = New SaveFileDialog()

    ' 保存ダイアログの設定
    dialog.FileName = "GuiTest1ファイル.txt"
    dialog.Filter = "すべてのファイル|*.*|テキストファイル|*.txt"
    dialog.FilterIndex = 2

    ' 保存ダイアログ表示
    If dialog.ShowDialog() <> True Then
        ' キャンセル
        Exit Sub
    End If

    ' ファイル保存処理
    Using stream = dialog.OpenFile()
        Using writer = New StreamWriter(stream, Encoding.UTF8)
            Dim lineCnt As Integer = InputText.LineCount
            For i As Integer = 0 To lineCnt - 1
                ' 一行書き込み
                writer.Write(InputText.GetLineText(i))
            Next i
        End Using
    End Using
End Sub

◇5-7. 実行

動作確認をするため、Window2を表示するためのコードを書きます。
MainWindowにButtonを追加、ダブルクリックし、以下のコードを書きます。

MainWindow.xaml.vb
Private Sub Button_Click_2(sender As Object, e As RoutedEventArgs)
    Dim window = New Window2()
    window.ShowDialog()
End Sub

実行してみます。
追加したボタンを押してWindow2を表示し、上のテキストボックスに何か入力します。
vb413.png

保存ダイアログが表示されるので、保存先を指定して保存ボタンを押します。
vb414.png

保存されたファイルを開いてみます。
vb415.png

◇5-8. ファイル読み込み処理作成

画面デザイナで開くボタンをダブルクリックします。
vb416.png

以下の処理を書きます。

Window2.xaml.vb
Private Sub LoadButton_Click(sender As Object, e As RoutedEventArgs) Handles LoadButton.Click
    '開くダイアログの生成
    Dim dialog = New OpenFileDialog()

    '開くダイアログの設定
    dialog.FileName = "GuiTest1ファイル.txt"
    dialog.Filter = "すべてのファイル|*.*|テキストファイル|*.txt"
    dialog.FilterIndex = 2

    ' 開くダイアログ表示
    If dialog.ShowDialog() <> True Then
        ' キャンセル
        Exit Sub
    End If

    ' ファイルを開く処理
    Using Stream = dialog.OpenFile()
        Using reader = New StreamReader(Stream, Encoding.UTF8)
            ' 一気に読み込み
            LoadText.Text = reader.ReadToEnd()
        End Using
    End Using
End Sub

◇5-9. 実行

実行してみます。
開くボタンを押して、先ほど保存したファイルを開きます。
vb417.png

読み込まれました。
vb418.png

◇5-10. WrapPanel動作確認

最後にWrapPanelの効果を確認しやすくするため、上のStackPanelを選択し、Backgroundプロパティでグラデーションブラシタブを選択します。
vb419.png

ウィンドウのサイズを変更しやすくするため、サイズ変更グリップを表示します。
画面デザイナ内のウィンドウのタイトルバーを選択してWindowを選択状態にします。
ResizeModeプロパティをCanResizeWithGripに設定します。
vb420.png

実行してみます。
ウィンドウ幅を拡大したり縮小したりしてみます。
ウィドウサイズを変えるときは、右下のグリップをつかむとやりやすいです。
vb422.png

十分に幅を広げるとStackPanelが横に並びます。
入りきらない分は下に回り込みます。
StackPanelで一つの塊なので、幅を広げても中のボタンが横に移動することはありません。
vb421.png

22
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?