プログラミング一覧

Vulkan 1.1 が発表された

Vulkan といえば 1.0 のバージョンのまま、マイナーバージョンアップを黙々と続けているものでしたが、今回 1.1 の発表となりました。実情としては 1.0.70 ≒ 1.1.70 みたいな感じで、 1.1.0 からの再スタートというナンバリングではないようです。
この記事を書いている時点においては、少々出遅れしたためか、既に Windows の Vulkan SDK では 1.1.70.1 なるバージョンが出ていたりします。

続きを読む


WPF の ListView で選択項目を中央にしたスクロール制御

ListView で選択された項目をコントロールの中央に表示したいと思うことがあります。今回はこれを実現するべく実装を考えてみました。考え方としては ListView が持っている ScrollViewer を制御して、スクロールを制御することにしました。

結果

実装した結果を示します。作成したアプリの動きとしては次のようになっています。

  • 選択状態にあるものを画面外にスクロールさせたとして、”アジャスト”ボタンを押すと、その項目が中央になるように表示
  • 項目の番号を指定して”選択”ボタンを押すと、対象の項目を選択状態にして、その項目が中央になるように表示

続きを読む


ListView での VerticalContentAlignment バインディングエラー

ListView(+ListViewItem) のスタイルをいじってバインディングのエラーが出るのは分かるのですが、予期しないところでエラーが出るので困っていました。今回、ひとまずどういったときにエラーメッセージが出るのかが掴めたのと、今後同じように悩まないためにもメモとして残しておこうと思います。

バインディングエラーと対策

ListView あたりのスタイルをいじっていて以下のようなワーニングメッセージを見ることがありました。特にこの辺りのバインディングいじっていないのに出てしまうので疑問に思っていましたが、起因しているものが分かりました。

このエラーメッセージは、内容が動的に変化するコントロールにおいてよく出るようです。自分の場合には ListView などで仮想化して使っている場合に、このような症状が出るようです。

そこで ListViewItem のプロパティセッターに以下のようにしてパラメータをセットするようにして解決できました。

仮想化ありの場合

仮想化ありの場合においては上記の設定でうまく出来ませんでした。 ListViewItem の中身をカスタムする時に、 Blend を用いて既存のものをコピーして、編集する方法で行いましたが、当初のようなエラーメッセージを見ることになりました。

対策としては以下のように編集しました。

ListViewItem のテンプレートを Blend を用いて既存のものをコピーして作った場合、上記の(※)の部分についてもバインディングが設定されています。しかしそれにより今回のようなバインディングエラーが通知されてしまうため、項目そのものを削除しました。

まとめ

この手のものは、他にも動的な右クリックのメニュー(コンテキストメニュー)を作っているときにも、出遭いそうな気がします。参考情報を見ると、 WPF での既知の問題といえる内容にも見えます。

参考情報


WPF と OpenGL の空域問題への対処

WPF を使っていて厄介な問題の1つに空域の問題があります。特に DirectX や OpenGL, Vulkan といった HWND を使うものを扱って WPF の世界に持ち込むと遭遇します。他にも HWND を必要とする(従来型の)コントロールを配置すると出遭います。ブラウザのコントロールなどが該当するようです。

具体的には HWND を使用したコントロールを配置、ホストすると、その上には WPF のコントロールを配置できません。配置してエラーになるというわけで無く、 HWND のコントロールが最前面に来てしまうため見えない状態となってしまいます。

今までは、描画結果を D3DImage や Image など画像にしてしまって配置する方法を考えていましたが、もっと別の手段があるようだったので試してみることにしました。

続きを読む


WPF TreeView with SelectedPath binding

Windows エクスプローラーが備えているフォルダツリーのようなものを、 WPF を利用している自作アプリケーションで使用したいことがあります。
調べてみるといくつかの実装が見つかりますが、フォルダツリーの実現のためにビューモデルとビューが分離されている本気度の高いものが多く、もう少し手軽なものがないかなと思った次第です。

以前に以下のアドレスで公開されていた方式が割と気に入っていたのですが、現時点においてアクセスが出来なくなってしまいました。
http://khmylov.com/blog/2010/11/wpf-explorer-treeview-with-selectedpath-binding/

ちょっとしたときにはこれで十分だったりしてお気に入り実装だったので、元の記事を自分なりに再解釈してみたいと思います。

続きを読む


Microsoft Store と Thumbnail Handler

Microsoft ストアでデスクトップアプリも配布できるようになったおかげで、一部のシェル拡張も配布出来るようになりました。
現時点においては、サムネイルハンドラやプレビューハンドラ、プロパティハンドラが対応しているようです。 Paint.Net もストアでの配布が始まり、そのタイミングで tga と dds ファイルのサムネイルハンドラが機能するようになったみたいです。
サムネイルハンドラと聞いて、これはちょっと調べておかないとと思ったので、記録として残しておきます。

情報について

元は Desktop Bridge: Creators Update のブログで書かれた内容が最初でした。
従来のデスクトップアプリをストアで配布出来るように、 Desktop Bridge の機能が用意されました。ここでファイルの関連付けや各ハンドラのようなレジストリの変更が必要なものも対応出来るように機能拡張されて使えるようになりました。

続きを読む


DirectX11 でマルチフルスクリーン その3

DirectX11 でマルチディスプレイ環境で全てのディスプレイでフルスクリーンモードとしたいのに SetFullscreenState が失敗してしまう件の続報です。
この症状は、 Windows10 Creators Update 適用環境でも発生します。おそらく RTM 版から挙動は変わっていないのでは、と思います。詳しくは、前回までの記事を参照してもらうとして、今回は「どうしてもフルスクリーンモードを使いたいんだ」ということで、1つの提案を出してみたいと思います。

続きを読む



DirectX11 でマルチフルスクリーン

Windwos 10 になってから、 DirectX11 の挙動で妙な点を発見しました。
以前 Windows 8.0 で OpenGL をマルチディスプレイで使った際にも変な動きがありました。それについての詳細情報は以前の日記を参照してください。OpenGL での問題の動きは Windows10 1703 でも発生していないようです。
今回の問題は、 SetFullscreenState が失敗して、各ディスプレイでフルスクリーンに遷移できないというものです。

現挙動の確認

昔ながらのコードが悪いのかと思い、 IDXGIFactory2 を使用して、 CreateSwapChainForHwnd でスワップチェインを作成するようにしてみました。
また、 DXGI_SWAP_CHAIN_FULLSCREEN_DESC にも各ディスプレイから取得した情報で値をセットするようにし、 Windowed メンバを TRUE にした状態で、フルスクリーンのスワップチェインを作成するようにしました。もちろん、各画面に応じて別のウィンドウとなるため、ウィンドウ (HWND) は2つ作成しています。

これでアプリケーションを実行すると、一瞬フルスクリーンモードになるのですが、すぐに解除されてしまいウィンドウモードでの実行となってしまいました。 NVIDIA, Intel ともに同じ動きをしているので、 Microsoft Windows 側の仕様変更が疑われます。

GetFullscreenState で状態を確認して、フルスクリーンモードに再度遷移する、と実装を修正して実行を試みました。結果はある程度はフルスクリーンモード状態になって、その後解除され、再びフルスクリーンモードに遷移して・・・と繰り返す動きでした。

続きを読む


HLSL pow 関数の怪

pow 関数の挙動が昔と今で変わった!という話を聞いたので調査することにしました。

今回はスペキュラーの計算で使用している pow 関数の計算が妙なことになっているとのことだったので同じようにスペキュラの計算を行ってみることにします。なおインターネットで調べてみると、同じような症状に出遭っているような文面を見かけることができました。

傾き指向プログラミング / Direct3D 11のカリング設定
こちらの方では、「Specularの計算中powを使うのですが、これの結果がやたらとマイナスの値になるため、最終的に合算した色が真っ黒になるようです。」 と記述しています。
続きを読む