はじめに
昨年Microsoftが約束したように、今度の新しいVisual C++では、ネイティブコードによる開発と、ネイティブとマネージドの世界を融合するコードの部分に重点が置かれています。
すべての機能をC#やVisual Basic.NETなどのマネージドオンリー言語と同等に維持しても、それではVisual C++の製品としての意味がありません。マネージド機能との同等性を重視すればするほど、Visual C++という製品の本来の領域、つまりネイティブコーディングおよび相互運用コーディングからは遠くなっていきます。
Visual C++ 2008は、Microsoftのネイティブコードへの新たな取り組みを大きく反映し、この10年で初めて、MFCを刷新してWindowsコモンコントロールライブラリをフルサポートします。単にWindowsをカバーするだけでなく、Visual C++チームはVisual C++ 2008 Feature Packもリリースし、Visual StudioおよびMicrosoft Office風ユーザーインターフェイスを持つアプリケーション開発のサポートを組み込んでいます(現在、このFeature PackはBeta版であり、
ここからダウンロードできます)。この
MSDN Webサイトの記事で説明されているように、MFCの更新は、MicrosoftのVisual C++チームとパートナー関係にある外部企業(
BCGSoft社)が行いました。
編集部注
バージョンは執筆当時。現在は正式版がリリースされています。
Visual C++ 2008 Feature Pack Beta版をインストールするときは注意が必要です。インストーラにバグがあり、Visual Studio 2008の完全インストールを選択しないとインストールが終了します。また、Visual C++/Visual Studioがインストールされているオリジナルメディアを利用することもできません。このような問題を最も簡単に解決するには、ディスクドライブにVisual Studio 2008 DVDをセットするか、Visual Studioをインストールした元の場所へのネットワークアクセスが可能であることを確認します。
Feature Pack(ダウンロードサイズは303MB)にはドキュメントが含まれていません。そのため、新しい機能について説明する2つのCHMファイルを
MSDNから別途ダウンロードする必要があります(ダウンロードサイズは3MB)。
編集部注
上記ダウンロードページは現在閉鎖されています。
このFeature Packは、明確な2つの機能領域に分かれており、MFCの更新とTR1機能があります。TR1は、C++言語に一時的に追加される機能で、C++0xリリースでC++の新機能として正式に採用されるかどうかは未定です(なお、0xは今後10年のうちに新しい規格が採用される可能性を示すものです)。TR1の詳細については、この
MSDNブログの投稿記事に記載されており、今後の記事でもさらに詳しく取り上げられる予定です。
MFCの更新
1998年のVisual C++ 6のリリース以後、MFCの勢いは下り坂になりました。MFCには、Windowsオペレーティングシステムの一部としてリリースされるコントロールの機能が含まれていますが、Visual C++ 6以降にリリースされたMFCには、.NETが目前に控えていたため、これらの機能は含まれていません。
以前の記事で述べたとおり、MFCは、Visual C++ 2008によって大幅に更新されました。Feature Packでも引き続きMFCが更新され、Vistaオペレーティングシステム上で動作したり、Internet Explorer 7やOffice 2007などのアプリケーションと併用できるアプリケーションを容易に開発できるようになっています。
Feature Packを使用して作成したMFCアプリケーションの長所を手っ取り早く知るために、サンプルを実行してみましょう。旧世代のMFCとはまったく異なることがはっきりとわかります。
図1に、Feature Packに付属するMSOffice2007Demoサンプルアプリケーションを示します。一見すると、このアプリケーションはOffice 2007の一部であるかのように見えます。これがサードパーティ製コントロールも使っていない、何百行にもわたるオーナー描画GUIコーディングも行っていないMFCアプリケーションであるという事実は、少し前まで兄弟分のWindows FormsやWPFに大きく後れを取っていたMFCの状況を考えると、まさに驚くべきことです。
図1 MS Office 2007 Demoサンプルアプリケーション
図1には、いくつかの新しいユーザーインターフェイス要素がありますが、最も目立つのは、いわゆる「WOWファクター」をアプリケーションにもたらすリボンコントロールです。リボンコントロールは、ユーザー向けの多種多様な機能を非常に多く備えており、これを一から実装しようとすると膨大な手間がかかります。たとえば、リボンコントロールの実装は25種類のCPPファイルによって構成され、これらのサイズは1MBのソースコードの実に半分を占めます。このようなことから、MFCリボンを実装することがどれだけ複雑であるか、その一端を理解できます。
既存のアプリケーションをアップグレードして、標準メニューとツールバーのUIをリボンベースのUIに移行することは、それほど困難ではありません。まず主な作業として、
CMFCRibbonBarおよび
CMFCRibbonApplicationButtonメンバ変数をアプリケーションの
CMainFrameクラスに追加し、次に、リボンに表示する各種画像を保持する
CMFCToolBarImagesメンバ変数を追加します。
リボン上の各タブ(Microsoft Word 20007の[Home]、[Insert]、[Page Layout]タブなど)はカテゴリと呼ばれます。リボンに新しいカテゴリを追加する場合は、
CMFCRibbonBar::AddCategoryメソッドを呼び出します(このメソッドは、大きなアイコンと小さなアイコンをパラメータとして利用します)。
CMainFrameクラスに前述の新しいメンバ変数を追加するほかに、MFCによって生成されるコードのほとんどの基本クラスを、新しいスタイルのExクラスを使用するように変更する必要があります。つまり、
CWinAppEx、
CMDIFrameWndEx、
CMDIChildWndEx、および
CSplitterWndExというクラスを、それぞれの非Exスタイルのクラスの代わりに使用するようにします。新しいExクラスは、どれも対応する非Exクラスから派生したものであるため、アプリケーションにはほとんど影響しません。
幸いなことに、Visual C++ 2008 Feature Packをインストールすると、MFCアプリケーションウィザードも更新されるため、同ウィザードから、リボン機能をフルサポートしたOffice 2007風アプリケーションを直接作成することができます。MFCアプリケーションウィザード内では、[Application Type]が更新され、新しい視覚スタイルと色([Visual style and colors])がいくつか追加されます(図2を参照)。
いずれかのOffice 2007視覚スタイルを使用してアプリケーションを生成した場合は、アプリケーションのリボンコントロールの上部に、Office 2007のさまざまな配色スキーマを選択できるドロップダウンメニューが配置されます(図3を参照)。
図3 Office 2007風アプリケーションの配色ドロップダウンメニュー
標準メニューではなくリボンを使用するためには、アプリケーションウィザードで図4のような設定を行います。既存のアプリケーションをアップグレードしてリボンベースのユーザーインターフェイスに対応させる場合でも、新しいスケルトンアプリケーションを生成することをお勧めします。
これは、リボンをサポートするために必要なメニュービットマップのテンプレートとして利用できるからです。アプリケーションウィザードによって生成されるリボンコントロールの例は図3で確認できます。
図4 新しいMFCアプリケーションでのリボンバーの使用
リボンコントロールのほかにも、MFC Feature Packでは、Visual Studioと同様のウィンドウのドッキングもサポートしています。ドッキングの設定は比較的簡単で、次のようにドッキングマネージャへの呼び出しを行うだけで、スマートドッキングをサポートできます。
CDockingManager::SetDockingMode(DT_SMART);
スマートドッキングを適用すると、画面内でウィンドウをドラッグしている間に、ウィンドウの移動先が視覚的に表示されます。これはVisual Studioと同じ視覚効果です(図5を参照)。
Visual C++ 2008 Feature Packにより、MFCはかつてなく高いレベルに到達し、最新バージョンのMicrosoft Officeに近い外観のアプリケーションをすばやく容易に開発できるようになりました。
オーナー描画コントロールやサポートが不十分なサードパーティ製ツールキットを苦労しながら長年使ってきた開発者にしてみれば、このような強力なユーザーインターフェイス機能がVisual C++チームの手で開発およびサポートされるというのは喜ばしいニュースであり、今後のVisual C++によるネイティブ開発の復興を確信させる出来事です。実際、Feature Packは非常に優れたソフトウェアです。