読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

レイヤードウィンドウ

レイヤードウィンドウ - まとめ

レイヤードウィンドウは結局使わないことにしたのだが、今までのまとめをしておこう。 レイヤードウィンドウとは レイヤードウィンドウとはα値によるウィンドウの半透明処理および指定色を透明化することができるウィンドウである。 Windows2000から実装され…

BLENDFUNCTION の説明が間違えやすい

BLENDFUNCTION の説明が間違えやすい. 確かにそうですな。。

レイヤードウィンドウ - テクスチャ経由の表示はうまくいった。

スワップチェーン経由での表示はクライアント領域しか表示出来なかったので、テクスチャにレンダリングしそれをGetDCしてUpdateLayeredWindowするように変更した。今回はうまくいった。ただ角が丸い。デフォルトでリージョンが設定してあるためだ。XPのUIの…

レイヤードウィンドウはHWアクセラレーションされるのか

「WindowのAllowsTransparencyをtrueにするとアニメーションが重くなる」を読んでいるとレイヤードウィンドウの話が何故か出てきていて、HWアクセラレーションはWPF3.5の時代からサポートしているようである。それが事実だとすれば当然Windows7でもサポート…

スワップチェーンが原因っぽい。

レイヤードウィンドウのウィンドウ枠いっぱいに表示できないのは、スワップチェーンのサーフェースがクライアント領域の大きさしか有効でないことが原因そうだ。サーフェースサイズはウィンドウサイズと同じなのだが、実際に描画されるのはクライアント領域…

レイヤードウィンドウの領域いっぱいへの描画

レイヤードウィンドウへの描画であるが、今まではクライアントエリアの大きさでUpdateLayerdWindowしていた。でも他のブログを見るとウィンドウサイズでも問題なく描画できるようなので試してみた。 しかしUpdateLayerdWindowの戻り値は成功(TRUE)にも関わら…

或るプログラマの一生 » レイヤードウィンドウのサンプルコード

或るプログラマの一生 » レイヤードウィンドウのサンプルコード. レイヤードウィンドウについて多少調べたこと レイヤードウィンドウではデフォルトのウィンドウリージョンでクリップがかかることがこのページで分かった。デフォルトのリージョンは左上・右…

レイヤードウィンドウ - 非クライアント領域の描画をどうするか

レイヤードウィンドウで試していないことの一つに、非クライアント領域の描画もできるのかということだ。これができないとウィンドウフレームを自前描画できない。UpdateLayeredWindowの2つ目の引数hdcDstぶGetWindowDCの値を渡せばいいのだろうか。DXGIサ…

レイヤードウィンドウのマウスイベント

レイヤードウィンドウのマウスイベントは透明部分は発生しない。それを検証するためにウィンドウのクライアント領域をドラッグしウィンドウを動かす処理を入れてみた。入れてみた結果が下の動画である。 立方体部分のみマウスイベントが発生するので結果立方…

AlphaBlend

AlphaBlendはWindows2000からあるAPIである。Window7 & WDDM 1.1ドライバであればこのAPIは高速化されることが義務付けられている。でもどの程度高速化されるのかはハードウェア次第だと思うけれど。 昔DirectDrawというのがあって、画面転送を高速に行うた…

GDI Hardware Acceleration

Graphics Guide for Windows 7の91-92ページにGDI Hardware Accelerationというセクションがあり、WDDM1.1ドライバの必須要件が書いてあった。引用しつつ訳してみる。 WDDM v1.1 ドライバは次の2D操作を高速化しなければならない BitBlt ColorFill StretchBl…

立方体以外を透明化することができるようになった。

ようやく立方体以外のウィンドウ表示を透明化することができるようになった。スワップチェーンをターゲットにして描画し、スワップチェーンのサーフェースのポインタを取得、デバイスコンテキストを取得、レイヤードウィンドウを更新というやり方でできた。…

IDXGISurface1::GetDCでInvalid Call Error

スワップチェーンからIDXGISurface1へのポインタを取得することに成功したものの、その後IDXGISurface1::GetDCしようとするとInvalid Call Errorで落ちる。なんでだろう。。

スワップチェーンでもできるね

今朝はIDXGIFactory::CreateSwapChainで生成されるサーフェースをGDI互換することはできないと思っていたので、テクスチャをわざわざ作りそれを描画ターゲットにしようとしていたが、よくよく見るとDXGI_SWAP_CHAIN_DESC構造体のFlagsメンバにDXGI_SWAP_CHAI…

まずはこういう方向性で

ウィンドウモードでDirect3Dプリミティブのみを画面表示し、その他は透明化する方法はとりあえず下の手順で実現できそうな気がしてきた。 GDI互換テクスチャを作る。 そこに3Dプリミティブを描画する。 テクスチャからサーフェースを取得し、さらにDCを取得…

ウィンドウの半透明や透明化

ウィンドウの半透明や透明化について簡単に整理。 ウィンドウ・リージョン ウィンドウの表示域を不定形にできる。リージョン以外の部分は透明化される。Windows95から存在。 レイヤード・ウィンドウ ウィンドウ全体もしくは一部分を半透明および指定色を透明…

頭の中がごちゃごちゃしてきた。

DWM・レイヤードウィンドウ・Direct2D・Direct3Dについて調べていると頭のなかがごちゃごちゃしてきた。整理したいなぁとは思うけどもう少し勉強しないとだめだろうね。リージョンによる不定形ウィンドウとかWPFとかGDI・GDI+とか。使い方よりは相互の関係を…

レイヤードウィンドウ - 2通りの方法

Direct2D によるレイヤード ウィンドウを読んでいた。 記事の内容はDCをインターフェースとしてやり取りし、Direct2Dで描画時にハードウェアアクセラレーションを効かせながら最小コストでレイヤードウィンドウに画面転送する方法を解説しているものであった…

Windows と C++: Direct2D によるレイヤード ウィンドウ

Windows と C++: Direct2D によるレイヤード ウィンドウ. いまやろうとしていることにヒントになりそうなドキュメント。電車の中で読むことにするか。

レイヤードウィンドウ - カラーキー - GDIで塗りつぶす

SetLayeredWindowAttributesで指定色背景を透明にする件。試しにGDIで塗りつぶすとうまくいく。 やっぱりレイヤードウィンドウの透明化をDirect3D11の描画と協調して行うにはなにか工夫が必要なのかもしれない。そもそもできないのかもしれないが。もう少し…

レイヤードウィンドウ - カラーキー

レイヤードウィンドウのAPI SetLayeredWindowAttributesでカラーキーの機能がある。これは指定した色を透明にするものだ。色指定を仮に赤(RGB(255,0,0))にして、Direct3D11で背景を赤に塗りつぶしてもうまく透明にならない。なんでだろう。半透明はうまくい…

レイヤードウィンドウ

DWMのブラー効果+レイヤードウィンドウで半透明処理をやってみた。レイヤードウィンドウの効果により、3D描画部分も半透明となっている。 レイヤードウィンドウはWS_EX_LAYEREDを指定してCreateWindowExし、SetLayeredWindowAttributesで透明度などの効果を…