2014年10月22日

C#ツールバーのDockをTopにしてもClientで隠される

C# でフォームデザインしているときに地味に困ったのが以下の現象です。

・フォーム上にツールバーを配置する
・ツールバーの Dock を Top に設定してフォームの上に貼りつくようにする
・ツールバーの下側に適当なパネルを配置する
・パネルの Dock を Client に設定する

すると... !!
なんと ツールバーの存在がガン無視されて、パネルがツールバーの裏側にまで回り込んでしまうのです!当然パネルの上端はツールバーによって隠されます。
すごい地味な嫌がらせですよこれは。
仕方がないので Dock で設定せずに Ancher だけでそれっぽいことをやっていたのですが、やっぱり気持ち悪いです。
というわけで調べてみたところ、パネルとツールバーの優先順位を入れ替えればよいという、ただそれだけのことでした。

Docking with ToolStrip and Panel
http://stackoverflow.com/questions/17069256/docking-with-toolstrip-and-panel

[表示]→[その他のウィンドウ]→[ドキュメントアウトライン] と辿っていくと、GUIコントロールのツリー構造を編集できるウィンドウが表示されます。
ここを見ると、ツールバーのほうがパネルよりも上に位置していると思うので、これをドラッグしてツールバーのほうが下側に来るようにします。
この状態で Dock を設定すると、みごとに問題解決します。
posted by JUNOSOFT at 00:43| Comment(0) | プログラミング

2014年10月20日

RGBとアルファ値で別々の合成式を使う

漠然と不思議に思っていたんです。Diretxでアルファ合成したときに、合成後のアルファ値はどうなっているのだろうかと。
普通に考えれば不透明のターゲットに対して半透明の画像をアルファ合成したとき、合成後のアルファ値は不透明なままになるのが自然なのですが、アルファ合成の式を

device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);

と設定しているのにアルファ値だけ計算方法が異なるというのもおかしな話です。となると、アルファ値も上記の式に従っているはずなのですが…。
しかし合成後のアルファ値というのは使う機会がなく、別にどんな値でも最終的に描画される画像にも影響しないために特に追求することなく放置していました。

ところが合成語のアルファ値を使う機会が出てきてしまったのです。そう、レンダーターゲットへの描画です。
不透明画像があるレンダーターゲットに対して半透明画像をアルファ合成してから、そのレンダーターゲットを描画すると、半透明画像の部分だけアルファ値がおかしくなります。

アルファ部分だけ別の合成式にする設定さえあれば…と考えたところでふと思い出したのですが、そういえば以前 OpenGL のマニュアルで Separate blend ナントカって関数を見たなと。
それをみた当時はさっぱり意味が分からず、glBlendFunc 以外にも合成関数があったのかぐらいに思っていたのですが、考えてみたら名前がすごくそれっぽいです。
そこで OpenGL オンラインマニュアルの glBlendFunc を開き、関連項目を見てみると、glBlendFuncSeparate というのがありました。まさに今、欲している機能です。

http://www.opengl.org/sdk/docs/man2/xhtml/glBlendFuncSeparate.xml

というわけで、この glBlendFuncSeparate 相当の機能を Direct3D9 で探してみようと google 先生に聞いてみたところ、D3DRS_SEPARATEALPHABLENDENABLE という単語が引っかかりました。
で、最終的に以下のページに行きつき、目的の関数と設定を得ることができました

http://msdn.microsoft.com/ja-jp/library/bb147328(v=vs.85).aspx
http://marupeke296.com/cgi-bin/cbbs/cbbs.cgi?mode=al2&namber=1423&rev=&no=0&P=R&KLOG=2

これでRGBとAで異なる合成関数を適用してみたところ、見事にアルファがらみの問題がなくなりました。
めでたし、めでたしです。

しかしまさか OpenGL のマニュアルに助けられるとは。あれを思い出さなかったら、調べるのにもっと時間がかかったかもしれません。

posted by JUNOSOFT at 08:59| Comment(0) | プログラミング