プログラムな日常>C#>
フォームの一部を透明に?
(to make a transparent region in a form)

パソコンで資料やブログなどを作っていると、画面の一部を切り出して画像ファイル化したいことがあります。
そんな時、私はあまりスマートな方法は知らないので、Windows ツールのペイントをよく使うのが普通でした。それは、
  1. Ctrl-Alt-PrtSc、または、Ctrl-PrtSc により、フォームあるいはスクリーン全体の画像データをクリップボードに送る。
  2. ペイントを開き、クリップボードのデータを貼り付ける。
  3. ペイント中で四角形を選択し、Ctrl-C あるいは Ctrl-X で、画像の一部を再度クリップボードにコピーする。
  4. ペイントを新規にする(今までのデータは消去)か、ペイントの新たなオブジェクトを開き、「画面のプロパティ」で有効領域を十分小さくしてから、Ctrl-V でペーストする。
  5. ファイル保存する。
ルーチンになってしまうと何でもないことでも、ビビッて匙を投げた人を複数知っています。最初はパニックになる程のことには違いなく、正直、それを非難するつもりもありません。
手数が多いことだけが問題なのではありません。例えばポートレートを切り出す場合、人物の大きさを目的に合わせるのも大切なことですが、中心に配置することにもそれ以上に気を遣います。 しかも出来上がりは正確なサイズでなくてはいけません。切り出しをどこから始めればうまくいくか、何度もやり直した経験の人も多いと思います。
正直、負荷の多い不自然な定型作業であって、心理的に回避したいことではあります。

これを改善するためにツールを作ってみました。これによると、次のように単純なステップで作業できます。 
  1. ブラウザまたはアプリケーションの上で、適当なサイズの画像を用意する。
  2. ツールの枠を目的のサイズにしておき、切り出すべき画面部分に合わせる。
  3. ファイル保存する。
さて、これを実現するために、窓のように透明な部分があるフォームを使っています。

ところで、随分前に、C# に関するチャットで、フォームを透明にすることができるかどうかの疑問が出されたことがありました。
そこで Opacity を使う不完全な方法が提案され、これによると確かにフォームを幽霊のように薄くできるが、ちゃんと表示したい線や文字も薄くなり、 Opacity = 0 つまり、完全に透明にすると、表示も完全に消えてしまいます。完全に透明な幽霊は実世界に影響を与えることもできません。 そうであるはずのところをブレークしてしまったのが今回のコードです。


【できること】

こんな感じで、PC 上の画面に重ねます。フォームの大部分は半透明、四角い穴は完全に「透明」で、穴の際は少し「反射して」います。

    
           図:ソフト使用時の状態

切り出されたものはこんな感じです。

             
        図:ソフトを利用して切り出した画像

操作方法は至ってシンプルで、以下の通りです。

【解決法】

どのようにしてこれを解決したか、説明したくてウズウズしているのですが、ネタバレを嫌う向きもあると思うので、ソースコード以外の理屈の説明は暫く控えておこうと思います。
C# によるソースコードは次のようで、単一のファイルに作っています(ただし、クラスは3つです)。
今や、開発環境もタダなので、ぜひともご自分でコンパイルしてみて下さい。ちょっとしたことでウイルス認定されやすいので、まずはこのまま動かしてみられることをお勧めします。

C# のソースコード("PictureTrimmer.cs"):