Programming」カテゴリーアーカイブ

WPF に挑戦

よし、WPF に挑戦するぞと。
そういえば .NET 3.5 ならグラス効果をマネージしているのかな?

WPF アプリケーションへのグラス フレームの拡張

アンマネージのままなのね…
でもこれ v8.0 のヘルプだからもっと探せば見つかるかなぁ?

つーか間違っているぞこのコード。
System.Drawing 名前空間は WPF から参照できないヤン!

まあそりゃ System.Drawing は GDI+ のラッパーだから当然なのだが。
WPF は DirectX を直接呼んでいるっぽいし。

まあいいや、チト書き換えて実験しよう。

using System.Runtime.InteropServices;
using System.Windows.Interop;
をお忘れ無く。

つーか System.Windows.Interop; がデフォで付かないって何故?
これが無いと WPF で作成したウインドに対し何もできんわな。

ところで VS2008 ののコピペがとってもインテリジェンスなのに感動した。
全自動でインデントを合わせてくれるじゃん、後で直す必要が無い。
C# 編集では前からなの?C++ と HTML しか使わなかったのでよく解らない。

しかし宣言ミスとかでミミズマークが付く機能はリアルタイム監視じゃないのね。
Visual Web Developer はリアルタイムで指摘してくれるので調子が狂う。

例の文字列表示の発光効果は Label のプロパティで簡単に作れる。
BitmapEffect を OuterGlowBitmapEffect にして色を選ぶだけ。
描写負荷は軽くなっているのかな?実験してみないとなんともいえない。

mainWindowSrc.CompositionTarget.BackgroundColor = Color.FromArgb(0, 0, 0, 0);

の部分がどうしても気になるんだが。
SDK の時は真っ黒を指定なんだが、これじゃ完全に透明だ。

wpf01.png

ほらやっぱり…
てか本当に完全な透明だ、動かしたらキチンと背景どおりに変わる、なんだこりゃ。
試しにアルファ指定を 255 にしたら半透過部分も普通に黒くなってしまう。
むー、WPF は今までと全然違う考え方でウインドを作る必要がありそうだ。

なんか Cinema を作って勉強したことが全部無駄になってしまいそう…

Flash 再生

VS2008 の使い勝手を調べるのに試しに Flash 再生をば。
新規でまず普通に Win32プロジェクトを適当な名前で作り stdafx.h に…

なんじゃこの targetver.h っつーのは、分離する必要があるのか?
ココを弄くるとリビルドしなきゃいけないのでややこしくなるだけだと思うが。
まあそれはよくて。

#pragma comment(lib,”Atl.lib”)
// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
#include <atlbase.h>
#import <C:\\Windows\\System32\\Macromed\\Flash\\Flash9d.ocx> named_guids raw_interfaces_only

を追加、ocx の名前は私はこうなっていたけどどうなんだろう?

と書いていたトコで Ctrl+C が急にまったく使えなくなってしまい困った。
再起動しようとすると更新アイコンが、こんなにコッソリ更新すんなボケ!
VS2008 では使えなくなったかと思ったヤン、まあそれはよくて。

ソース先頭にお約束を記述
using namespace ShockwaveFlashObjects;

ShockwaveFlash オブジェクトのポインタを用意しておく。
IShockwaveFlash *pSwf;

んでもって下記のコードを追加してビルド、完成。
swf ファイルは自分で用意してパス指定してね。

atl01

だけどコレだけじゃ atl が使えないので
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.ATL
に atl90.dll があるので生成された exe と同じフォルダに放り込む。
それだけで swf は再生可能。

atl02

コードギャーは気にしないでくだされ、手元にコレしか無かっただけです。

flv の再生は読み込んだ swf から ActionScript とかで読み込んで再生させる。
というわけで Flash 作成ツールが必要なのね、、、、、

Ctrl+I

色々やってノートの Ubuntu は電源が切れるようになった。
沢山弄くったのでいったいどの方法で切れるようになったか解らない…
音はまだならない…

つーことで今日は HDD を買ってきてメインマシンに突っ込もう。
キーボードも欲しいなぁ、アレの付属キーボードを使っているけどイマイチだし。
と思っていたんだけど他の用事でなーんもできなかったわい。

つーかこんなことやっていないで開発しなきゃいかんだろ俺!
明日から当面は禁 Linux とします。

そういえば VS2008 を買わなきゃ、忘れていた。
std か pro か、うーまだ決まらないわな。

てなわけで MS のサイトを見て廻る。
げっ、こんなのがあったんかい。

MSDN Online Event – 定期コンテンツ – Visual Studio 2005 Tips

Ctrl+I でインクリメンタル検索…試したらメチャクチャ便利だ!
えぇ、知りませんでした、ずっと Ctrl+F を使っていました。
コード定義ウィンドウ…確認したいことはありませんか?って毎度じゃい!
えぇ、もちろんずっと右メニューから定義に移動をしていました。

私は今までいったい何をやってきたのでしょう。
たまには開発元のサイトは見てみるもんだ。

WS_EX_COMPOSITED は使えない

あけおめ(一応)

あー!なんじゃこの拡張スタイルはっつーの。
Wバッファリングを自動でやってくれるスタイルなんだが。
Aero で使ってみたら問題が無かったので当ててみたら…

クラシック表示
VMR の動画がまったく見えない。
他の部分が余計にチラツク

XP
アルファブレンドを掛けた GDI+ 表示がまったく見えない。
VMR の動画もやっぱりまったく見えない。
その見えない動画の上ではメニューさえも消える…

そういえば自力でやったら似たようになったのでヤメたんだっけ…
とにかく GDI+ や DirectX を使う人は絶対にこのスタイルを含めないで。

とにかくこの環境全部のつじつまを合わせると方法が限定されて困るわな。

???の人に簡単な解説をすると。

XP までの画面表示は1つの画面領域を全部のアプリが共有していました。
だからウインドを移動すると下のウインドが真っ白になっているのが見える。
ソレ毎に WM_PAINT が飛んできて、せっせと再描写が行われます。

しかしビデオカードが大半を処理してくれるので気にならなかった。
GetDC 関数で得られる HDC は実は完全に見せかけです。

Vista のクラシック表示は同じ方法で描写されます。
しかし GDI 処理が全部ソフトウエア処理に変更になりました。
そのため描写処理は目を覆いたくなるくらい遅くなってしまいました。

Vista を重いと言う人の大半はコレを言っているような…
クラシック表示のほうが軽いって考える思いこみって怖いね。

Aero 環境は Desktop Window Manager (DWM) が一括管理します。
アプリケーションごとに画面領域を本当に確保しておき合成して描写します。
おかげで背景のウインドさえスケスケに見えるなんてワザが可能。

と、聞いただけでは「重くなりそう…」と感じるのですが
その仕組みのおかげで上に被さっているウインドが移動しただけで
WM_PAINT が飛んできて再描写なんて事は無くなってしまいました。
トータルで描写処理が軽くなっています、頭がいい人が考えたのね。

Aero で表示がおかしくなるアプリは WM_PAINT の処理がおかしい。
○isual Studio とか ○onoha とか。

おまけに Vista ではオーバーレイが廃止されている。
だから動画のスクリーンショットも普通に可能になってもーた。
つーことで Cinema も VMR というワケワカなモンに移行したわけで。

とにかく。
描写処理が Aero、クラシック表示、XP で全部違うのよ。
従来の方法で描写しているかぎりは何も問題がないわけですが、
DirectX や GDI+ でアルファブレンドを使うとこうなってしまう。
両方使っている Cinema は…さて、色々試して勉強だ。

正月からこんなネタ…

アルファブレンドの制御

クラシックてか Windows 2000 スタイルでの動作チェック。

シークバーがチラツキすぎる…だめだこりゃ。

まあWバッファリングが上手くいかんのでチラツクのは解っているんだが。
アルファを掛けているとバッファの転送で背景が消えないんで一度フラッシュしてるし。
クラシック表示だと露骨に見えるようになるのか、コレは困った。

なんとかならんかとあーでもねぇこーでもねぇとやって今日が終わるよぉ!
InvalidateRect の第三引数を TRUE にすれば普通なら消えるはずなのに…
以前の描写部分を転送前に消す、もしくは転送したら消えるようにするには…
いくら探しても古くさい情報しか見つからない!方法は絶対にあるはずだ!

GDIPlus に関する情報の少なさは悲しいね。
C++ で行う情報は皆無に近いので C# で探して自力変換するしかないし。
…それって逆だろ!と憤りを感じてもしょーがない。
まあ他言語からの変換なんて元デルヒャァユーザーはいつものことだったし。

半日探してやっとこんなのを見つけた。

方法 : 複合モードを使用してアルファ ブレンドを制御する

んーブレンド制御を行ったら透過部分も塗りつぶしにならんかな?
とも思ったけどやってみにゃ解らない、藁にもすがる気持ちでやってみる。
まあつまり

g.Clear(Color::Black); //チラつくけど背景消去方法が他にない

とやっていたトコを

g.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);

に書き換えるだけなんだが。

さてどうなるか…あっさり解決…
せっかく GDI+ が用意してくれている方法を知らないって悲しいなぁ。
まあ現場のおっさんなんだからこんなもんさ。

そんなこんなで今日も進まない。