Windows Phone Tips集 第3弾 6

ロジックコードを記述する

次に、MainPage.xamlを展開して表示されるMainPage.xaml.vbをダブルクリックして、リスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainPage.xaml.vb)

Option Strict On
Imports System.IO

Silverlightイメージングに関連する型の含まれるSystem.Windows.Media.Imaging名前空間をインポートします。
Imports System.Windows.Media.Imaging

PhotoCameraを使用するのに必要なクラスの含まれる、Microsoft.Devices名前空間をインポートします。
Imports Microsoft.Devices

Imports Microsoft.Phone.Controls

BarCodeをスキャンするのに必要なクラスの含まれる、WP7_Barcode_Library名前空間をインポートします。
Imports WP7_Barcode_Library

Partial Public Class MainPage
  Inherits PhoneApplicationPage

  ' コンストラクター
  Public Sub New()
    InitializeComponent()
  End Sub
PhotoCameraクラス型のメンバ変数myCameraを宣言します。
  Dim myCamera As PhotoCamera

ページが読み込まれた時の処理

AddHandlerステートメントで、実機のシャッターボタンが長押しされた時に発生する、ShutterKeyHalfPressedイベントに、CameraButtons_ShutterKeyHalfPressedイベントハンドラを追加します。
  Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    AddHandler CameraButtons.ShutterKeyHalfPressed, AddressOf CameraButtons_ShutterKeyHalfPressed
  End Sub

ページがアクティブになった時の処理

カメラの指定されたタイプでPhotoCameraクラスの新しいインスタンスを初期化します。CameraType.Primaryは、カメラがデバイスの背面に位置していることを意味します。VideoBrushのSetSourceメソッドで、PhotoCameraのキャプチャソースを使用して、VideoBrushのソースを設定します。
  Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs)
    myCamera = New PhotoCamera(CameraType.Primary)
    myVideoBrush.SetSource(myCamera)
    MyBase.OnNavigatedTo(e)
  End Sub

実機のシャッターボタンが長押しされた時に発生する処理

Rectangleコントロールが表示状態にある場合は、Focusメソッドで、カメラのオートフォーカスの動作を開始します。
  Private Sub CameraButtons_ShutterKeyHalfPressed(sender As Object, e As EventArgs)
    If Rectangle1.Visibility = Windows.Visibility.Visible Then myCamera.Focus()
  End Sub

[Shutter] ボタンがタップされた時の処理

画像の現在の解像度の、Widthの値を変数xに格納します。同様に、Heightの値を変数yに格納します。PhotoCameraオブジェクトのPreviewBufferを保持している、整数の配列を作成します。画像の現在の解像度のWidthとHeightで初期化された、WriteableBitmapの新しいインスタンス、wbオブジェクトを生成します。PhotoCamera.GetPreviewBufferArgb32メソッドで、さらなる操作のためのバッファに、現在のファインダーのARGBのフレームをコピーします。その後、配列が、wbと呼ばれるWriteableBitmapオブジェクトのピクセルにコピーされます。
新しいMemoryStreamのインスタンスmsオブジェクトを作成します。新しいBitmapImageのインスタンス、bmpオブジェクトを作成します。WriteableBitmapクラスのSaveJpegメソッドを使用して、キャプチャされた画像は、BitmapImageを作成するために使用されているMemoryStreamオブジェクトとして書き出されます。BitmapImageのSetSourceメソッドにMemporyStreamクラスのオブジェクトmsを指定します。
スキャンが完了した時に呼び出されるメソッド(BarcodeResults_Finished)と共に、WP7BarcodeManager.ScanBarcodeメソッドのパラメータが呼び出されます。
PhotoCameraクラスのCaptureImageメソッドで、ファインダー内に表示されている画像の、フル解像度のキャプチャを開始します。Try~Catch~ End Tryで例外処理を行っています。
  Private Sub shutterButton_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles shutterButton.Click
    Dim x As Integer = 0
    Dim y As Integer = 0
 
    x = CInt(myCamera.PreviewResolution.Width)
    y = CInt(myCamera.PreviewResolution.Height)
    Dim ARGBcam As Integer() = New Integer(x * y - 1) {}
 
    Dim wb As WriteableBitmap = New WriteableBitmap(x, y)
    myCamera.GetPreviewBufferArgb32(ARGBcam)
    ARGBcam.CopyTo(wb.Pixels, 0)
 
    Dim ms As New MemoryStream
    Dim bmp As New BitmapImage
 
    wb.SaveJpeg(ms, x, y, 0, 100)
    bmp.SetSource(ms)
    Try
      WP7BarcodeManager.ScanBarcode(bmp, New Action(Of BarcodeCaptureResult)(AddressOf BarcodeResults_Finished))
      myCamera.CaptureImage()
    Catch ex As Exception
      MessageBox.Show("読み取りエラー")
      Exit Sub
    End Try
  End Sub

スキャンが完了した時の処理

スキャンが成功した時は、Rectangle1コントロールを非表示にし、StackPanelとその中のコントロールを表示します。Image1のSourceプロパティに、WP7BarcodeManager.LastCaptureResults.BarcodeImageプロパティで取得したバーコードの画像を指定します。WP7BarcodeManager.LastCaptureResultsプロパティは、スレッド間のアクセスのための、最後のバーコードのキャプチャ結果を格納します。numberTextBlockにスキャンしたバーコードのテキストを表示します。スキャンが成功しなかった場合は、メッセージを表示します。
  Private Sub BarcodeResults_Finished(BCResult As BarcodeCaptureResult)
    If BCResult.State = CaptureState.Success Then
      Rectangle1.Visibility = Windows.Visibility.Collapsed
      barStackPanel.Visibility = Windows.Visibility.Visible
      Image1.Source = WP7BarcodeManager.LastCaptureResults.BarcodeImage
      numbertextBlock.Text = BCResult.BarcodeText
    Else
      MessageBox.Show("やり直してください。")
      Exit Sub
    End If
  End Sub

リフレッシュアイコンがクリックされた時の処理。

Rectangleコントロールを表示状態にします。StackPanelとその子要素、ImageとTextBlockコントロールを非表示にします。TextBlockコントロールの内容を消去します。再度、矩形内に被写体が表示されます。
  Private Sub Page_Refresh(sender As Object, e As EventArgs)
    Rectangle1.Visibility = Windows.Visibility.Visible
    barStackPanel.Visibility = Windows.Visibility.Collapsed
    numbertextBlock.Text = String.Empty
  End Sub
End Class

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る