SHOEISHA iD

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

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

ComponentZine(LEADTOOLS)

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

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

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

プログラム起動時の処理

 モジュールレベルの変数を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」という名前で保存されています。

 

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
ComponentZine(LEADTOOLS)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング