i-mode

















CodeWarrior で OpenGL
私は OS/2 上では IBM VisualAge C++ 、Windows
上では Metrowerks CodeWarrior で C/C++ プログラミングをしています。Metrowerks
を選んだのはあいもかわらずの MS 嫌いと Macintosh
を視野に入れての事でした。
しかし Codewarrior と VisualAge C++ にこれ程の差があるとは思いもしませんでした。いきなり不満になりますが例を挙げると以下の点で
Codewarrior には困りました。
- ドキュメントが使い物にならない
Visual C++ のドキュメントのしょぼさにも驚きましたがこっちは英語のみで量も少ない、しかも独自のビューワーには検索機能がありません。
Visual Age 付属のドキュメントの充実ぶりは他の追随を許さない物があります。C/C++
のリファレンス本がいらない程です、教科書もいらないかもしれません。開発環境は
IDE の使い方などよりドキュメントの濃さで選ぶことを薦めます。でも
Visual Age の独自ビューワー、コピー・ペーストできないんだよな、、、ファイルに保存はあるのに。
- Makefile & make じゃない。
ソース管理が make ベースじゃないので IDE
から離れられません。流石は Mac からの使者、と感心してしまいました。でも
MacOS X が出たら考えを改めて欲しい、UNIX
ベースなんだから。
- 落ちる
IDE ごときが落ちてはいけませんね。どうも色々独自の
GUI コンポーネントを使っているみたいで Win95/Win98/Win2000
に入れましたがまともに動いているのは Win98
のみ。ThinkPad の拡張トラックポインタのスクロール機能との相性も悪いようです。Win2000
は対応して無いだろというツッコミもあるでしょうが、「開発環境ごときがOS選ぶな」と言いたいです。
そんなこんなで OpenGL のプログラムを OS/2
から移植するのに結構手間取りました。そこでコードの書き方、設定方法などの注意を紹介したいと思います。
これは私が OpenGL + GLUT のプログラムを移植した経験に基いているので、GLUT
を使わない OpenGL プログラミング等には参考にならない場合もあると思います。
- プロジェクトの作成
"Win32 C/C++ Application Stationary"
の "C Console App" か "C++
Console App" でプロジェクトを作成しましょう。
- ターゲット設定
設定ダイアログを開いて「アクセスパス」の「システムパス」に
OpenGL を展開したディレクトリとその下の lib
ディレクトリを追加します。あとはまあ「x86
ターゲット」にある実行ファイル名を適当に設定しましょう。しかし"C++
Console App.exe"なんて名前のアプリケーション作りたい人なんているんでしょうか。
- リンカ設定
「リンカ」の「x86 リンカ」ではエントリポイントの設定をします。実際にはサブシステムを選びます。
- Windows CUI
主にコマンドプロンプトから引数を渡して実行するアプリケーションの場合はこちら。エントリポイントは一般的な
C の規則に従って main() です。引数の処理などが簡単な代わりにアイコンから実行すると不要なコマンドプロンプト窓が出るようになってしまいます。
- Windows GUI
主にアイコンをダブルクリックしたりして実行するアプリケーションの場合はこちら。エントリポイントは
Win32 の規則に従って WinMain() になります。ソースの互換性を考えて私は以下のように
WinMain() を書いています。
#ifdef _WIN32
int WINAPI WinMain( HINSTANCE hInst, /*Win32 entry-point routine */
HINSTANCE hPreInst,
LPSTR lpszCmdLine,
int nCmdShow )
{
int argc = 1;
char** argv=NULL;
main(argc, argv);
}
#endif
引数が文字列(lpszCmdLine)で渡ってきてるので簡単には
main() に渡せません。変換してくれる
API
があるのかもしれませんが、調べてません。
- ファイルの追加
必要な OpenGL ライブラリを OpenGL の lib
ディレクトリから追加します。必要に応じて
opengl32.lib, glut32.lib, glu32.lib 等を追加すればいいでしょう。
これでソースを書き始める準備はできました。次にソースを書いていく上での注意点を説明します。
- インクルードの順番
OpenGL のヘッダファイルをソースの最初で include
すると、「識別子 "WINGDIAPI"
は定義されていません」とかいうエラーが出ます。先に必要な他のライブラリ("iostream.h"等)を
include するようにしたら何故か消えました。よく分かりませんがこれ以上追ってません。
- 関数がない?
VisualAge C++ for OS/2 ではあった関数がいくつかありませんでした。これは実は拡張実装の部分で、私の互換性に対する認識が甘かったのでした。移植を考えた場合はC言語の規格やガイドライン(ANSI,
XPG4)の範囲内でプログラミングしましょう。引っかかったのは以下の関数でした。
- itoa()
数値を文字列に変換してくれます。名前が Windows
では _itoa() になってました。#ifdef で回避しました。
- access()
ファイルがどのレベル(書き込み、読み取り)でアクセスできるのか開かずに調べられます。これは
Windows にはありませんでした。仕方がないので等価な関数を手で書きました。
Visual Age C++ のドキュメントにはそれぞれの関数の言語レベル(どの規格で定義されているか)が明記されています。CodeWarrior
のリファレンスにも互換性表記がありましたが
XPG4 などはカバーしていませんでした。
とりあえずこれぐらいの注意で移植はできました。
最後に Windows 固有の話として、プログラム・アイコンの登録手順を説明しておきます。
- アイコン作成
まず困ったのはアイコンを編集する術が無いという事でした。以前の
Windows には「アイコンエディタ」がついてきたものでしたが、なぜか最近はなくなったみたいです。CodeWarrior
では ImageEdit というのが "C:\Program
Files\Metrowerks\CodeWarrior\BinSDK\bin\ImagEdit.Exe"
についてきました。これで一応グラフィックスデバイスに応じて変化するアイコンが作成できます。
- リソースファイル作成
アイコンファイルを作成したら、CodeWarrior
で拡張子が "rc" のリソースファイルを作成してそれに以下の1行を書きます。
最後のはアイコンのファイル名です。これでビルドすれば無事アイコンがプログラムに登録されます。
これでそれなりに格好のついたプログラムが作れるのではないでしょうか。
コンテンツ:
[ホーム]
[Macintosh]
[OpenGL]
[ThinkPad]
[Java]
[ダイビング]
[水中デジカメ]
このページについてのご質問はこちらへどうぞ。
このページに用いられている3Dのロゴやボタンは全てGLlogoによってレンダリングされたものです。
このページはリンクフリーです。
著作権等についてはこちらをどうぞ。