none
WPFはネイティブ(C/C++、API/MFC)から利用可能なのでしょうか? RRS feed

  • 質問

  • お世話になってます。

    ここ最近WPFに関する書籍を購入したり関連サイトを覗いたりしているのですが、サンプルや参考書を読む限り.NETでの利用が多く、アンマネージでの利用方法が見あたりませんでした。
    GDI+のように通常のネイティブアプリケーション(例えばMFCアプリから)でもWPFは利用出来るのでしょうか?

    2006年6月30日 11:13

すべての返信

  • WPFというか.NET Framework 3.0のモジュールたちはマネージモジュールになりますので、アンマネージから利用するのであれば、C++/CLIなどをつかったり、COMを経由させて利用することになるでしょう。

    少なくともGDI+とは全然違う位置づけです。

    2006年6月30日 11:31
  • できないか?できるか?と言われれば、できるでしょう。
    しかし、現実的には、マネージ拡張(C++/CLI)を有効にしないとダメでしょうね。
    なお、MFCはアンマネージ専用ではなく、マネージ拡張をしても使えます。

    VC8のMFCでは、Windows Forms対応のクラスがあるので、
    将来のVC(Orcas ?)のMFCで、WPFをサポートする可能性も
    ありそうです。

    #あ、XAMLには、C++/CLIは使えなさそうな気がする。。
    2006年6月30日 12:52
  • ご返信ありがとうございます。

    グラフィックを使うパフォーマンス最優先のアプリケーションの移植・新規開発を検討しているのですが、パフォーマンスが優先されるだけにCLIや.NET等は使えそうにない感じなのです。
    ※速度重視の場所ではアセンブラコードも使います
    また、GUIを.NET、演算やグラフィック描画をネイティブ(アンマネージ)というのは避けたいので。。。

    Vistaβ2を使う限り、全ての(OS付属の)アプリケーションが.NETで出来ているとは思えないのでGDI+がCOMで使えるような感じでWPFも使えるのか?と思った次第です。
    ※WPFはGDI/GDI+という単純なグラフィックAPIでは無い。と言うことは承知しておりますです。

    とにもかくにも色々資料が出てくるまでは地道に調査ですね。
    ありがとうございました。m(__)m

    2006年6月30日 13:15
  •  ZZO さんからの引用

    グラフィックを使うパフォーマンス最優先のアプリケーションの移植・新規開発を検討しているのですが、パフォーマンスが優先されるだけにCLIや.NET等は使えそうにない感じなのです。
    ※速度重視の場所ではアセンブラコードも使います
    また、GUIを.NET、演算やグラフィック描画をネイティブ(アンマネージ)というのは避けたいので。。。

    Vistaβ2を使う限り、全ての(OS付属の)アプリケーションが.NETで出来ているとは思えないのでGDI+がCOMで使えるような感じでWPFも使えるのか?と思った次第です。
    ※WPFはGDI/GDI+という単純なグラフィックAPIでは無い。と言うことは承知しておりますです。

    確かに WPF の描画下位部分は MIL と呼ばれる Unmaaged なコンポーネントで実現されていますが,レイアウトエンジンやメッセージング機構,データバインディングなどの仕組みは基本的に .NET で実装されています.アンマネージなアプリケーションからは基本的に使用できず,.NET 開発者向けのご褒美のような形になります.
    出てきているサンプルを Vista 上で動かしたパフォーマンスを見る限り,HTML + ブラウザという形態に比べてもパフォーマンスは悪くなく,.NET を少しでも使っている GUI アプリケーションは速度的に実用的ではないというロジックの反例になるかと思います.
    # とはいえ,ここだけの話,個人的には WPF パフォーマンスはもっと悪いと予想していたわけですけど

    Vista 評価用の PC を用意して,WPF の最新サンプルや Windows Expression (.NET と WPF で実装されている) をチェックされてみてはいかがでしょうか?
    最新ハードウェアで良い実行効率を求められるのであれば,GDI/GDI+よりも良いパフォーマンスが期待できます.

    一方,幅広いハードウェア環境 (具体的には古いハードウェア環境) でも安定してそこそこの性能を出したければ,従来通りの実装方法が適しているかと思います.
    (最新環境では実行効率が悪いことよりも,古い環境でソフトウェアエミュレーションされ,極端にパフォーマンスが悪化することの方が問題の場合)

    2006年6月30日 17:21
  • たぶん...

     ZZO さんからの引用
    Vistaβ2を使う限り、全ての(OS付属の)アプリケーションが.NETで出来ているとは思えないのでGDI+がCOMで使えるような感じでWPFも使えるのか?と思った次第です。

    の 「全ての(OS付属の)アプリケーションが.NETで出来ているとは思えないので」って,

    Windows Presentation Foundation Architecture

     の milcore のところを直接呼んだりしているのか?/自分も呼べるようになるのか?
    ということですよね...

    # Undocumented Milcore とか...その手の本が出てこないとダメかも。

    2006年7月2日 16:36
  •  稍丼 さんからの引用

    の milcore のところを直接呼んだりしているのか?/自分も呼べるようになるのか?
    ということですよね...

    # Undocumented Milcore とか...その手の本が出てこないとダメかも。

    以前から Microsoft は milcore.dll の一般開放をずっと否定 (あるいは時期尚早) としているので,Vista 登場時期で我々が利用できる可能性は薄そう,という状況に見えます.

    How underlying WPF concepts and technology are being used in the DWM

    I'm 95% sure the following question will come up, so let's get it out of the way here:  Is milcore.dll available for public use?  The answer is that in the Windows Vista timeframe, it is not exposed as a public API.  We are certainly looking into what would be involved in exposing it, and clearly understand that there's interest out there for it.

    2006年7月3日 1:03
  • みなさんさんこんにちは。
    色々とご返答頂いてありがとうございます。m(__)m

     稍丼 さんからの引用
    milcore のところを直接呼んだりしているのか?/自分も呼べるようになるのか?
    ということですよね...

    あ。また知らない単語が。。。 ^^;
    そうですね。「WPF」という言葉を使ったために包括される範囲もまた大きくなりすぎてましたね。
    ここからは簡単に「WPFのグラフィック部分」に絞ります。
    ※多分milcoreに該当するのだと思います

    私が疑問に思っているのはCADやペイント系のアプリケーション作成をVista/WPFで作ると現状より楽になるor実行速度が速くなるか?です。
    現在移植を考えているアプリは一度に5~6千個のプリミティブ(Line/Polygon/Image/string/etc..)をオンメモリで扱い、これを拡大・縮小・回転計算して画面に描画しています。※MFCアプリケーション
    GDIでは表現出来ないプリミティブ属性があったりOSにお願いすると速度的に遅いものもあるので、古典的なやり方としてビットマップをVRAMに見立て直接描画したりしてます。※CreateDIBSectionを使ってアドレスを取得
    GDI+を使えばアンチエイリアスやグラデーション、イメージ変形描画も自前で行わずに済むのですが、いかんせんGDIよりもかなり遅くなってしまい実用上問題が出てしまいます。※超高速なCPUを使っても遅い
    常々「いつかは描画(表示or印刷)を全てGDI/GDI+に任せられればなぁ」と思っているわけです。

    そしてWPFの売り文句を読むと良く出てくる「GDI+はGDIのラップに過ぎないというような関係ではなく、WPFはDirectXやビデオアクセラレータと親密に云々」という言葉に期待を抱いて

    WPFは、「C++(ネイティブ系)で使う便利なMFC」という関係と同じく「.NETから使う便利なWPF」なのか?
    それともMFC(SDK)アプリからも使えるのか? ※マネージ+アンマネージ混合は除外
    GDIやGDI+のインターフェースは変わらないけど内部ではグラフィックアクセラレータ等を余すところ無く使って従来よりも高速に描画出来る?

    という疑問・質問にたどり着いたわけです。
    WPFは.NETでしか使えない便利かつ高機能なライブラリなのであれば従来通りC++/MFCで実装を考え、C++(ネイティブ)からも(GDI+の次の世代の描画系APIとして)使えるならWPFの描画部分の利用も考えてみたいと思い、色々と調査している次第です。
    ※調査した結論として「今のまま移植」になったのなら自分自身納得出来るのですが、調査せずに「今のままでも動くから移植でいいや」というのは自身が許さないので。はい。 ^^;


    カスタムボタンなどの描画もWPFでは少しは楽そうで、オーナードローでも標準コントローラと違和感なく表示できそう。
    現状XPの標準スタイルではボタンの角が丸いのですが、オーナードローしたボタンだけは角張ってしまう。テーマ描画を使っても吸収しきれない部分があって。。。という悩みもあるんですよね。
    サイドバー用ガジェットのコンテストにともなってもう少し詳細なドキュメントが手に入ることを期待してます。

    2006年7月3日 12:21
  • milcore自身はネイティブなので,
    そこを呼べれば native - native が可能な感じがしますが,
    だけど,
    WPF のシカケというか からくり の中心(Dispatcherやプロパティの伝播やVisualツリーの構成等)
    であるヘルパー的な部分は,
    この図のmilcoreより上層のマネジド層部分で実装されているので,
    そこをパスしてしまう/利用しないとなると,
    呼べるようになったとしても,楽はできないでしょうね...

    MFCでやれるようになったとしても,
    そこをパスするという感じではなく,
    System.Windows.Interop.HwndSource 等を利用して,
    単にホストする感じになるんじゃないかなぁ...。
    きっと,/clr スイッチは必要と言うか,C++/CLIで書く必要があるような気がします。

    2006年7月4日 8:14
  • そういった内容なのであれば、もともとDirectXなりを使うことの方が近道だと思いますがどうでしょうか?

    DirectXだけであれば、もう少しサポート範囲は広く出来ますよね?

    2006年7月4日 13:05
  • すでにご覧になられているかもしれませんが「Windows Presentation Foundationプログラミング」のP425「ネイティブのHWNDアプリケーションへのWPFのホスト」という箇所が参考にならないでしょうか?

     

    2006年7月26日 22:07
  •  T.Ino さんからの引用

    すでにご覧になられているかもしれませんが「Windows Presentation Foundationプログラミング」のP425「ネイティブのHWNDアプリケーションへのWPFのホスト」という箇所が参考にならないでしょうか?

    これですが,

     ZZO さんからの引用

    それともMFC(SDK)アプリからも使えるのか? ※マネージ+アンマネージ混合は除外

    のマネージ+アンマネージ混合に該当するかと.

    2006年7月27日 2:33