ドラッグするだけでWeb上の画像を保存できるようにするプログラムを作成します。

実はウェブ上の画像をドラッグで素早く保存する方法はあります。

ウェブ上の画像をドラッグで素早く保存 – 初心者・シニア向パソコン教室用テキスト「ハッピーテキスト」

単にブラウザから保存したい場所(フォルダ、デスクトップ)にドラッグするだけです。こんな簡単な方法で保存できます。

ただこの場合は画像ファイルをまるごと保存するときには便利ですが、画像の一部だけがほしいときはちょっと面倒です。そこでWeb上の画像のうち、ドラッグされた部分だけを画像として保存できるアプリをつくってみることにします。

アプリの外でドラッグ&ドロップを検出する方法としてマウスキャプチャがあります。この方法だとマウスがフォームの外にでてしまってもマウスメッセージは指定されたフォームに届きます。 しかしこれには制限があってボタンが押されているのみ有効です。

マウスキャプチャをしたらそれを解除する手段も用意しておかなければなりません。もしマウスキャプチャが無制限にできてしまうと、それを解除できなくなってしまったときに他のアプリケーションでマウスをクリックしてもなにもおきなくなるという問題がおきます。それでいろいろ制約があるのでしょう。

ではフォームの外へでている状態でマウスボタンがおされて離されたことを知るにはどうすればよいのでしょうか?

スクリーン全体を透明なフォームで覆ってしまうというのはどうでしょうか? これならもともとフォーム内なのでマウスの移動、クリックなどを知ることができます。

まずフォームを2つ作ります(Form1とForm2)。

そして[キャプチャしたい部分を指定する]のボタンがクリックされたら

これで半透明のフォームでディスプレイ全体を覆うことができます。

次にForm2において

これでマウスをクリックしてドラッグするとクリックされた場所を起点に矩形が描画されます。そしてドロップするとフォームが閉じます。

つぎにForm2を表示させる部分を示します。まずForm2のTopMostプロパティをtrueにします。そうしないとアクティブなウィンドウを切り替えたときにForm2が最前面ではなくなってしまいます。またこのときにはForm1も透明にします。

Form2が閉じられたらドラッグされた部分の画像を保存する処理を行ないます。これはForm2Closedメソッドのなかでおこないます。

Form2Closedメソッドが呼ばれたときになにをするかですが、

スクリーンキャプチャをする
Form2のなかでつくられた矩形の部分を画像として保存する

これでよいということになります。

まずスクリーンキャプチャをするメソッドを示します。

つぎにトリミングをするメソッドを示します。

上記のメソッドで取得されたビットマップを保存すれば完成です。

ファイル形式はPNG、保存場所は実行ファイルがあるフォルダのなかにpngというフォルダをつくって、そのなかに保存しています。ファイル名は時刻を利用しています。