非矩形ウィンドウを表示するには

◆PROCESSING 逆引きリファレンス

 カテゴリー:制御系

非矩形ウィンドウを表示するには

【解説】

PROCESSINGにかぎらず、多くの画面を扱うプログラムでは「ウィンドウといえば四角(矩形)」が定番です。

しかし世の中には、矩形ではないウィンドウを持つプログラムもあります。

例えばPCで利用する音楽プレーヤーソフトでは、スキンやフェースと呼ばれる画像情報を読み込むことで、音楽プレーヤーの画面をキャラクターの形に変更する事が可能です。

(画像URL:偽抹茶堂 様、真咲さん 

上記の画像は、音楽プレーヤーソフトAIMP 用のスキンで、偽抹茶堂 様が公開されているものです。元画像はPixivのイラスト作家である真咲さん のものです。

ウィンドウの下に、サクラエディタの画面が透けて見えているのがわかると思います。

こんなウィンドウが作りたい!(笑)・・・というわけで、非矩形のウィンドウをPROCESSINGで作成する方法を紹介したいと思います。

Javaで非矩形ウィンドウを作成する方法については、下記サイト様などが参考となります。

 

【注意】

PROCESSINGの標準命令では非矩形ウィンドウは作成できないため、Javaの命令を駆使する事になります。詳細は下記サンプルプログラムを参照してください。

「ここまでするなら、素直にJavaでコーディングすれば?」という声が聞こえてきそうですね(汗)。

PROCESSINGの実行結果Windowを非矩形化するため、PROCESSINGがもつ PSurfaceオブジェクトからJavaのWindowフレーム(Frame)オブジェクトを取り出して利用しています。

また非矩形Windowを実現するためには、Frameに「この部分は絵がある部分(不透明)で、ここは絵が無い部分(透明)なんだよ」という情報を教えてあげる必要があります。

そのため、表示したい画像の画素を1つ1つ調べて、不透明な画素からShapeと呼ばれるマスク用画像を作成しています。

(画像URL:©GMO Internet, Inc. 様:美雲あんず:画像の再利用は禁止です)

注意点は、FrameのremoveNotifyを行う位置です。setup()関数のなるべく早い段階で、removeNotifyを行って下さい。

(原因は不明なのですが:汗)Shapeの作成を行った後でremoveNotifyを行うと

java.lang.IllegalStateException: Buffers have not been createdjava.lang.IllegalStateException: Buffers have not been created at sun.awt.windows.WComponentPeer.getBackBuffer(WComponentPeer.java:1018) at java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:4065)

のような例外が発生します。

下記サンプルプログラムでは、マウスのドラッグ&ドロップで、実行結果ウィンドウを移動する処理が加えてあります。

またマウスが右クリックされたら、APを終了するための問い合わせを行うダイアログBOXを表示しています。

本当はダイアログBOXではなくポップアップウィンドウが使いたかったのですが、(これも原因は不明なのですが)コメント化してあるポップアップメニューは、期待通り動作しませんでした。

ポップアップ表示はするのですが、非矩形ウィンドウの端で開くと、ポップアップメニューの文字が欠けて表示されてしまいます・・・。

やむなくダイアログBOXを使っている次第です(汗)。解決方法がわかる方が見えましたら、教えて頂けると幸いです(m(_._)m)。

 

【関連記事】

 


サンプルプログラム

非矩形ウィンドウを表示する例:

画像には、©GMO Internet, Inc. 様が公開されている、公式マスコットキャラクタの「美雲あんず」を利用させて頂いております。

画像の再利用は禁止されています。ご注意ください。詳しくは©GMO Internet, Inc. 様のサイトを参照して下さい。

画像をダブルクリックすると、あんずちゃんの絵が切り替わります。右クリックするとダイアログBOXが表示されます。「はい」を選択すると、画面を終了する事ができます。

<出力サンプル>

(画像URL:©GMO Internet, Inc. 様:美雲あんず:画像の再利用は禁止です)

作っておいて言うのも何ですが・・・・オタク街道まっしぐらです(笑)。やってしまいました(汗)。

また、上記プログラムでShapeを作成する処理は、エマノンの雑記帳 様に掲載されていたロジックを流用しています。ありがとうございました。

 

非矩形ウィンドウを表示する例(Java版):

参考までに、Java版のサンプルも掲載しておきます。
PROCESSING版とほとんど一緒ですが、JFrameを生成している所が異なります。

またJFrameに画像を描画するのに、JPanelを利用しています。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。