杉田和久 テックステート取締役

Visual C++6.0ユーザーがVisual C++.NETに移行する際、開発環境でいちばんとまどうのは、MFCを使う場合でしょう。MFCは、バージョンアップのたびにクラスウィザードに次々機能追加したのですが、機能の統一性に問題がありました。Visual C++.NETでは、これら開発環境全体で大幅に仕様が見直され、非常に洗練され使いやすくなりました。

プロパティウィンドウでの処理

 Visual C++.NETではVisual C++6.0搭載のクラスウィザードがなくなりました(単機能のものはあります)。Visual C++6.0でのクラスウィザードの役割は、クラスのオーバーライドと、各種イベントハンドラ追加、Windowsメッセージ追加などです。Visual C++.NETでは、これらの処理にはすべてプロパティウィンドウを使います。

 たとえばクラスのオーバーライドを行いたい場合は、まずクラスビューで該当クラスを選択、プロパティウィンドウでオーバーライドのボタン(緑四角アイコン)をクリック。表示された関数一覧から、オーバーライドしたい関数をダブルクリックして追加します。

図1:イベント追加
ダイアログの各種コントロールに対するイベント追加の場合も、プロパティウィンドウから選択するだけでOK。
 ここでメッセージボタン(ウィンドウ形アイコン)クリックにより、ウィンドウメッセージ(WM_xxx)のハンドラ追加もできます。ダイアログの各種コントロールに対するイベント追加も同様。コントロールを選択した状態でプロパティウィンドウのイベントボタン(稲妻アイコン)をクリックし、リストから取得したいイベントを選択するだけです(図1[拡大表示])。

 Visual C++6.0ではダイアログやコントロールのリソースIDやスタイル設定などは、専用ダイアログから選択しましたが、これらもプロパティウィンドウ一覧で設定できます。

 これらの仕様はVisual C++に比べ統一性があり、非常に洗練されています。

新規クラスの生成

 新規クラスを作成する場合、Visual C++6.0ではクラスウィザードを使いました。これもVisual C++.NETでは方法が違っています。

 クラスビューでプロジェクトを右クリックし[追加|クラスの追加]メニューから「クラスの追加」ダイアログを利用します。MFCのクラス追加では、ダイアログ中表示される「MFCライブラリ」から派生したクラス作成のほかに、ActiveXコントロールのラッパーや、ODBCコンシューマのクラスなども選択できます。

図2:クラス追加
MFCクラスウィザードにより、簡単に新規クラスを追加することができます。
 MFCライブラリから派生させてクラスを追加すると「MFCクラスウィザード」が起動し、基本クラス選択と派生クラス入力で簡単に新規クラスが追加可能です(図2[拡大表示])。

コモンコントロールマニフェスト

 Visual C++.NETのMFCアプリケーションプロジェクトに追加された新オプションに「コモンコントロールマニフェスト」があります。

 これは、従来よりプログラマーを苦しませ続けてきた「DLL HELL」すなわちDLLのバージョン不整合による問題を解決する「サイドバイサイド」機能を付加するものです。

 この機能は、WindowsXPでコモンコントロール(ボタンやリストボックスなどのコントロール)を使う場合に、WindowsXPの新バージョン6.0のコントロールを使うための設定です。このオプションは、Visual C++.NETでは標準設定です。この機能により、コモンコントロールのDLL(COMCTL32.DLL)を使う場合、もしWindows XPを使っているならバージョン6.0のものを利用できます。

 Visual C++6.0の場合、標準ではバージョン5.0を使ってしまうので、もしコモンコントロールのバージョン6.0を使いたいなら、手作業でXML形式のマニフェストファイルを作成、さらにリソースファイル(.RC)も手で書き換えなければなりませんでした(Visual C++.NET2003ではマニフェストファイルは生成されますが、リソースファイルは手作業での書き換えが必要です)。

図3:XP_Bad
マニフェストファイルを設定しないと、たとえばダイアログなどで、スクロールバーなどの新旧混在が起こってしまい、見栄えが悪くなります。
図4:XP_Good
こちらはきちんと統一された、いい例。
 マニフェストファイルを設定しないまま出荷すると、たとえばダイアログの場合、ダイアログ自身のスクロールバーとメニューなどは自動的にWindowsXPのビジュアルな画面になるものの、それ以外のコントロールは旧形式のコントロールになります。非常に見栄えの悪いアプリケーションになってしまいますね(図3[拡大表示]、図4[拡大表示])。

その他のポイント

●MFCのバージョン

 Visual C++6.0ではMFCのバージョンは6.0でしたが、Visual C++.NET2002で7.0、VisualC++.NET2003では7.1。MFCのDLLも、Visual C++6.0は従来どおりMFC42.DLLでしたが、Visual C++.NET2002ではMFC70.DLL、Visual C++.NET2003ではMFC71.DLLです。

●サテライトDLLのサポート

 MFC7.xでは、サテライトDLL(リソースだけのDLL)利用がサポートされました。国際化対応の際、たとえば英語リソースを持つEXEがあり、そこに日本語版とドイツ語版のサテライトDLLを置いておくと、日本語環境の場合は日本語リソースが、ドイツ語環境の場合ドイツ語環境が、それ以外で本体の英語リソースが自動的に読み込まれます。

●DHTMLの編集コンポーネントサポート

 DHTMLコンポーネントはActiveXコンポーネントですが、これを使ったCHtmlEditView など、HTMLを編集できるコンポーネントをサポートするクラスが追加されました。これにより、DHTMLを使ったドキュメント-ビュー構造を持つアプリケーションが開発できます。

●リファレンスマニュアル

 Visual C++.NETでは、MFCのリファレンスに対し、大量のサンプルコード例が追加されました。

 これまでのMFCになじんでいる開発者は最初「Visual C++.NETはわかりにくい」と思われるかもしれませんが、慣れると非常に使いやすいです。また、将来 .NET開発を検討している場合にも、この環境に慣れることで、移行がスムーズになるでしょう。

杉田和久 テックステート取締役
 .NETやWindows上の開発作業全般に精通。日経BP ITPro実践スクール,日経ソフトウエア誌など,技術セミナー講師や執筆を手掛ける。