子ウィンドウの描画

このエントリーをはてなブックマークに追加
はてなブックマーク - 子ウィンドウの描画
Share on Facebook
Bookmark this on Yahoo Bookmark

子ウィンドウを作成、描画してみた。問題なく出来たけど、このやり方だとGPUのリソースを食ってしまうな。。まあしょうがないか。作ろうとしているものはそんなにウィンドウを開くアプリでもないしね。

これをベースとして本格的に実装していくことにしよう。

No related posts.

本の虫: Linuxに移行しようかな

このエントリーをはてなブックマークに追加
はてなブックマーク - 本の虫: Linuxに移行しようかな
Share on Facebook
Bookmark this on Yahoo Bookmark

本の虫: Linuxに移行しようかな.

WindowsはどんどんC++から離れて行っている。MSの最近のC++における態度たるや、互換性という理由だけで規格違反の挙動を放置し、さらに独自拡張を大量に突っ込んでカオスになっている。もはや、WindowsではまともにC++できない。

確かにそのとおりなんだよね。

私個人としては早急にC++11の言語機能を実装してほしいなあと思っている。独自実装にたいしては否定的ではないのだけれど、まずは規格通りの実装を完成させてからにしてほしいなと思う。

No related posts.

リージョン付きブラーでクライアント領域外を指定してみた。

このエントリーをはてなブックマークに追加
はてなブックマーク - リージョン付きブラーでクライアント領域外を指定してみた。
Share on Facebook
Bookmark this on Yahoo Bookmark

Nyaruruさんの情報を元にリージョン付きブラーで、リージョンをクライアント領域外を指定してみた。

    //Create and populate the BlurBehind structre
    DWM_BLURBEHIND bb = {0};
    //Enable Blur Behind and Blur Region;
    bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
    bb.fEnable = true;
    // クライアント領域外の値を指定
    bb.hRgnBlur = ::CreateRectRgn(-1,-1,0,0);
    //Enable Blur Behind
    hr = DwmEnableBlurBehindWindow(hwnd, &bb);

結果の動画は下。背景はアルファ値がゼロなので透明になっている。

問題はマウスイベントだ。この方法だと透明部分であってもマウスイベントが発生する。レイヤードウィンドウの場合透明の部分はマウスイベントは発生しないようになっている。

関連記事:

  1. thunkをいじる
  2. ウィンドウラッパ部分を改良する
  3. ラッパライブラリの改良 – イベントハンドラは結局LRESULTで返すことにした
  4. DWM – DwmExtendFrameIntoClientAreaとDwmEnableBlurBehindWindow
  5. PsycleWTL

サンクと継続の勉強会資料を読む。

このエントリーをはてなブックマークに追加
はてなブックマーク - サンクと継続の勉強会資料を読む。
Share on Facebook
Bookmark this on Yahoo Bookmark

サンクと継続の勉強会資料」をななめ読みした。

サンクの作り方はすごく詳しくて勉強になった。この詳細度であれば64bitの仮想関数呼出しも書いてあるかなと思ったけど32bit限定だった。残念。。サンクの例としてはやっぱりウィンドウプロシージャの呼出し部分に使ってみるというものだ。やっぱりこの部分は典型なんだろうね。

コルーチン(継続)についてはファイバーによる実装ではなく自力で1からの実装であった。コルーチンを使えば状態を保持する変数を減らせるし、ソースコードの見通しも大変良くなる。例にもあるようにマウス関連の操作やジェネレータに使うとすっきりと美しく書ける。yieldをC++11に組み込んで欲しかったんだけどねぇ。

No related posts.

やっぱり甘かった。

このエントリーをはてなブックマークに追加
はてなブックマーク - やっぱり甘かった。
Share on Facebook
Bookmark this on Yahoo Bookmark

レイヤードウィンドウ以外の方法を考える」で考えたプランを試してみた。全体が半透明になるように実装したら結果は下記の通り。残念。。

AlphaBlendしてもDest DCはそのウィンドウ内のビットマップなのだから透過しないのは当たり前なのだ。バカですな、私は。DWM APIを絡ませればガラス効果はできそうだけどそれは純粋な半透明処理ではないしね。まあでもDWMもためしてみるか。

No related posts.

レイヤードウィンドウ以外の方法を考える

このエントリーをはてなブックマークに追加
はてなブックマーク - レイヤードウィンドウ以外の方法を考える
Share on Facebook
Bookmark this on Yahoo Bookmark

レイヤードウィンドウは子ウィンドウには適用できない。私としてはレイヤードウィンドウをバックバッファ代わりに使いクライアント領域外も含めて全てDirect3D11で描画しようかなと考えていた。しかし複数ウィンドウを開くアプリケーションはこの方式ではつくれないということになる。

別の方法としてはDirec3D11テクスチャに描画し、WM_NCPAINTメッセージを捕まえてその際得られるDCにをコピーするという方法が考えられる。コピーはAlphaBlend APIを使えばUpdateLayeredWindowと同等のことができるのではないだろうか。一度試して見ることにする。

No related posts.

本の虫: 新たな期待できるC++インタプリター、Cling

このエントリーをはてなブックマークに追加
はてなブックマーク - 本の虫: 新たな期待できるC++インタプリター、Cling
Share on Facebook
Bookmark this on Yahoo Bookmark

本の虫: 新たな期待できるC++インタプリター、Cling.

C++インタプリターか。LLVMの機能であれば確かに実現可能である。ブラウザのスクリプティングにC++が使える時代が来るかもしれないね。まあそういうムーブメントはなさそうだけど、今後の可能性としてね。。

No related posts.

テクスチャの動的生成

このエントリーをはてなブックマークに追加
はてなブックマーク - テクスチャの動的生成
Share on Facebook
Bookmark this on Yahoo Bookmark

テクスチャー自体を描画ターゲットにできることが分かったので、テクスチャを動的に作成して立方体に貼って回してみた。テクスチャに立方体を描いてそれをテクスチャにした立方体を回している。まあなんでもないことなんだけどちょっと面白くて。

Direct3D11ではリソース管理がより抽象化していて使い回しやすいような気がする。

No related posts.

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

このエントリーをはてなブックマークに追加
はてなブックマーク - レイヤードウィンドウ – テクスチャ経由の表示はうまくいった。
Share on Facebook
Bookmark this on Yahoo Bookmark

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

こちらの情報に従って矩形リージョンを再設定すると角の丸みもとれた。

とりあえずここまでの成果を動画にしておいた。

これでとりあえずレイヤードウィンドウによる表示は一段落かな。試行錯誤した結果レイヤードウィンドウについて多少の情報が得られたのでまとめておきたいなとか思っている。

ソースコード

関連記事:

  1. レイヤードウィンドウ – 非クライアント領域の描画をどうするか
  2. レイヤードウィンドウ
  3. レイヤードウィンドウ – カラーキー – GDIで塗りつぶす
  4. レイヤードウィンドウ – カラーキー
  5. レイヤードウィンドウ – 2通りの方法

関連情報