前の関連記事:LibreOffice5(78)FilePickerにフィルターを追加する2つの方法の速さを計測する
ウィンドウのデフォルトの背景色: linuxBeanではすべて同じ
背景色を設定せずに、ウィンドウを作成したときの背景色の色コードを画像から色のRBGを取得するスポイトツール - PEKO STEPで調べました。
ツールキットのcreateWindow()メソッドで作成したウィンドウ以外のウィンドウタイトルはコードで設定したものです。
まずlinuxBeanで作成したウィンドウです。
UnoControlDialogサービスをインスタンス化したウィンドウ。
カラーコード: #EDECEB RGB: rgb(237,236,235)
カラーコードをLibreOfficeでは#を0xに入れ替えると使えました。
(OpenOffice.orgのマクロをPythonで記述して動かす(Calcのセル操作に関する追加メモ・ページ1/3) - 試験運用中なLinux備忘録)
ツールキットのcreateWindow()メソッドで作成したウィンドウ。
カラーコード: #EDECEB RGB: rgb(237,236,235)
UnoControlDialogサービスをインスタンス化したウィンドウと同じ色です。
TaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウ。
カラーコード: #EDECEB RGB: rgb(237,236,235)
3つとも同じ色でした、、、
いずれもBackgroundColorプロパティはNoneになっています。
TaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウだけ、大きさが変更できるものにしているのでウィンドウの下縁のデザインが少し異なります。
ウィンドウのデフォルトの背景色: Windows10ではTaskCreatorのウィンドウだけ色が異なる
今度はWindows10で作成したウィンドウです。
UnoControlDialogサービスをインスタンス化したウィンドウ。
カラーコード: #F0F0F0 RGB: rgb(240,240,240)
linuxBeanのときと色が違いますね。
ツールキットのcreateWindow()メソッドで作成したウィンドウ。
linuxBeanではこの方法で作成したウィンドウはウィンドウタイトルが設定できず勝手にLibreOffice5.2というタイトルが挿入されていましたが、Windows10ではデフォルトタイトルは挿入されていません。
カラーコード: #F0F0F0 RGB: rgb(240,240,240)
色はUnoControlDialogサービスをインスタンス化したウィンドウと同じです。
TaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウ。
カラーコード: #DFDFDE RGB: rgb(223,223,222)
予想に反して、これだけ他のウィンドウと色が違います。
linuxBeanのウィンドウとも色が違います。
Windows10では大きさが変更できるウィンドウとできないウィンドウもデザインは全く同じなのでマウスカーソルをウィンドウの辺縁にもってこないと大きさを変更できるかどうかはわかりませんね。
それとも背景色の違いは大きさが変更できるかできないか、ということでしょうか。
確認しようかと思いましたがTaskCreatorで作成したウィンドウをサイズ変更不可にする方法がわかりませんでした。
コントロールコンテナの背景色: BackgoundColorを設定しないと白色になる
OOoBasic/Dialog/Common - ...?にはコントロールモデルのBackgroundColorプロパティを設定しない場合は透過色になる、と書いてありますが、コントロールコンテナの場合は設定しない場合は白色になるようです。
ツールキットのcreateWindow()メソッドで作成したウィンドウに載せたコントロールコンテナにBackgroundColorプロパティを設定しない場合は白色になりました。
TaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウでも同じ結果です。
Windows10で、ツールキットのcreateWindow()メソッドで作成したウィンドウに載せたコントロールコンテナにBackgroundColorプロパティを設定しない場合も白色になりました。
TaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウでも同じ結果です。
コントロールコンテナの背景色: BackgoundColorを-1にすると問題発生
OOoBasic/Dialog/Example10 - ...?のmodelessdialog-2.odtではツールキットのcreateWindow()メソッドで作成したウィンドウにUnoControlContainerを載せています。
そのUnoControlContainerのモデルのBackgroundColorプロパティは-1になっています。
この-1は解説がみつけられなかったのですが、これは透明を表すようです。
UnoControlContainerサービスのインスタンスはXTopWindowインターフェイスをサポートしていないので単独のウィンドウにはなれず、背景色は透過色でよいと思っていましたがそれでは問題が発生することがわかりました。
BackgroundColorプロパティを-1にして先ほどと同様にウィンドウを表示させてみます。
linuxBeanでは狙い通りコントロールコンテナが透明になりウィンドウの背景色が表示されています。
Windows10でもツールキットのcreateWindow()メソッドで作成したウィンドウではちゃんとウィンドウの背景色が表示されています。
ところがTaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウの場合、Windows10ではウィンドウの背景色まで透けてしまいます。
しかもずっと透けているわけではなく、ウィンドウが表示されたときのその後ろに表示されている画像がそのまま付いて回ります。
ということでWindows10でTaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウに載せるコントロールコンテナの背景色は透明にしてはいけません。
BackgoundColorを-1にするとコントロールの再描画で残像が残る
さて、ここからがようやく本題です。
TaskCreatorサービスをインスタンス化したフレーム付きウィンドウのコンテナウィンドウに透明なコントロールコンテナを載せて、ウィンドウサイズに合わせてコントロールを描画し直すと、描画前のコントロールが残ってしまいました。
一旦他のウィンドウの後ろにしてまた前面に出すと前の画像は消えます。
Windows10の場合は最初に表示されたウィンドウはウィンドウの後ろの画像が透けてて、サイズを変更して拡大した部分は黒色になりました。
linuxBeanと違ってウィンドウを後ろに回してまた前面に戻しても残像は残ったままでした。
XWindowListenerインターフェイスのwindowResized()メソッドでコントロールを描き直しているので、その中でsetVisible()をFalseにしてからTrueにしたり、toBack()してからtoFront()にしたり、してみましたが、結局描画されるのはwindowResized()メソッドを出たときなので、windowResized()メソッドの中であれこれしても解決しませんでした。
まあ結局透明なものを上書きしても意味がないということです。
ということで、コントロールを描画し直すにはコントロールコンテナの背景は透明以外にしないといけません。
コントロールコンテナのBackgoundColorプロパティを設定しない場合
一番簡単な解決方法はBackgoundColorプロパティを設定しないことです。
linuxBeanでもWindows10でも背景色は白色で、残像も残りません。
参考にしたサイト
画像から色のRBGを取得するスポイトツール - PEKO STEP
画像ファイルをアップロードすると色のRGBを調べることができます。
OpenOffice.orgのマクロをPythonで記述して動かす(Calcのセル操作に関する追加メモ・ページ1/3) - 試験運用中なLinux備忘録
Pythonで0xをつけると16進表記でLibreOfficeの色設定ができました。
OOoBasic/Dialog/Common - ...?
BackgroundColorプロパティを透明にするには-1とする必要がありました。
OOoBasic/Dialog/Example10 - ...?
BackgroundColorプロパティを-1にしている例。
0 件のコメント:
コメントを投稿