本の中では、データ構造の検討のみを行い、shape.hというヘッダファイルを作成していますが、このページでは、それを元にした実際に動作するプログラムを配布します。
Windows専用です。画面描画にはGDI(Graphics Device Interface)を使用しています(今時GDI? というのはもっともですが、それを言うなら今時C? でもありますし)。
ダウンロードとコンパイル
ソースのダウンロードはこちらから。
xdraw.zip
コンパイラにはgccを使用しています。リンカにld、Windowsのリソースコンパイルのためにwindresが必要なので、私はMinGWを使用しています。
上記のコマンドが揃っていれば、展開したファイルのトップにあるバッチファイルbuild.batを実行することで、コンパイル可能です。実行形式として、xdraw.exeが生成されます。
実行するとコマンドプロンプトが表示されますが、これは、printf()でデバッグライト等入れるのを容易にするためです。不要な場合は、build.batの末尾のオプション「-console」を外してください。
使い方
上部のボタンの機能は以下の通りです。
- 選択ボタン。このボタンをクリックすると「選択モード」になり、マウスで図形をクリックするか、ドラッグして矩形で囲むことで図形を選択できます。Ctrlキーを押しながらクリックすると、複数選択も可能です。
図形を選択した状態でドラッグすることで、図形を移動できます。
- 直線描画ボタン。このボタンをクリックすると「直線描画モード」になり、マウスのドラッグで直線を引くことができます。
- ポリライン変形ボタン。このボタンをクリックすると「ポリライン変形モード」になります。このモードでは、既存のポリライン(折れ線)の頂点をドラッグすることで頂点の移動、ポリラインの辺をドラッグすることで頂点の追加、頂点で右クリックすることで頂点の削除ができます。
- 長方形描画ボタン。このボタンをクリックすると「長方形描画モード」になり、マウスのドラッグで長方形を描画できます。
- 楕円描画ボタン。このボタンをクリックすると「楕円描画モード」になり、マウスのドラッグで楕円を描画できます。
- 塗りつぶし長方形描画ボタン。このボタンをクリックすると「塗りつぶし長方形描画モード」になり、マウスのドラッグで中を塗りつぶした長方形を描画できます。
- 塗りつぶし楕円描画ボタン。このボタンをクリックすると「塗りつぶし楕円描画モード」になり、マウスのドラッグで中を塗りつぶした楕円を描画できます。
- 線色設定ボタン。このボタンをクリックすると、色選択のダイアログが表示されます。
これで色を選択し、「OK」をクリックすることで、以後描画する直線、長方形、楕円の線色を変更できます。
- 塗りつぶし色設定ボタン。このボタンをクリックすると、色選択のダイアログが表示されます。色を選択し、「OK」をクリックすることで、以後描画する塗りつぶし長方形、塗りつぶし楕円の塗りつぶしの色を変更できます。
- 削除ボタン。図形を選択後このボタンをクリックすると、選択した図形が削除されます。
- グループ化ボタン。図形を選択後このボタンをクリックすると、選択した図形がグループ化されます。
- グループ解除ボタン。グループ化された図形を選択後このボタンをクリックすると、グループが解除されます。
- 前面移動ボタン。図形を選択後このボタンをクリックすると、選択した図形が前面に移動します。
- 背面移動ボタン。図形を選択後このボタンをクリックすると、選択した図形が背面に移動します。
プログラムについて
このプログラムは、以下のような構成になっています。
- ユーザ座標系での描画機能を提供する、汎用の描画ライブラリ「DRW」。
- X-Drawの画面(GUI)を作成する「GUI」。
- 上記以外の、アプリケーションとしてのX-Drawのソース。
DRWとGUIはディレクトリを分けています。
以下がファイル構成です。「プライベートヘッダファイル」「パブリックヘッダファイル」という言葉については、本を参照してください。
- drw
- drw_pri.h … モジュールDRWのプライベートヘッダファイルです。
- create_canvas.c … DRWの描画対象である「キャンバス」関連のソースです。
- draw.c … ポリライン、矩形、楕円等の描画ルーチンです。
- main_loop.c … イベント受付のメインループです。
- gui
- gui_pri.h … モジュールGUIのプライベートヘッダファイルです。
- gui.rc … Windows特有の概念である「リソース」を定義するリソースファイルです。ここでは、メニューバーのビットマップファイルを定義しています。
- resource.h … リソースに対しIDを付与するためのヘッダファイルです。Windowsの作法だと思っておいてください。
- menu.bmp … メニューバーに表示するボタンの画像です。不思議な仕様だと思いますが、Windowsのメニューバーでは、ボタン画像を「つなげたひとつの画像」で与えます。
- create_window.c … X-Drawのウインドウを作成するソース一式です。
- DRW.h … モジュールDRWのパブリックヘッダファイルです。
- GUI.h … モジュールGUIのパブリックヘッダファイルです。
- DRW_windows.h … DRWのパブリックヘッダファイルのうち、Windowsに依存した部分です。
- shape.h … 本でも登場している、図形を定義するヘッダファイルです。
- xdraw.h … X-Drawのソース内で共有するヘッダファイルです。
- main.c … メインルーチンや、いくつかのイベントハンドラを含みます。
- polyline.c … ポリラインについて、描画、それを含む最小範囲の算出、座標からの選択、移動といった処理を行います。
- rectangle.c … 長方形について、描画、それを含む最小範囲の算出、座標からの選択、移動といった処理を行います。
- ellipse.c … 楕円について、描画、それを含む最小範囲の算出、座標からの選択、移動といった処理を行います。
- line_event.c … 直線の描画中のイベントを処理するソースです。
- rectangle_event.c … 長方形の描画中のイベントを処理するソースです。
- ellipse_event.c … 楕円の描画中のイベントを処理するソースです。
- modify_polyline_event.c … ポリライン変形中のイベントを処理するソースです。
- select_event.c … 図形選択のイベントを処理するソースです。
- shape.c … 図形全般についての処理を含んでいます。
- util.c … 全体で使用する便利ルーチンです。
- build.bat … ビルド用のバッチファイルです。