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

C++/CLI で STL 2

@IT:特集:Visual C++ 2005 いままたC++が熱い!「C++/CLI」として大進化したVisual C++ 2005

少し気になって探してみたんだが…
んー昨日書いた STL/CLR はちょっと勘違いしていたみたい。

C++ は関数を抜けると勝手に確保したメモリは解放されるんだったよね。
つまり自動ガベージコレクションが起こるから意図的な gcnew は必要は無いんだ。
new が必要だったポインタをハンドル型に置き換えて gcnew すればいいってことなのねん。

それにネイティブと同じに書けると言っておいて例を出さないのは変かも。
ネイティブコードと混在できる C++/CLI だからこそのコードにしなきゃ意味はない。
つーことで書き換えた。

STL/CLR を使ってみる

しかし、んー困った。
STL/CLR って ostream_iterator や pair なんかは使えないのねん。

※追記@ pair はよくみたら cliext/utility に定義されていました…
※細かいコトはもう少し調べて後日。

コレで STL を名乗るのは…だがコンテナだけでも再現したのはスゲェのは認める。
全体像の一部だけ意図的に集中攻撃なんて民主党やマスゴミと同じウンコ以下だものね。

STL がどれほど議論と妥協(?)を重ねてきたのかを逆に思い知る、といえばカッチョイイかな?
.NET Framework 自体にもっと優秀な代替があるのにナニソレ?と言えれば更にカッチョイイ。

でも実際 FileStream クラスが ifstream と似通っているから次はこのネタにしようかなと。
Pet をはよ完成させろよ俺…

C++/CLI で STL

C++/CLI って STL が使えるんだね。
せっかくだから vector を使って簡単なコードを書いて試してみた。

STL/CLR を使ってみる

知らなかった、これは使えるかもしれない。
それより C++/CLI はコード補完がショボイのをなんとかしてくれい!
アンマネージドのコードはしかたがないけど C# との差がありすぎるぞこのやろう!

てか C++/CLI は WPF が使えないという致命的な欠点が…

BitmapEffect の負荷は高くない

せっかくなので BitmapEffect がどれだけ負荷が高いのか実験。
手持ちで一番巨大な 3072x2304px の画像を使って BlurBitmapEffect を掛けてみる。

2 ミリ秒…

BlurEffect にしてみる。

1 ミリ秒…

こりゃ差が全然解らないわけだわ。
この程度の BitmapEffect なら体感するような違いは無いってことなのね。
どういう使われ方を想定して BitmapEffect を無くす方向になったの?

解ったのは WPF で画像ビューアは一瞬で作れるということだけだった。
XAML に Image を配置して image1 という名前を付けたとして

private void Window_Drop(object sender, DragEventArgs e)
{
    string[] drags = e.Data.GetData(DataFormats.FileDrop) as string[];
    image1.Source = new BitmapImage(new Uri(drags[0]));
}

これだけ…後はプロパティを弄くるだけ。
せっかくだから何か作ろうか。

BitmapEffect プロパティが古い

SeeMe のソースを少し弄くって sp1 にしてから初コンパイルしたら…

「BitmapEffect プロパティが古い!」

と怒られた、なんやねんまったく。
てか俺って気がつくの遅!VS2008 を sp1 にしたのは何時や!

とにかく BitmapEffect は檄負荷だから近々無くなるので使うなということらしい。
BitmapEffect がハードウェア アクセラレーション化されたはずなんだけーがなぁ。

川西 裕幸のブログ : .NET Framework 3.5 SP1 Beta

しかたがない、更新しよう(そんな理由で…)

てゆーかオープンソースなんだから放置はマズイわな。

using System.Windows.Media.Effects;

img1.BitmapEffect = new BlurBitmapEffect();
↓
img1.Effect = new BlurEffect();

と Bitmap を取っ払って書き換えるだけでよさそうだが。
こうしないとアクセラレーションが使えないってことなのか?よく解らないけど。
負荷の違いは私の Athlon 64 x2 4200+ & AMD 690G のショボいマシンでも解らんぞ!

そういえば Drag and Drop での並べ替えをいいかげんに復活させなければ。
以前は全く見つからなかったがそろそろサンプルコードがネット上に上がっているかな?

CodeProject: Very Simple WPF Drag and Drop Sample without Win32 Calls. Free source code and programming help

CodeProject: Drag and Drop Items in a WPF ListView. Free source code and programming help

あぁ、これでなんとかなりそうだ。
ちなみに WindowsForm にあった listView1.GetItemAt みたいなメソッドは無い。
たかが ListViewItem 取得にこんな処理を自前で書けということらしい。

メソッドくらい用意してよまったく。
WPF がちっとも普及しない最大の理由はソレなんだから。

でも並べ替え自体は RemoveAt と Insert メソッドのみで簡単に終わる。
それもバインディングならもちろん元の ObservableCollection を並べ替えるだけ。
異様に簡単になったり異様に難しくなったり本当に面倒だなぁ WPF って奴は。

Spy++ で WPF

何を今頃の話。

Visual Studio Tools の Spy++ でちっとウインドウ検索していた。
これって UAC に引っかかるのよね、そんな大げさなアプリとも思えないけど。

ちっと思いついて SeeMe にファインダツールをドロップ。

えっ!WPF で作ったアプリには親ウインドも子ウインドも何も無いってこと???

意味不明の若い人へ説明すると…解説が難しいなぁコレ。
Win32 API で作ったウインドウはボタンやラベルも全部ウインドウである。
なのでメインウインドウにボタンがあったらボタンは子ウインドウということです。
ウインドウハンドルを持つモノは全部ウインドウ…ということで解るかな?

ソレが一つも無いということは全部ペンやブラシで描写しているのと同じコト。
ちなみに Y901 のコントローラボタンがそうやっているのでコレも当然ウインドウではない。

そういえば WPF は DirectX で描写していたんだっけ、これは「なるほど」という感じ。
.NET Framework が一番の親に居ると思っていたんだけど違っていた。
いったいドコまで今までと考え方を変えなければいけないのだろう?

もう一つ思いついて Explorer のリストビューにファインダツールをドロップ。

あれ?このリストビューって SysListView32 クラスってことなの???
解る人には解るとおり Win32 での「今までの ListView 」と同じっていうこと。
なのにこの描写、あぁワケワカになってきたぞ!

てっきり WPF と同じ方法で描写を実現かと思っていたが普通のウインドそのもの。
「何か」をやれば Win32 で作った ListView もこの「なめらか描写」に出来るってことみたい。
公開されなきゃどうにもならんが、なんか Vista って本当に難しい。