SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(LEADTOOLS)

コンポーネントによるスクリーンキャプチャツールの簡易作成

LEADTOOLS 14.0J Raster Imaging Proによる画像処理プログラムの作成 第3回

  • このエントリーをはてなブックマークに追加

 LEADTOOLS 14.0J Raster Imaging Proに格納されているActiveXコントロール「LEAD Screen Capture Control」を使用し、画面をキャプチャしてスクリーンショットを作成するプログラムを作ります。キャプチャしたスクリーンショットは、MDIフォームの子フォームで表示し、ファイルにビットマップフォーマットで保存できるようにします。

  • このエントリーをはてなブックマークに追加
完成画面
完成画面

はじめに

 今回は、これまで使用してきたLEADTOOLS 14.0J Raster Imaging Proのコンポーネントの1つ、Lead Mainコントロールに加え、スクリーンショットを作成する機能を持ったLEAD Screen Captureコントロールを使って、フルスクリーンやアクティブウィンドウ、指定したエリアなどの画面をキャプチャするプログラムを作成します。

 また、今回作成するプログラムはMDI機能を持ったフォームで作成し、キャプチャしたスクリーンショットはMDIフォームの子フォームで表示して、ファイルにビットマップフォーマットで保存できるようにします。

対象読者

 Visual Basic 6.0を使ってプログラムを作ったことのある人が対象です。

必要な環境

 Visual Basic 6.0が使用できる環境。

プログラム実行時の注意事項

 本稿のバイナリファイルを実行する場合は、必ずセットアッププログラムを実行してください。

使用するコントロール

 LEADTOOLS 14.0J Raster Imaging Proのコンポーネントの中で、LeadMainコントロールとLEAD Screen Captureコントロールをツールボックスに組み込んでおいてください。

 後は、画面にあるVisual Basicの各コントロール(今回は標準コントロール以外のコントロールも使用しています)をツールボックスに配置しておきます。

ツールボックス
ツールボックス

実装する機能

 今回実装する機能は次のとおりです。

  1. フォームをMDIフォームにし、キャプチャ画像を子フォームで表示する
  2. フルスクリーン・アクティブウィンドウ・オブジェクトを指定して画面をキャプチャする
  3. エリアを指定してキャプチャする
  4. キャプチャ画像はファイルに保存する

 これらは、いずれもLEAD Screen Captureコントロールのメソッドで行い、LeadMainコントロールに表示します。

フォームをMDIフォームにし、キャプチャ画像を子フォームで表示する
フォームをMDIフォームにし、キャプチャ画像を子フォームで表示する
キャプチャのスタイルをメニューで選べる
キャプチャのスタイルをメニューで選べる
キャプチャエリアを指定できる
キャプチャエリアを指定できる

MDIフォームの作成

 このプログラムは、キャプチャしたスクリーンショットをMDI(Multi Document Interface)フォームで表示します。MDIフォームとは、フォームの中にいくつものフォームを表示できるフォームスタイルです。MDIフォームでは、プロジェクトに組み込んである子フォームを元に、コードから子フォームをいくつも作成して使うことができます。

MDI親フォームの作成

 新しいプロジェクトを用意し、プロジェクトに「MDIフォームモジュール」を追加します。そして、LEAD Screen Captureコントロールを配置し、表のメニューを組み込みます。

メニュー名 オブジェクト名
capture mnucapture
  フルスクリーンをキャプチャ mnufull
  アクティブなウィンドウをキャプチャ mnuactwin
  オブジェクトを選んでキャプチャ mnuobject
  エリアを選択してキャプチャ mnuarea
MDIフォームのデザイン
MDIフォームのデザイン

MDI子フォームの作成

 プロジェクトにあるフォーム「Form1」は、MDIChildプロパティをTrueに設定して、MDI子フォームにします。フォームには、LeadMainコントロールを配置し、フォームの背景色を変えておきます。また、CommonDialogコントロールを配置しておきます。

子フォームのデザイン
子フォームのデザイン

 フォームのデザインはこれでおしまいです。後は、コードで機能を実装していきます。

プログラム起動時の処理

 モジュールレベルの変数を1つ用意します。これは、作成する子フォームの数を管理します。

Public cnt As Integer

 次に、MDIフォームのLoadイベントプロシージャで、この変数に1を代入し、LEAD Screen CaptureコントロールのCaptureCancelKeyプロパティにvbKeyEscapeをセットします。これは、実行中のキャプチャをキャンセルするキーを[Esc]キーに設定します。

Private Sub MDIForm_Load()
    cnt = 1
    Me.LEADScr1.CaptureCancelKey = vbKeyEscape
End Sub

 また、フォームが表示されアクティブになった時に、あらかじめ組み込んであるForm1を非表示にしておきます。

Private Sub MDIForm_Activate()
    Form1.Hide
End Sub

フルスクリーンのキャプチャ処理

 メニュー[フルスクリーンをキャプチャ]のClickイベントプロシージャに、フルスクリーンのキャプチャ処理を組み込みます。

 LEAD Screen Captureコントロールでは、メソッドでキャプチャ処理を実行できるようになっています。しかも、メソッドを実行するとすぐにキャプチャを始めるのではなく、「ホットキー」を押した時点でキャプチャを実行するように作られています(デフォルトのホットキーは[F11]キーです)。従って、メソッドを実行するとLEAD Screen Captureコントロールはホットキーが押されるまで待機しており、ホットキーが押されるとキャプチャを実行します。キャプチャした画像は、Bitmapプロパティに格納されます。

 このプログラムでは、ユーザーがキャプチャメニューを選ぶと、

  1. MDIウィンドウをアイコン化し
  2. メソッドを実行してホットキー([F11]キー)が押されるまで待機
  3. ホットキーが押されるとMDIウィンドウを元のサイズに戻し
  4. 子フォームを作成してLeadMainコントロールでキャプチャ画像を表示する

 という処理を実行します。

 では最初に、フルスクリーンのキャプチャ処理を作りましょう。

 まず、MDIフォームをアイコン化します。これは、フォームのWindowStateプロパティに1をセットします。

Private Sub mnufull_Click()
    Me.WindowState = 1

 次に、フルスクリーンのキャプチャを実行します。メソッドはLEAD Screen CaptureコントロールのCaptureFullScreenです。引数はありません。ただし、このメソッドを実行した後にユーザーが[Esc]キーを押してキャプチャを中断した場合、メソッドはエラーになりますので、ここにエラー処理を入れておきます。

On Error GoTo FAIL
Me.LEADScr1.CaptureFullScreen

 キャプチャが終わったら、ウィンドウを元に戻します。

Me.WindowState = 0

 今度は、キャプチャした画像を子フォームで表示します。まず、変数cntの値が1であれば、最初からMDIフォームに組み込んでいたフォームでキャプチャ画像を表示します。これは、LEAD Screen CaptureコントロールのBitmapプロパティの値を、LeadMainコントロールの値に代入するだけです。また、フォームのタイトルを、「CaptureImage1」というように番号で表します。

If cnt = 1 Then
    Form1.Caption = "CaptureImage" & cnt
    Form1.LEAD1.Bitmap = LEADScr1.Bitmap
    Form1.Show

 もし、既に最初からMDIフォームに組み込んでいたフォームが使われていたら、新しく子フォームを作成してそこに表示します。

 子フォームを作成するには、DimステートメントとキーワードNewを使い、「Form1」のインスタンスを作成します。Form1には、既にLeadMainコントロールとCommomDialogコントロールが組み込まれていますから、これらを持った子フォームの複製が作成されます。作成するフォームのオブジェクト名は、newformです。常にこの名前でフォームが作られますから、フォームを識別するためにフォームのタイトルを「CaptureImage1」というように番号で表します。

Else
    Dim newform As New Form1
    newform.Caption = "CaptureImage" & cnt

 後は、LEAD Screen CaptureコントロールのBitmapプロパティの値を、フォーム上にあるLeadMainコントロールの値に代入し、フォームのShowメソッドでフォームを表示します。

    newform.LEAD1.Bitmap = LEADScr1.Bitmap
    newform.Show
End If

 フォームを表示したら、cntプロパティの値を1つ増やしておきます。

cnt = cnt + 1

 もし、ユーザーがキャプチャ中に[Esc]キーを押したら、LEAD Screen CaptureコントロールのStopCaptureメソッドを実行してキャプチャを終了し、MDIフォームを元のサイズに戻します。

FAIL:
    Me.LEADScr1.StopCapture
    Me.WindowState = 0
End Sub

アクティブウィンドウのキャプチャ処理

 今度は、アクティブウィンドウのキャプチャ処理を、メニュー[アクティブなウィンドウをキャプチャ]のClickイベントプロシージャに作成します。といっても、作成するコードはフルスクリーンのキャプチャ処理と同じです。実行するメソッドがCaptureActiveWindowに変わるだけです。

Private Sub mnuactwin_Click()
    Me.WindowState = 1

    On Error GoTo FAIL
    Me.LEADScr1.CaptureActiveWindow
    ......
    ......
    ......
End Sub

オブジェクトを選んでキャプチャする処理

 オブジェクトを選んでキャプチャする処理も、基本的には前述の2つの処理と同じです。ただし、LEAD Screen Captureコントロールには、選んだオブジェクトを枠線で囲んで表示する機能があります。この枠線の太さをCaptureObjectBorderWidthプロパティで設定します。

 後は、CaptureSelectedObjectメソッドを実行し、ホットキーを押すとオブジェクトを選ぶことができるようになりますので、キャプチャしたいオブジェクトをクリックすると、キャプチャが実行されます。

Private Submnuobject_Click()
    Me.WindowState = 1
    Me.LEADScr1.CaptureObjectBorderWidth = 3

    On Error GoTo FAIL
    Me.LEADScr1.CaptureSelectedObject
    ......
    ......
    ......
End Sub

エリアを選択してキャプチャする処理

 エリアを選択してキャプチャする処理では、ホットキーを押すとエリアを選択するカーソルとキャプチャエリアの画像を表示する情報ウィンドウが表示されます。この情報ウィンドウには、キャプチャエリアのサイズと位置の情報も表示されます。

 この情報ウィンドウを使うには、CaptureAreaShowInfoWindowプロパティをTrueにセットします。

Private Sub mnuareaClick()
    Me.WindowState = 1
    LEADScr1.CaptureAreaShowInfoWindow = True

 後は、CaptureAreaメソッドの引数に定数「SCR_CAP_AREA_RECT」を指定して実行するだけです。

 CaptureAreaメソッドの引数は、キャプチャ範囲の形状を指定するもので、定数「SCR_CAP_AREA_RECT」はマウスでドラッグした矩形内をキャプチャします。

    On Error GoTo FAIL
    LEADScr1.CaptureArea SCR_CAP_AREA_RECT
    ......
    ......
    ......
End Sub

 以上で、親フォームの処理は出来上がりです。

子フォームの処理

 今度は、子フォームの処理を作成します。最初に、LeadMainコントロールのサイズをフォームのサイズにあわせて伸び縮みするようにします。

 LeadMainコントロールは、AutoSizeプロパティをFalseに、AutoScrollプロパティをTrueにセットしておきます。そして、フォームよりも少し小さくなるようにして、LeadMainコントロールのスクロールバーが使えるようにします。

 なお、フォームが全画面表示になると、各プロパティの代入式はエラーになるので、On Error GoToステートメントを入れておきます。

Private Sub Form_Resize()
    On Error GoTo FAIL
    Me.LEAD1.Width = Me.ScaleWidth - 500
    Me.LEAD1.Height = Me.ScaleHeight - 500
FAIL:
End Sub

 最後に、キャプチャ画像をファイルに保存する処理を、子フォームのQueryUnloadイベントプロシージャに作成します。ファイルの保存は、この連載の第1回目で紹介していますのでそちらを参照してください。

 ここでは、LeadMainコントロールのSaveメソッドを使って、ビットマップフォーマットでファイルに保存します。

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim ret As Integer
    Dim fname As String

    ret = MsgBox("ファイルに保存しますか?", vbYesNo)
    If ret = vbYes Then
        With Me.CommonDialog1
        .Filter = "ビットマップ|*.bmp"
        .FileName = Me.Caption & ".bmp"
        .ShowSave
        fname = .FileName
        End With

        On Error Resume Next
        ret = Me.LEAD1.Save(fname, FILE_BMP, 24, 2, SAVE_INSERT)
    End If
End Sub

まとめ

 今回は、LeadMainコントロールの多彩な機能の中から、画面キャプチャを行う機能を持った、LEAD Screen Captureコントロールを使い、スクリーンショットを撮って保存するプログラムを作成してみました。

 LEAD Screen Captureコントロールは、キャプチャ機能はすべてメソッドで提供され、メソッドを実行するだけでキャプチャできてしまう、とても便利なコントロールです。特にエリアでキャプチャする機能などはすべて自分で作るとなるととても大変です。LEADTOOLS 14.0J Raster Imaging Proには便利なコントロール群があるので、これらを上手に使って開発を楽にするのもよいのではないでしょうか。

 なお、LEAD Screen Captureコントロールのヘルプファイルは、スタートメニューには登録されておらず、LEAD14コンポーネントをインストールしたフォルダ内の「Help」フォルダに、「LTSCROCXN.HLP」という名前で保存されています。

 

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/533 2009/03/17 11:51

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング