Ver0.30
2016.1.12
大野 和彦
目次
EzGraph-Win32(以下、本ライブラリ、またはWin32版と呼ぶ)は、 簡単グラフィックス・ライブラリEzGraph(以下、オリジナル版と呼ぶ) と同等の機能をWindows上で実現したものです。 EzGraphを利用して作成したCプログラムのソースを、 本ライブラリと合わせてWindows上で再コンパイルすることで、 Windows上で動作する実行プログラムが作成できます。
また、 通常Unix系OSだけで用意されている関数の一部(の不完全な実装)も提供し、 これらの関数を使用しているプログラムもコンパイルできるようにしています。 以下、これらの関数をUnix互換関数と呼びます。本ライブラリの実装にはWin32 APIだけを用い、 MFCなどのライブラリは使っていません。 このため、 Visual C++ 2010 Express Editionのように無償で利用できるWindows用コンパイラでも、 ビルドが可能です。
なお、 現時点では以下の環境のみテストしています。
作成したいプログラムが一つだけであり、 EzGraphの関数とCの標準ライブラリ関数しか使用していない場合は、 以下の手順でお手軽にビルドできます。
EzGraph.h
,
rgb.c
,
EzGraph.c
および、作成するプログラムのソースファイル
(仮に
prog.c
とします)を、同じディレクトリに入れます。EzGraph.c
rgb.c
prog.c
のように入力してください。
なお、
cc
の部分は使っているコンパイラのコマンド名
(Borland C++ならbcc32)
に置き換え、
他に必要なオプションがあれば、
適時指定してください。
本ライブラリはWindowsのWin32 APIを利用していますので、
何らかのオプションまたはライブラリの指定が必要かもしれません。
以下の場合は、 本ライブラリのソースだけをライブラリとしてビルドし、 作成したいプログラムからリンクして使用する方が便利です。
この場合は、以下のようにしてビルドします。
EzGraph-Win32
というディレクトリが作成され、
その中にソースファイル一式が展開されます。
EzGraph.lib
が生成されます。
EzGraph.lib
が生成されます。
Makefile.bcc
を
Makefile
に名前変更してから、
makeしてください。
EzGraph.h
のある場所)
を追加します。
EzGraph.lib
のあるディレクトリを追加します。
EzGraph.lib
および
ShLwApi.lib
を追加します。
EzGraph.h
のある場所)
を追加します。
EzGraph.lib
のあるディレクトリを追加します。
EzGraph.lib
および
ShLwApi.lib
を追加します。
ilink32.cfg
(デフォルト設定でインストールしていれば、
c:\borland\bcc55\Bin
にあります)を修正し、SDKライブラリを検索パスに追加します。-L"c:\Borland\Bcc55\lib"のようになっている場合、以下のように変更します。
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
-I
オプションにより、
インクルードファイルの検索パスに、
本ライブラリのディレクトリを含めます。
-L
オプションにより、
ライブラリの検索パスに、
本ライブラリのディレクトリを含めます。
EzGraph.lib
,
shlwapi.lib
を追加します。
sample.c
をコンパイルするには、
以下のようにします
(本ライブラリへのパスは適時変更してください)。
bcc32 -I../EzGraph-Win32 -L../EzGraph-Win32 sample.c EzGraph.lib shlwapi.lib
オリジナル版に対し、 Win32版の現バージョンでは、 以下のバグや制限事項・挙動の違いが存在します。
main
関数の引数として
argc
,
argv
が渡され、
実行ファイル名は
argv[0]
に、
実行時引数を指定した場合には
argv[1]
以降に格納されます。
ただし、実行ファイル名は
フルパスが格納されます。
ダブルクォーテーションでくくった引数については、
内部のスペースも含めて一個の引数として扱い、
両端のダブルクォーテーションは除去されます。argv[]
内に含まれるバックスラッシュ(円記号)はスラッシュに置換されます。myprog 10 "Documents and Settings\user\hoge.dat" data1.txt "data2.txt"以下のように格納されます。
argc: 5 argv[0]: c:/home/user/myprog.exe argv[1]: 10 argv[2]: Documents and Settings/user/hoge.dat argv[3]: data1.txt argv[4]: data2.txt
EzDrawString()
, EzDrawStringB()
EzSetTimerHandler()
EzOpenWindow()
EzSetFont()
EzSetMML()
,
EzPlayMML()
,
EzStopMML()
を用意してあるため、
MML再生を使用したプログラムもコンパイル・実行可能ですが、
実際には音楽再生は行われません。
ユーザの同じソースコードからUnix/Windows用実行ファイルを作れるように、 ライブラリ関数群のインタフェースや挙動に関しては、 Win32版はオリジナル版と可能な限り同じにしています。 一方、Win32版には以下の実行時機能が拡張されています。
printf
,
puts
関数の出力内容は、このウィンドウに表示されます。
EzPutB()
など
B
つきの描画関数
および
EzShowBuffer()
のみで表示を行っている)
プログラムは、
拡大しても表示サイズ以外の挙動は変わりません。B
つき/なしの描画関数を混在させたりした場合は、
オリジナルと挙動が異なってくる可能性があります。
EzReadXPM()
使用時)
のリソース消費を抑制できるようになっています。EzReadXPM()
でピクスマップに変換し、
EzPut()
でこのピクスマップを画面に表示します。EzReadXPM()
でビットマップに変換し、
EzPut()
でビットマップを画面に表示します。EzReadXPM()
内で縦長のビットマップを生成し、
以降、
同じ幅の画像は同じビットマップ内に並べて格納していきます。
異なる幅の画像が使用されたり、
生成したビットマップがいっぱいになったりしたときは、
新たなビットマップを生成します。
EzPut()
では、
ビットマップ内の該当する領域だけを画面に転送するようにしています。現バージョンで提供するUnix互換関数とその制限事項は、 以下のとおりです。
int usleep(int us);
int sleep(int ms);
usleep()
や
sleep()
で実行速度の調整を行うと思いますが、
これらの関数はCの標準ライブラリ関数ではないため、
Windowsには用意されていません。
そこで本ライブラリ内で同等の関数を提供しています。
ただし、Windowsではミリ秒以下のタイマがないため、
usleep()
は引数(マイクロ秒)を1000で割った商のミリ秒だけスリープします。int mkdir(char *path, mode_t mode);
int stat(char *path, struct stat *buf);
struct stat
はメンバ
st_mode
のみ持ちます。
また、同メンバの値としては
S_IFDIR
のみ反映され、
ファイルパーミッションなどの値はセットされません。
S_ISDIR()
, S_ISREG()
S_ISREG()
は非0を返します。
この2個以外のモード判定マクロは実装していません。
int access(char *path, int mode);
path
で指定したファイルが存在していれば、
mode
の値にかかわらず成功とみなします。
DIR *opendir(const char *name);
int closedir(DIR *dir);
struct dirent *readdir(DIR *dir);
DIR
,
dirent
,
構造体を1個しか確保していないため、
複数のディレクトリを同時に
opendir()
することはできません。
closedir()
を呼び出した後に、
改めて
opendir()
を呼び出すことは可能です。
多少の修正は問題ないと思いますが、 Windows上で本ライブラリを使ってEzGraph用プログラムを一から開発することは、お勧めしません。
本ライブラリは、 オリジナル版の環境で作成したプログラムを、 Windows上でも動かせるようにすることが目的です。 したがって、 オリジナル版用に作成したプログラムをWindows上で(無修正で)コンパイルでき、 実行時の挙動も再現できることを目指しています。 逆にWindows環境下で作成したプログラムをオリジナル版に持ち込む場合の配慮はしていません。
具体的には、Windows上ではスムーズに動いていたプログラムが、 オリジナル版環境では遅くてまともに動かない、 気づかずにWindows固有の関数を呼び出しており、 オリジナル環境ではコンパイルできない、 などのトラブルが予想されます。 こうした問題に対処するスキルがなければ、 開発作業はオリジナル版で行うようにしてください。
また、授業と関係なしに趣味でWindows用プログラムを開発したいのであれば、 フリーのものも含めWindows独自のライブラリがいろいろ存在しますので、 そちらを使った方が良いでしょう。 こうしたライブラリであれば、EzGraphや本ライブラリがサポートしない機能 (音楽・効果音の再生など)も使えます。
現時点ではバグや制限事項があり、 完全にオリジナルと同等にはなっていません。
また、Unix固有の関数(EzGraphの関数でも、 Cの標準ライブラリ関数でもないもの)を使っていると、 同等の関数がWindowsに用意されておらず、 コンパイルできない場合があります。
.lib
や
XXX
.h
が見つからないと言われる場合void f(int n){ printf("%d\n", n); int i; for (i = 0 ; i < n ; i++){ ... } }gccでは独自拡張により変数の宣言を文の間に書くことができますが、 ANSI Cでは変数宣言をブロックの先頭に書く必要があります。 したがって、上記のコードは以下のように修正する必要があります。
void f(int n){ int i; printf("%d\n", n); for (i = 0 ; i < n ; i++){ ... } }
printf()
が使えませんscanf()
が使えません
printf()
, scanf()
などの関数は(標準ライブラリ関数なので)
Windows環境にも用意されており、
これらの関数を使ったプログラムも正常にビルドできます。
しかし、
Windowsアプリとしてビルドするとコンソールが表示されないため、
これらの関数は実際には動作しません
(コマンドプロンプトから実行しても、
同プロンプトを標準入出力のターミナルとしては使ってくれません)。
printf()
などの出力関数は出力内容が表示されないだけですが、
scanf()
などの入力関数は入力内容をユーザが入力できないため、
致命的な不具合となります。
本ライブラリでは、
メニューバーから「表示」→「コンソール」と選択すると、
コンソールウィンドウを開くことができます。
printf()
,
puts()
については、このウィンドウ上に表示するようにしています
(その他の標準出力関数については未実装です。需要があれば実装します)。
日本語も出力可能ですが、行末の折り返しで2バイト文字を考慮していないため、
一部文字化けすることがあります(将来修正予定)。
scanf()
についても、将来的にはこのウィンドウ上で入力できるようにする予定です。
printf()
の結果が出力されません
ユーザのソースファイルが複数に分かれている場合、
各ファイルのうち
printf()
,
puts()
を使っているものについては、
EzGraphの関数を呼び出していなくても
EzGraph.h
をインクルードしてください。
コンソールウィンドウへの出力は専用の関数を呼び出す必要があり、
EzGraph.h
で定義されたマクロにより、
printf()
,
puts()
をこの関数に置き換えるようになっているためです。
VC++が生成する実行ファイルは、 デフォルトでは実行時にDLLを使うようになっているようです。 VC++をインストールしたPCにはこのDLLもインストールされていますが、 VC++をインストールしていないPCに生成した実行ファイルを持って行くと、 DLLがないので動きません。
コンソールアプリとしてビルドしている可能性があります。
Visual C++の場合はプロパティページの左側で、
「構成プロパティ」
→「リンカ」
→「システム」と選び、
右側の項目「サブシステム」を「Windows」にしてください。
borland C++の場合は
-W
オプションをつけてコンパイルしてください。
-Wall
オプションをつけてコンパイルして警告が一つも出ないのに、
Visual C++でコンパイルすると山のような警告が出ます。
Visual C++はデフォルトでかなりチェックが厳しくなっています。
_CRT_SECURE_NO_WARNINGS
」
を追加してください。
unsigned int
と
int
などの比較を行うと、細かくチェックされて警告されます。
gccでも、
-Wsign-compare
オプションを追加すると、同様の警告が出せるようになります。
バグ報告、改善意見等は、
大野(ohno@cs.info.mie-u.ac.jp
)までお願いします。
なお、本ライブラリは個人的な趣味で作成したものであり、 授業用の正規の教材として提供・保守するものではありません。 バグ修正や要望への対応はできる限り行いますが、 一定期間内にできる保障はありませんので、 御了解ください。
EzExitEventLoop()
を呼び
main
関数からリターンしてプログラムを終了した時も、
メインウィンドウのクローズボタンをクリックしたときと同様に
ウィンドウ位置をINIファイルに保存するように修正。
None
のみ認識していたのを、
none
も受理するように修正。
CTRL+A
〜
CTRL+Z
を押したとき、
キー入力の値として1〜26がハンドラに渡されるようにした。
argv[1]
が
main
関数に正しく渡されないバグを修正。
bcc
に対応するため、
printf
/puts
の代替関数の第一引数を
const char*
に変更。
argc
,
argv
を実装。実行時引数を参照できるようにした。
EzGetTimeLeft()
を実装。
printf()
,
puts()
の出力が同ウィンドウに表示されるようにした。
opendir()
,
closedir()
,
readdir()
を実装。
EzShowBuffer()
を使わない場合も
ウィンドウの再表示が行われるようにした。
EzShowBuffer()
で交換するようにした。
EzShowBuffer()
を呼んでもオフラインビットマップがクリアされないバグを修正。
EzSetKeyReleaseHandler()
,
EzSetMouseReleaseHandler()
,
EzExitEventLoop()
を実装
WM_KEYDOWN
,
WM_KEYUP
をイベントキュー化して、
順にハンドラをコールバックするようにした。