トップ 差分 一覧 ソース 検索 ヘルプ PDF ログイン

wxWidgetsでVisual C++ Intellisenseを有効にする方法

Intellisense - クイックガイド

  1. "_wx_intellisense.h(640)"をダウンロード
  2. ダウンロードしたファイルをVisual Studioプロジェクトに追加
  3. プロジェクトを閉じ、プロジェクトの*.ncbファイルを削除。
  4. プロジェクトを開く。
  5. 特に.NET 2002は、そのファイルを解析している間にクラッシュする傾向がある。その場合には、開きなおす。
  6. 新しいwxWedgetsクラスを使うときは、それがまだ定義されていない場合には、_wx_intellisense.hに"wx/something.h"と"wx/msw/something.h"を追加する。

この方法は、完全ではない。幾つかのクラスは、幾つか、または全ての関数が表示できない。しかし、多くのクラスは適度にうまくいく。

Click "here", if you are interested in the details behind _wx_intellisense.h.

Integrated (F1) Onlinehelp and wxWidgets documentation

I will no longer be making available the 'setup.msi' file here to integrate online help into visual studio. Instead I have created an installer called wxVisualSetup, which enables Intellisense, Online Help and a Project Wizard for wxWidgets.

IntellisenseとwxWidgets

Visual Studio .NETを使用しているが、この発見はVC++ 6.0と恐らく.NET 2003にも応用できる。
Visual Studio .NETを使用しているのは、オリジナルの筆者のことです

問題点

MS Intellisenseの単純なヘッダファイルの解析方法では、#if, #defineにうまく対処できない。

問題点(1)

以下を例としてあげる。:

wxprec.h
#include "wx/platform.h"       // __WXMSW__などを定義
#include "wx/wx.h"             // __WXMSW__が定義されているときに、"wx/msw/wx.h"をインクルード

platform.hは、マクロ_ _WXMSW_ _を定義する。Intellisenseがwxprec.hを解釈するとき、#includeに従ってplatform.hを読み込み、そして、#define _ _WXMSW_ _を見つける。しかし、実際にプリプロセスする時と異なり、マクロ_ _WXMSW_ _は、Intellisenseがplatform.hをクローズするときに定義がキャンセルされる。これにより、Intellisenseがwx.hを解析するとき、_ _WXMWS_ _は未定義となり、msw/wx.hはIntellisenseデータベースにインクルードされない。

結果、ほぼ全てのwxWidgetsシンボルがIntellisenseデータベースから除かれる。

問題点(2)

Intellisenseはマクロ定義を解決することができない。下記の例では、wxWindowMSWクラスはIntellisenseに認識されるが、wxWindowは認識されない。:

#define wxWindowMSW wxWindow
class wxWindowMSW {
};

加えて、マクロWXDLLEXPORTは正しく解析されず、以下の宣言も予想通り、うまくいかない。

class WXDLLEXPORT wxClass {};

解決方法

両方の問題点を解決する、非常に簡単な解決方法が存在し、非常にうまくいく。

1. 新規ファイルwx_intellisense.hを作成し、プロジェクトに追加する。このファイルが他のソースファイルからはインクルードされてはならない。必要な作業は、それをプロジェクトファイルツリーに追加することだけである。

2. 必要なwxWidgetsの各シンボルに対し、wx_intellisense.hに関連するヘッダファイルをインクルードする。include/wxの一般的な.hファイルと、include/wx/mswディレクトリにある実装用の.hファイルの両方のヘッダファイルを追加する必要がある。

例:wxFrameをIntellisenseに登録したい場合、wx_include.hに下記を追加する。

#include "wx/frame.h"
#include "wx/msw/frame.h"

wx_include.hではなく、wx_intellisense.hの間違い?

3. wx_intellisense.hを保存する。Intellisenseはそのファイルを解析し、新しい#includeを見つけて、解析可能なwxFrameクラスをインクルードする。もしIntellisenseが解析できない場合、Visual Studioを終了し、*.ncbを削除してから、プロジェクトを開きなおし、wx_intellisense.hを保存しなおす。

これで、問題点(1)は解決できるはずである。単にwxWidgets/include/wxとwxWidgets/include/wx/mwsの全てのヘッダファイルをwx_intellisense.hに追加するだけである。これは、既に試してあるが、Intellisenseが多くのファイルを解析するときに少し不安定になる。Intellisenseデータベース(*.ncbファイル)をリビルドしようとした時に、Visual Studioが何回か無反応になった。そのため、自分のプロジェクトで実際に必要になるヘッダファイルだけをインクルードし、その度にそのファイルをビルドした。少し実験してみたほうが良いかもしれない。

問題点(2)は、同様に単純な解決方法がある。単に以下をwx_intellisense.hの最後の#includeの後に、追加するだけである。

class wxWindow:public wxWindowMSW {
};

これは、wxWindowMSWの全てのメンバでwxWindowクラスを宣言するものであり、まさにwxWindowそのものである。ここでの定義は、wx_intellisense.hが実際にはコンパイルされないため、完全に偽りのものである。

そして、WXDLLEXPORTの問題のため、wx_intellisense.hの冒頭でWXDLLEXPORTを定義する必要がある。

#define WXDLLEXPORT /* */

wxWidgetsをDLLとして使用する場合でも、このファイルはコンパイルされないため、この記述をそのままにしておいて良い。

一般的に、もしも未定義なクラスが見つかりCtrl-Spaceを押してもうまくいかない場合には、インクルードファイルをwx_intellisense.hに追加して、それを保存すればよい。

wx_intellisense.hの例

もしシンボルの表示に失敗している場合には、正しいヘッダファイルを追加しなければならない。例として、もしwxBitmapを使用する場合、#include "wx/msw/bitmap.h"の直前に#include "wx/bitmap.h"を追加しなければならない。そうでなければ、幾つかのwxBitmapシンボルは未定義になる。このファイルを出発点として使用すること。

#define WXDLLEXPORT /* */
[... 中略 ...]
#include "wx/msw/missing.h"
#include "wx/msw/setup.h"
#include "wx/window.h"
#include "wx/msw/window.h"
#include "wx/msw/winundef.h"
#include "wx/sizer.h"

#undef wxWindow
class wxWindow:public wxWindowMSW
{
};

最終更新時間:2005年06月09日 19時55分07秒