syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Visual C++ 2010 SP1でのMFC拡張

(これは2011-05-27に書いた故OCNブログの記事を移植したものです)

Microsoftが.NETに注力を始めてからずいぶんと影が薄くなったのが、Visual C++向けのWin32 APIラッパー/デスクトップアプリケーションフレームワークであるMFCなんですが、VC 2010になっても結局MFCはひっそりと拡張され続けています。2010ではリボン リソース エディター(リボン デザイナー)などの目玉機能が追加された挙げ句、SP1では下記2つのコア機能が追加になっています。

あまり話題にはなっていないけど、WPFをどうしても採用できない案件で、高速かつリッチなUIをネイティブ実装するのに使えそうです。どのみちコードベースでガリガリ書いていく必要があるので、生産性や保守性の観点からはWPFには遠く及ばないんですが、D2D/WAMはCOMゆえに結構面倒な部分があるので(COMを知らない人には使えない、また知っていてもコールバック*1まわりが面倒)、そのラッパーが用意されているのは助かるかもしれません。

D2Dが使えるのはWindows 7/Vista SP2 + Platform Update以降であり、Windows XPではD2Dがサポートされないので当然ハードウェア アクセラレーションが効かないのはともかくとして、多分WAMラッパーのほうもXPでは機能制限があるようです。というかD2D/WAMはXPにはバックポートされていないので多分ラッパーも使えません。
WPFは豊富なアニメーション機能が便利なんですが、そのフレームワークのみをネイティブCOM実装したのがWAMになります。とはいえXAML連携などはできません。

Visual Studio 2010 SP1 用の MFC の追加
https://msdn.microsoft.com/ja-jp/library/gg482719.aspx

チュートリアル: MFC プロジェクトへの D2D オブジェクトの追加
https://msdn.microsoft.com/ja-jp/library/gg482848.aspx

チュートリアル: MFC プロジェクトへのアニメーションの追加
https://msdn.microsoft.com/ja-jp/library/gg466500.aspx

VS 2010 SP1をインストールすると、下記の場所にサンプル コードのアーカイブがインストールされます。ただし中に入っているのは差分サンプルが少しだけです。
%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Samples\1041\VC2010SP1Samples.zip

MFCソースコードが付属しているし、マニュアルもそれなりにあるので、ヘビーユーザーであれば使い方は自分で調べればよいのですが、もっと有用な実装サンプルが増えないと、初心者には厳しいかもしれません。
また、MFC用に提供されているDirect2Dラッパーは、Direct2D 1.0専用になります。Windows 8に実装されているDirect2D 1.1や、Windows 8.1に実装されているDirect2D 1.2を使いたい場合は、MFCラッパーではなく直接COM APIを操作する必要があります。


しかし結局COMはいつまでも残り続けるしぶとい技術ですね。DCOMはWCFなどによってほぼ完全に置換されましたが、COMはネイティブC++から利用できるソフトウェアコンポーネント再利用技術として、今後もしばらくMSプラットフォームの中核であり続けるでしょう。実はWindows 8.xのWinRTもCOMの拡張技術だったりします。

*1:COMのコールバックはイベントシンクという仕組みを使います。イベントシンクはプロセス透過でDCOMにも使える反面、登録作業がかなり煩雑です。