卒 業 研 究 報 告
題目Windows プログラミングによるグラフ作成ソフトの開発

指

導

教

員

武田 光由 実験講師

報

鶴野

告

平成 １４年

者

哲生

２月

７日

高知工科大学 電子・光システム工学科

目
第１章

次

序論 .................................................................................1

１．１ 背景 ................................................................................. 1
１．２ 目的 ................................................................................ 1
第２章

仕様 .................................................................................3

２．１ グラフソフトの比較 ........................................................ 3
２．２ グラフ作成ソフトの仕様 ................................................. 5
２．３ 流れ図の説明 ................................................................... 6第３章

補間法..............................................................................9

３．１ 補間法.............................................................................. 9
３．２ 使用する補間法 ............................................................... 9
３．２．１

ラグランジュ補間.................................................... 9

３．２．２ ３次スプライン補間 ................................................. 10
３．２．３ 線形最小２乗法 ........................................................ 12
３．３ 補間法の比較 ................................................................. 14

第４章

Windows プログラミング...............................................16

４．１ Windows プログラミング ............................................... 16
４．２ API 関数 ........................................................................ 16
第５章

プログラムの解説とグラフ作成ソフトの使用法..............21

５．１ プログラムの解説.......................................................... 21
５．２ グラフ作成ソフトの使用法............................................ 25
第６章

結論 ...............................................................................30

参考文献 ......................................................................................31
謝辞.............................................................................................32
付録

プログラムソース..............................................................33

3

第１章
１．１

序論
背景

かつてコンピューターは研究機関や企業などでの研究・業務用として使われていた。しかし、情報化社会といわれるようになった現在、我々の生活の中でパソコンはテレビなどの家庭電化製品と同様一般に普及している。この要因には以下のようなものが挙げられる。
llll

OS の進化
パソコンの低価格化
ソフトの充実インターネットやゲームができるなどの用途の拡大

時代が CUI の「MS‑DOS」から GUI（Graphical User Interface）の「Windows」
へ移行するにともなってパソコンが一般家庭にまで浸透した。これにより一部の専門家などが使うソフトから大衆向けのソフトになり、プログラマーに要求されるプログラミングの能力に変化が生じた。
CUI の時代では処理系によって若干の違いはあるものの基本的には「C 言語」などの単一の言語だけでプログラムすることが可能であった。しかし、「Windows」の場合にはいわゆる「Windows プログラミング」が必要にりプログ
ラミングが複雑になったが、Microsoft 社の「Visual Stdio」や Borland 社の「Delphi」などが「Windows プログラミング」を容易にすることを可能にした。
１．２

目的

本研究は科学技術分野で使用するグラフ作成ソフトの開発をすることが目的である。工学分野ではレポートや論文に実験データや理論計算などのグラフを使用するため様々なグラフソフトが利用されている。現在、世の中に普及しているグラフソフトは市販品に限らずフリーソフトにも優れたものが多くあり、使用目的や好みに応じて選ぶことができる。しかし、それらのソフトを実際に使用して機能や操作性において不満を覚えることもある。そこで、この不満点を解消した独自のグラフソフトを開発することが最終目標である。しかし、卒業研究といったごく限られた期間でこれらのソフトを凌ぐものを開発することは不可能であると考えている。そこで、本研究では、現在普及しているグラフ

1

ソフトの機能を参考にしながら最終目的であるグラフソフトの Ver.１を作成することを目指す。
「背景」でも記したように、グラフ作成ソフトを開発するに当たって単に測定データをグラフ化するだけではなく、ソフトの操作性向上のためにもインターフェースの充実が重要である。したがって、本研究を進めるうえで以下の準備が必要である。
1. プログラミング言語の習得
2. GUI プログラミング技術の習得
MS−DOS などのパソコンや大型計算機が主流であった時代では、プログラム
言語として Basic や Fortran が広く用いられてきた。しかし、現在ではシステ
ム開発の分野において C 言語が最も使用されている。
そして、企業や研究機関、一般家庭を含めたパソコンの OS は Windows 系統のものが最も普及している。これらの理由からプログラミング言語では C 言語を選択し、開発環境は Visual
Studio による Windows プログラミングを選択した。これらの技術の習得も本研究目的の一部であり、習得した技術をもとに今回作成したソフトをより完全なものに近づけて行きたいと考えている。

2

第２章
２．１

仕様
グラフソフトの比較

我々が普段使用するグラフには実に様々なものがあり、それらのグラフは用途により使い分けられている。また、グラフソフトも幾つかありそのグラフの機能もいろいろである。図１にグラフの例を示す。

折れ線グラフレーダーチャート

棒グラフ

面グラフ

円グラフ

散布図

図 1

世の中には色々なグラフを描くことのできるソフトがある。以下にそのソフトについての説明をする。
1. 「Excel」
これのソフトは表計算ソフトでその機能の一環としてグラフが描ける。
グラフの種類は豊富である。しかし、科学計算のグラフ製作が専門のソフ
トではないため、実験データなどのグラフを作成するには不向きである。

3

2. 「Sma４」
科学の世界で広く使われている散布図を簡単に作成できる 2 次元グラフ
描画ソフトである。このソフトはテキスト形式の関数やデータから自動的にグラフを作成することができ、対数プロットやスプライン補間、最小二乗フィットを使用したグラフ表示機能も備えている。また、数式変換機能もあり演算子や絶対値、平方根といった組み込み関数による数式変換もできる。
3. 「Ngraph」
このソフトは 2 次元グラフ作成ソフトである。 テキスト形式の実験デー
タ等を読み込んでグラフ化、データ解析するほか、ドロー機能やスクリプ
ト（マクロ）なども備えている。グラフは n 次関数・ユ−ザ定義関数による最小二乗フィットが可能であり、プロットデータの評価・マスク・変更もできる。さらに任意指定の数式によりデータ加工する数式変換機能もある。
4. 「gnuplot」
このソフトは対話的にグラフを描くソフトである。グラフは、関数の他に、実験データなどの離散的な数値も描くことができる。また、2 次元と 3次元のグラフが描ける。利点としては結果を tex のプログラムとして出力できる。
5. 「EasyGraph」
このソフトは数式を入力すると、画面にそのグラフを描くソフトである。
表示できるグラフは、関数、極形式、パラメータ曲線の 3 種類である。グ
ラフ式にパラメータを使うと、パラメータを変化させながらグラフの変化の様子を観察することができる。
6. 「PLOT」
このソフトは２次元グラフを作成するソフトである。定型のテキストフ
ァイルや、Excel の表などをクリップボード経由で読み込み、X 軸と Y 軸のあるグラフを描画する。グラフはプリンターに直接出力できるほか、クリップボード経由でベクトル形式のメタファイルとして、ワープロソフトな
どの外部ソフトに貼り付けることができる。

4

7. 「GraphCalc」
このソフトは２次元・３次元グラフを作成するソフトである。３次元グ
ラフはマウス操作で回転させて様々な角度から見ることができる。３次元
グラフは画像として保存したり印刷ができるほか、DXF 形式のファイルで保存することも可能で、多くの 3D CG モデリングソフトで読み込んで編集することが可能である。
２．２

グラフ作成ソフトの仕様２．１で紹介したグラフソフトにある機能を参考にしながら本グラフ作成ソ
フトは以下に列挙する機能を付加した。
（１）グラフの設定
l
l
l
l
l
l
l
l

「倍率指定」
・・・・・・・・・・・グラフの倍率を指定する。
「軸比率」
・・・・・・・・・・・・X 軸・Y 軸の比率を変更する。
「中心座標」
・・・・・・・・・・・中心の座標を変更する。
「色設定」
・・・・・・・・・・・・グラフの色を設定する。
「プロット設定」
・・・・・・・・・プロットの形を設定する。
「グラフの設定」
・・・・・・・・・グラフの結び方を設定する。
「コメントの挿入」
・・・・・・・・X 軸・Y 軸にコメントを挿入する。
「グラフの削除」
・・・・・・・・・グラフを削除する。

（２）ユーザーインターフェース
l
l
l
l
l
l
l

「新規作成」
・・・・・・・・・・・新規にグラフを作成する。
「開く」
・・・・・・・・・・・・・以前保存したファイルを開く。
「名前を付けて保存」
・・・・・・・設定を名前を付けて保存する。
「上書き保存する」
・・・・・・・・設定を上書き保存する。
「画像の保存」
・・・・・・・・・・グラフを画像として保存する。
「プリンタの設定」
・・・・・・・・プリンタの設定をする。
「印刷」
・・・・・・・・・・・・・グラフを印刷する。

（３）その他の機能
l「ヘルプ」
・・・・・・・・・・・・ヘルプを表示する。

5

l「バージョン情報」・・・・・・・・バージョン情報を表示する。

２．３

流れ図の説明図２は本グラフ作成ソフトの起動から終了までの一連の流れ図である。
ソフトを起動すると「初期画面」が現れる。次に数値を入力してやる必要がある。数値の入力方法には手動での入力と以前保存した設定ファイルからの読
み込みの２種類がある。手動での入力をする場合は「設定」を選び、以前の設定ファイルからの読み込みをする場合には「開く」を選ぶ。
数値の入力がすむと前述のグラフ関連の設定で説明した各種「グラフの設定」
をしなければならない。グラフの設定が終わるとグラフがウィンドウに表示される。現在ウィンドウに表示されているグラフを消去したい場合は「グラフの消去」を選ぶび初期画面に戻る。これを選択したことによりこれまで入力した数値やグラフの設定までは削除されない。
現在のグラフの各種設定、入力数値を保存したい場合は「上書き保存」、「名前を付けて保存」のどちらかを選ぶ。また、画像を BitMap として保存したい場
合は「画像の保存」を選択する。
現在表示されているグラフを印刷する場合、「プリンタの設定」を選び用紙のサイズや印刷するむきなどを変更することができる。
グラフの設定の保存や印刷などが終わりこれとは別に新規にグラフを作成したい場合は「新規作成」を選択する。これは「グラフの消去」と違いグラフの設定や入力した数値なども消去してしまうので設定を残したい場合はあらかじ
め保存しなければならない。これを選択すると初期画面に戻り以下これまでの処理を繰り返す。
新規にグラフを作成する必要がない場合はここでソフトの起動からの一連の動作は終了である。

6

図 2

本グラフ作成ソフトの実際の画像を用いた使い方の説明は第５章で詳しく説明する。また、本グラフソフトは図１で説明した「棒グラフ」や「円グラフ」のようなグラフではなく、科学技術分野での実験データなどをグラフ化するこ

7

とを目的としている。そのために「折れ線グラフ」や「散布図」といったグラフを扱い測定値などのグラフを滑らかに結ぶことが必要となる。そのためには補間法が必要になり、数ある補間法の中でも「３次スプライン補間」、「ラグランジュ補間」、「線形最小２乗法」を用いてグラフを描く。補間法については次章で詳しく説明する。

8

第３章
３．１

補間法
補間法

補間法とは、測定値の間を合理的につなぐ方法である。最も単純な測定値のつなぎ方はおのおのの測定点を直線で結ぶものである。補間には与えられた点を通る滑らかな多項式を求める手法と、与えられた点に近い点を通る滑らかな曲線や面を求める手法とがある。後者は図形処理や最小２乗法で用いられる。
３．２

使用する補間法

３．２．１

ラグランジュ補間

ラグランジュ補間とは n 個の点（ xi , y i ）（ i = 0,1, L , n - 1 ）が与えられたとき、 y i = P( xi ) （ i = 0,1, L , n - 1 ）を満たす n - 1 次多項式を求め、データ点以外の点の値を求める方法である。この補間多項式は以下のように求められる。

f (x) =

( x - x1 )( x - x 2 ) L ( x - x n )y0( x0 - x1 )( x0 - x 2 ) L ( x0 - x n )L ++( x - x0 )( x - x 2 ) L ( x - x n )y1( x1 - x0 )( x1 - x 2 ) L ( x1 - x n )( x - x0 )( x - x1 ) L ( x - x n -1 )yn
( x n - x 0 )( x n - x1 ) L ( x n - x n -1 )（３．１）

n æ n x- x ö
j
÷yi
= åçå
÷
ç
x
x
i =0 è j =0 i
j ø

（３．２）

（ただし i = j の場合は除く）
表２の x, y にラグランジュ補間を使ってグラフ化したものが図３のグラフで
ある。

x
y

‑2

‑1

0

1

2

3

1

0

2

4

表 1

9

図 3

３．２．２

３次スプライン補間

３次スプライン補間とは、点 x0 , x1 , L , x n-1 の関数値 f ( x0 ), f ( x1 ), L , f ( x n -1 ) と、両端における微分係数 f ¢( x1 ) と f ¢( x n -1 ) を与えられたとき、これらの値と一致す
るような補間式s ( x) = f ( xi ) + c1i ( x - xi ) + c 2 i ( x - xi ) 2 + c3i ( x - xi ) 3

xi ≦ x ≦ xi ，

（３．３）

i = 0, 1, L , ni -2の係数 c1i , c 2 i c3i を求める方法である。次のような手順で ck i は求められる。
各区間の長さ hi を求める。（ i = 0, L , n - 2 ）hi = xi +1 - xi
li , n i , d i を計算する。（ i = 1, L , n - 2 ）10ì y i +1 - y i y i - y i -1 ühi
6
, n i = 1 - li , d i =íý
hi -1 - hi
hi -1 + hi î hi
hi -1 þ

li =

（３．４）

l0 = 1, n n -1 = 1 とする。

d 0 と d n -1 を計算する。
d0 =ü
y n -1 - y n - 2 ü
6 ì y1 - y 0
6 ì- f ¢( x0 )ý, d n -1 =í
í f ¢( x n-1 ) ý
hn -1 îh0 î h0
hn -1
þ
þ

（３．５）

３重対角行列
é2
ê
ên 1
ê
ê
ê
ê
ë

l0
2

l2

L

L
n n-2

2
n n -1

é d0 ù
ù é M0 ùêúúê M ú
ê d1 ú
úê 1 ú
ú ê M ú = ê Múêúúúêl n- 2 ú ê M n -2 úêd n - 2 úêd ú
2 úû êë M n -1 úûë n -1 û（３．６）

を解いて、 M i を求める。

M i を用いて ck i を求める。（ i = 0, 1, L , ni -2 ）c2 i =

M i +1 - M iy - yiMi2, c3 i =, c1i = i +1
- c 2 i hi - c3i hi
2
6hi
hi

（３．７）

ラグランジュ補間でグラフ化したものと同じ表１での x, y の点を３次スプライン補間でグラフ化したものが図４のグラフである。

11

図 4

３．２．３

線形最小２乗法

線 形 最 小 ２ 乗 法 は 点 ( x0 , y 0 ), ( x1 , y1 ), L , ( x n -1 , y n -1 ) が 与 え ら れ た と き 、
y = ax + bが成立するとして、各点から直線 y = ax + b に鉛直に下ろした線分の長さの2 乗の和n

S = å ( y i - axi - b)i =02(i = 0, 1, L , ni -1 )（３．８）

を最小にするような a, b を決定するの方法である。S をパラメータ a と b で微分して、それぞれ 0 とおけば S の最小値を求めることができる。

{¶S2= 2 a å x i + bå xi - å xi y i
¶a

}=0

（３．

９）
¶S
= 2{aå xi + å b - å y i } = 0
¶b

（３．１

12

０）
これを a と b について解くと

(

)(

a =

n åi x i y i - å i x i åi y ib=

å y - aå x(

nåi xi - åi xi
2

i

i

i

)

)

（３．１１）

2i（３．１２）nとなる。
表２はランダムにとった１５点の x, y の値である。これを最小２乗法を用いてすべての x, y を通過する最もよい直線で結んだものが図５のグラフである。
この直線は最小２乗法により切片が約 12.48 で傾きが約 0.85 である１次関数
y = 0.85 x + 12.48

となった。

x
y

29

32

45

48

55

64

67

71

72

77

79

80

81

83

92

20

40

78

58

50

66

70

77

70

82

70

85

88

78

89

表 2

13

図 5

３．３

補間法の比較

図３のラグランジュ補間と図４の３次スプライン補間で描いた２つのグラフを比較するとさほど変わりないように見える。しかし、どのような測定値であっても図３、４のように同じようなグラフになるとは限らないので注意が必要
である。

x
y

‑5

‑4

‑3

‑2

‑1

0

1

2

3

4

5

0.19 0.29 0.5

1

2.5

5

2.5

1

0.5

0.29 0.19

表 3

表３は y =

5の式を（ - 5 ≦ x ≦ 5 ）の範囲であらわしたものであ(1 + x 2 )る。この範囲でラグランジュ補間と３次スプライン補間でグラフ化したものが
図６である。

14図 6

このグラフは図３、４のグラフと比較するとラグランジュ補間と３次スプラ
イン補間で求めた補間点の値の違いが顕著に見られる。大きく角のように振動しているグラフがラグランジュ補間のグラフである。
先に述べたようにラグランジュ補間は n - 1 次多項式でる。これは計算量は少なくてすむが，高次式で、無理にすべての点を通ろうとするため振動しやすい
欠点を有している。
それに対して，３次スプライン補間は隣接する３点を１次及び１次導関数が通るような３次式で補間するため多項式補間よりも振動しにくい。そのため変曲点も表現できる優れた性質をもつ補間法であるために実験データの処理に有効である。これらのことからラグランジュ補間の用途としては理論的に「測定値が N 次関数」になる場合に使用する。

15

第４章
４．１

Windows プログラミング
Windows プログラミング

Windows プログラミングとは Microsoft 社の Windows 系統の OS で動作するプ
ログラムを開発することを言う。最も基本的な Window は図 7−１のような構成になっており境界線内のクライアント領域の部分でアプリケーションの多くの出力が表示される。

図7 ‑ 2

図7 ‑ 1

４．２

API 関数Win32 API とは Microsoft 社がアプリケーション開発のために定義したプロ
グラミングインターフェイスのセットのことである。具体的には、関数、構造体（型）、定数などから構成されている。Win32 の「32」とは 32bit のことを意味しており、Windows3.0 以前の OS では Win16 で 16bit であった。
Win32 API には多数の関数が定義されているが、ここではグラフ作成ソフトを開発するにあたって使用した主な関数のみここでは説明していく。

16

HANDLE

オブジェクトを識別するための番号に使用される 32bit
整数

HWND

ウィンドウを識別するために使用するハンドル（ウィンドウハンドル）

BYTE

8bit の符号無し整数

WORD

16bit の符号無し整数

DWORD

32bit の符号無し整数

UNIT

unsigned int と同じ

LONG

long と同じ

BOOL

真か偽かを判断するのに使われる 32bit の整数

HINSTANSE

アプリケーションを識別するハンドル

LPSTR

文字列への 32bit ポインタ

LPCSTR

定数文字列への 32bit ポインタ
表4 ‑ 1

コンピュータには、メモリと呼ばれる記憶領域があり 1byte（8bit）単位に区切られ、その領域に大きさを指定して、データを確保する。それをデータ型と呼び Windows の基本的なデータ型は、基本的には C 言語と同じであるが使用目的により変数の型を細かく定めてる。データ型は、 windows.h にマクロ定義されている。表 4‑1 はよく使うデータ型の一部を列挙しそれぞれの解説をしたものである。
ダイアログボックス関連
GetDlgItem(HWND hDlg, int nIDDlgItem);
・指定された ID を持つコントロールのウィンドウハンドルを取得する。
GetDlgItemInt(HWND hdlg, int nIDDlgItem, BOOL *lpTranslated,
BOOL bSigned);
・ダイアログボックス内に指定されたコントロールのテキストを、整数値に変換する。
SetDlgItemText(HWND hdlg, int nIDDlgItem, LPCTSTR lpString);
・ダイアログボックス内のコントロールのテキストを設定する。
SetDlgItemInt(HWND hdlg, int nIDDlgItem, UNIT uValue, BOOL
bSigned);17

・指定された整数値を文字列に変換して、ダイアログボックス内のコ
ントロールテキストとして設定する。
SendDlgItemMessage(HWND hdlg, int nIDDlgItem, UNIT Msg, WPARAM
wParam, LPARAM lParam);
・ダイアログボックス内の指定されたコントロールにメッセージを送る。
EndDialog(HWND hDlg, int nResult);
・モーダルダイアログボックスを破棄し、処理を終了させる。
表4 ‑ 2

我々がソフトを使うときに Windows がユーザーからの情報を必要とするときがある。その時にユーザーが入力した情報を Windows に送るための物がダイア
ログボックスである。
「ダイアログボックス」とはコントロールをより簡単にそして有効に使うために特化したウインドウの事で図 6‑2 の様なものである。
ダイアログボックスの中には「エディットボックス」、「コンボボックス」、「リ
ストボックス」、「ボタン」などがあり、これらに数値や文字列の入力、あるいは選択することにより Windows 側に必要な情報を送ることができる。表 4‑2 に上げたものがダイアログボックスを使用するときに主に必要 API 関数である。
デバイスコンテキスト関連
CreateDC(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR
lpszOutput, CONST DEVMODE *lpInitDate);
・指定されたデバイスのデバイスコンテキストを作成する。
DeleteDC(HDC hdc);
・デバイスコンテキストを削除する。
DeleteObject(HGDIOBJ hObject);・ペン、ブラシ、ビットマップなどのオブジェクトを削除する。
ReleaceDC(HWND hWnd, HDC hDC);・デバイスコンテキストを開放する。
SelectObject(HDC hdc, HGDIBJ hgdiobj);
・デバイスコンテキストの指定のオブジェクトを選択する。
表4 ‑ 318

クライアント領域に何らかの図形もしくは文字列を表示する場合にはどのよ
うな色の文字を表示するかどのような図形を描くかなどの処理をしなければならない。そこで必要になるのが表 4‑3,4 にあるような API 関数である。これらの API 関数を使用することでクライアント領域に自由に図形や文字列を表示することができるようになる。
「デバイス コンテキスト」とは､ グラフィック オブジェクトとそれに関連する属性､ 出力に影響するグラフィック モードを定義する構造体のことである。多くの Win32 構造体とは異なり､ アプリケーションはデバイス コンテキス
トを直接アクセスすることはなく､ さまざまな関数を呼び出して間接的に構造体を操作しなければならない。
描画関連
BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
・WM̲PAINT メッセージに対する描画を開始する。
EndPaint(HWND hDlg, int nResult);
・モーダルダイアログボックスを終了する。
CreateBitmap(int nWidth, int nHeight, UINT cPlanes, UINT cBitsPerPel, //number of bits required to identify a color CONST VOID *lpvBits );・ビットマップを作成する。
BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int
hHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);・ビットブロック転送を行う。
PatBlt(HDC hdcDest, int nXLeft, int nYLeft, int nWidth, int
hHeight, DWORD dwRop);
・ブラシで長方形の範囲でペイントする。
FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr);
・長方形を塗りつぶす。
CreateFont(int nHeight, int nWidth, int nEscapement, int
nOrientation, int fnWeight, DWORD fdwItalic, DWORD fdwUnderline,
DWORD fdwStrikeOut, DWORDfdwCharSet, WORD fdwOutputPrecision,
DWORD fdwClipPrecision, DWORD fdwQuality,
DWORD fdwPitchAndFamily, LPCTSTR lpszFace);
・フォントを作成する。
TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int

19

cbString);
・文字列を描画する。
LineTo(HDC hdc, int nXEnd, int nYEnd,);・カレントポジションから指定の点までの線分を描画する。
MoveToEx(HDC hdc, int X, int Y, LPPTONT lpPoint);
・カレントポジションを更新する。
CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);・ペンを作成する。
表4 ‑ 4

20

第５章
５．１

プログラムの解説とグラフ作成ソフトの使用法
プログラムの解説

ここでは第３章で説明した「ラグランジュ補間」、「３次スプライン補間」、「線形最小２
乗法」の３つのプログラムの解説をする。

ラグランジュ補間
double lagrange(double nx[][50], double ny[][50], int n[], double x, int a) ------------ ①{
int i, j;double fx = 0, sum = 0;
for (i = 0; i < n[a]; i++) {fx = ny[a][i];for (j = 0; j < n[a]; j++) {if (i != j)
fx = fx ＊ (x - nx[a][j]) /②(nx[a][i] - nx[a][j]);}sum += fx;}
return (sum); ---------------------------------------------------------------- ③}① lagrange 関数に引数として測定点の２次元配列 nx[][50]と ny[][50]、測定点の合計の要素 n[],補間点の間隔 x,測定点の配列の要素 a を渡す。
② 式（３．２）の処理。条件 j ¹ i の場合を除く。
③ y の値を返す。

21

３次スプライン補間
double spline(double nx[][50], double ny[][50], int n[], double x, int a) ------------- ①{
int i;
double p, s;
double h[1000], d[1000], f[1000], e[1000], u[1000], m[1000], end[2],c1[1000], c2[1000], c3[1000];for (i = 0; i < n[a] - 1; i++)h[i] = nx[a][i + 1] - nx[a][i];f[0] = 1;e[n[a] - 1] = 1;②
for (i = 1; i < n[a] - 1; i++) {f[i] = h[i] / (h[i - 1] + h[i]);e[i] = 1 - f[i];u[i] = 6 / (h[i - 1] + h[i]) ＊ ((ny[a][i + 1] - ny[a][i]) /h[i] - (ny[a][i] - ny[a][i - 1]) / h[i - 1]);}for (i = 0; i < n[a]; i++)d[i] = 2;
end[0] = 0;③

end[1] = 0;u[0] = 6 / h[0] ＊ ((ny[i][1] - ny[i][0]) / h[0] - end[0]);u[n[a] - 1] = 6 / h[n[a] - 2] ＊(end[1] - (ny[a][n[a] - 1] - ny[a][n[a] - 2]) / h[n[a] - 2]);for (i = 0; i < n[a] - 1; i++) {p = e[i + 1] / d[i];d[i + 1] -= p ＊ f[i];u[i + 1] -= p ＊ u[i];

④

}

22

u[n[a] - 1] /= d[n[a] -1];
for (i = n[a] - 2; i >= 0; i--) {u[i] = (u[i] - f[i] ＊ u[i + 1]) / d[i];}④for (i = 0; i < n[a]; i++) {m[i] = u[i];}for (i = 0; i < n[a] - 1; i++) {c2[i] = m[i] / 2;c3[i] = (m[i+1] - m[i]) / (6 ＊ h[i]);c1[i] = (ny[a][i+1] - ny[a][i]) / h[i] - c2[i] ＊h[i] - c3[i] ＊ h[i] ＊ h[i];if ((x >= nx[a][i]) && (x <= nx[a][i + 1])) {⑤s = ny[a][i] + c1[i] ＊ (x - nx[a][i]) + c2[i] ＊(x - nx[a][i]) ＊ (x - nx[a][i]) +c3[i] ＊ (x - nx[a][i]) ＊ (x - nx[a][i]) ＊(x - nx[a][i]);}}return (s); ------------------------------------------------------------------------ ⑥}① spline 関数に引数として測定点の２次元配列 nx[][50]と ny[][50]、測定点の合計の要素 n[],補間点の間隔 x,測定点の配列の要素 a を渡す。
② 式（３．４）の処理。
③ 式（３．５）の処理。
④ 式（３．６）の処理。３重対角行列を処理している。
⑤ 式（３．３）の係数 c1i , c 2 i c3i を求めている。
⑥ 式（３．３）に⑤で求めた係数を代入し、 y の値を返す。

23

線形最小２乗法
double lsq1(double nx[][50], double ny[][50], int n[], int c)---------- ①{
double a, b, A=0, B=0, C=0, D=0;
int i;ｆor (i = 0; i < n[c]; i++) {A += nx[c][i] ＊ ny[c][i];B += nx[c][i];②C += ny[c][i];D += nx[c][i] ＊ nx[c][i];｝a = (n[c] ＊ A - B ＊ C) / (n[c] ＊ D - B ＊ B);③b = (C - a ＊ B) / n[c];return (a);//lsq2 は b を返す。----------------------------------------------- ④}

測定点の① lsq1 関数に引数として測定点の２次元配列 nx[][50]と ny[][50]、
合計の要素 n[],測定点の配列の要素 a を渡す。
② 式（３．９）、（３．１０）の処理。
③ 式（３．１１）の処理。②を a と b について連立方程式を解く。
④

a （lsq2 の場合は b ）を返す

24

５．２

グラフ作成ソフトの使用法

新規にグラフを作成する
1.
2.

メニューバーのファイルを選択する。（図 7 を参照）
メニューアイテムの新規作成を選択する。（図 8-1 を参照）

以前のファイルを開く
1.
2.

メニューバーのファイルを選択する。（図 7 を参照））
メニューアイテムの開くを選択する。（図 8-1 を参照）

ファイルの保存「名前を付けて保存」の場合
1.
2.

メニューバーのファイルを選択する。（図 7 を参照）
メニューアイテムの名前を付けて保存を選択する。
（図 8-1 を参照）

「上書保存」の場合
1.
2.

メニューバーのファイルを選択する。（図 7 を参照）
メニューアイテムの上書保存を選択する。（図 8-1 を参照）

グラフの保存1.
2.

メニューバーのファイルを選択する。（図 7 を参照）
メニューアイテムの画像の保存を選択する。（図 8-1 を参照）

プリンタの設定
1.
2.

メニューバーのファイルを選択する。（図 7 を参照）
メニューアイテムのプリンタの設定を選択する。（図 8-1 を参照）

印刷
1.
2.

メニューバーのファイルを選択する。（図 7 を参照）
メニューアイテムの印刷を選択する。（図 8-1 を参照）

25

ソフトを終了する
1.
2.

メニューバーのファイルを選択する。（図 7 を参照）
メニューアイテムの終了もしくはタイトルバー右上の×印を選択する。（図 8-1、7 を参照）

図 7

図8 ‑ 1

図8 ‑ 226

図8 ‑ 3グラフの作成
1.
2.
3.
4.
5.

メニューバーの編集を選択する。（図 7 を参照）
メニューアイテムの設定を選択する。（図 8‑3 を参照）
プロパティーシートに数値を入力し OK ボタンをクリックする。
（図10 を参照）
メニューバーの編集を選択する。（図 7 を参照）
プロパティーシートでグラフの設定をし OK ボタンをクリックする。
（図 9 を参照）

グラフの消去1.
2.

メニューバーの編集を選択する。（図 7 を参照）
メニューアイテムのグラフの消去を選択する。（図 8-3 を参照）

バージョン情報を見る
1.
2.

メニューバーのヘルプを選択する。（図 7 を参照）
メニューアイテムのバージョン情報を選択する。（図 8-2 を参照）

ヘルプを見る1.
2.

メニューバーのヘルプを選択する。（図 7 を参照）
メニューアイテムのヘルプを選択する。（図 8-2 を参照）

27

図 9

28

図 10

29

第６章

結論

本研究では科学技術の分野での実験データや理論計算などに使用するグラフ作成ソフトを開発した。
システム開発で最も一般的な C 言語を使用し、現在、企業や研究機関、一般家庭を含めて広く使用されているパソコンの OS である Windows 上で動作するソ
フトウェアを開発するために Windows プログラミングの学習をした。そして、科学技術の分野でグラフを描く場合に必要な補間法などの数値計算法を学習することによりグラフソフトの Ver.1 の完成に至った。
しかし、市販されているソフトやフリーソフトなどと本グラフソフトを比較すると操作性や機能の面で及ばない。今後の課題として
l
l
l
l
l

「対数グラフ化」「コメントの挿入」「エラーバーの挿入」「その他の補間法の追加」「txt ファイルからの数値の読み込み」などが挙げられる。これらの機能を随時付加することにより本グラフ作成ソフ
トをより完成なものに近づけてゆきたい。

30

参考文献
１． 定本 明解 C 言語入門
柴田 望洋 著
ソフトバンクパブリッシング
２．Win32 API オフィシャルリファレンス 改訂版
マイクロソフト株式会社 編集 アスキー書籍編集部 編
株式会社アスキー １９９９年４月１日 第１版第７刷
３．C／C++プログラマのための Windows95 プログラミング
ハーバート・シルト 著 柏原 正三 訳・監修
株式会社翔泳社 １９９８年５月３０日 初版第８刷
４．Fortran 95, C & JAVA による新数値計算法
小国 力 著
株式会社サイエンス社 １９９７年１２月２５日
５．改訂 C 言語によるはじめてのアルゴリズム入門
川西 朝雄 著
株式会社技術評論社 ２００１年７月

31

初版

初版

謝辞
本稿を書くにあたって、指導教員である原央先生と武田光由先生から数々の指導・助言を頂いたことを深く感謝し、また論文を書くにあたり参考にさせて頂いた著者の方々に対しても感謝の意を表したい。

32

付録

プログラムソース※ はページ数の都合から同じ処理は省略した。

graph.h
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK MyDlg1Proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK MyDlg2Proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK MyDlg3Proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK MyDlg4Proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK MyDlg5Proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK MyDlg0Proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);

#define N 999#ifndef INSTANCE
extern#endifint nx, ny;#ifndef INSTANCE
extern#endiflong arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14;#ifndef INSTANCE
extern#endifint Xmax, Xmin, Ymax, Ymin, width̲x, width̲y, volume;#ifndef INSTANCE
extern#endifchar X̲title[256], Y̲title[256], XPOS[256], YPOS[256];33

#ifndef INSTANCE
extern#endiflong double px[5][50], py[5][50], Xpos, Ypos;

HANDLE hInst;

HPEN hBlackPen, hRedPen, hBluePen, hGreenPen, hYellowPen, hGreyPen, hWhitePen;
HWND hParent;
HFONT hFont1, hFont2#ifndef INSTANCE
extern#endifchar xa1[10], …,

xa50[10],ya1[10], …,

ya50[10],xb1[10], …,

xb50[10],yb1[10], …,

yb50[10],xc1[10], …,

xc50[10],yc1[10], …,

yc50[10],xd1[10], …,

xd50[10],yd1[10], …,

yd50[10],xe1[10], …,

xe50[10],ye1[10], …,

ye50[10];※

Setup.h/*セクション*/char strSection1[] = "設定", strSection2[] = "グラフ１", strSection3[] = "グラフ２",
strSection4[] = "グラフ３", strSection5[] = "グラフ４", strSection6[] = "グラフ５";/*設定*/
char strKey1[] = "GraphType", strKey2[] = "Magnification", strKey3[] = "PlotType",
strKey4[] = "Color", strKey5[] = "CenterX", strKey6[] = "CenterY", strKey7[] = "XTitle",
strKey8[] = "YTitle", strKey9[] = "Xmemori", strKey10[] = "Ymemori", strKey11[] = "graphvol",34

strKey12[] = "graph1", strKey13[] = "graph2", strKey14[] = "graph3", strKey15[] = "graph4",
strKey16[] = "graph5", strKey17[] = "Xmag", strKey18[] = "Ymag";/*グラフ１〜５*/char strxa1[] = "Xa1", … strxa50[] = "Xa50";
char strya1[] = "Ya1", … strya50[] = "Ya50";
char strxb1[] = "Xb1", … strxb50[] = "Xb50";
char stryb1[] = "Yb1", … stryb50[] = "Yb50";
char strxc1[] = "Xc1", … strxc50[] = "Xc50";※
char stryc1[] = "Yc1", … stryc50[] = "Yc50";
char strxd1[] = "Xd1", … strxd50[] = "Xd50";
char stryd1[] = "Yd1", … stryd50[] = "Yd50";
char strxe1[] = "Xe1", … strxe50[] = "Xe50";char strye1[] = "Ye1", … strye50[] = "Ye50";/*設定*/
char strData1[256], … strData18[256];
char strxaData1[256], … strxaData50[256];
char stryaData1[256], … stryaData50[256];
char strxbData1[256], … strxbData50[256];※

char strybData1[256], … strybData50[256];
char strxcData1[256], … strxcData50[256];
char strycData1[256], … strycData50[256];
char strxdData1[256], … strxdData50[256];
char strydData1[256], … strxeData50[256];
char stryeData1[256], … stryeData50[256];

resource.h//{{NO_DEPENDENCIES}}// Microsoft Developer Studio generated include file.
// Used by riso.rc//#define IDC_COMBO1

1000※#define IDC_COMBO14

1013

35

#define IDC_EDIT1

1021#define IDC_EDIT11

1031#define IDC_xa1

1100#define IDC_xa50

1149#define IDC_ya1

1200#define IDC_ya501249#define IDC_xb1

1300#define IDC_xb50

1349#define IDC_yb1

1400#define IDC_yb50

1449#define IDC_xc1

1500#define IDC_xc50

1549#define IDC_yc1

1600#define IDC_yc50

1649#define IDC_xd1

1700#define IDC_xd50

1749#define IDC_yd1

1800#define IDC_yd50

1849#define IDC_xe1

1900#define IDC_xe1

1949#define IDC_ye1

2000#define IDC_ye50

2049#define GRAPH

40001#define DEL

40002#define VERSION

40003

36

※

#define SAVEBMP

40004#define NEWFILE

40006#define FILEOPEN

40007#define SAVENAMEFILE

40009#define SAVEFILE

40010#define SETPRINTER

40011#define PRINT

40012#define EXIT

40013

#define SETGRAPH1

40016#define SETGRAPH2

40017#define SETGRAPH3

40018#define SETGRAPH4

40019#define SETGRAPH5

40020// Next default values for new objects//#ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE

125#define _APS_NEXT_COMMAND_VALUE

40021#define _APS_NEXT_CONTROL_VALUE

1269#define _APS_NEXT_SYMED_VALUE

101#endif#endifceatememdc.c#include <windows.h>#include "resource.h"void CreateMemdc(HWND hWnd, HDC memdc, HBITMAP *hBit,int fnObject){

HWND hDesk;
RECT ScrnSize;
HDC hdc;

37

HBRUSH hBrush,hDefBrush;hDesk = GetDesktopWindow();
GetClientRect(hWnd, &ScrnSize);

hdc = GetDC(hWnd);*memdc = CreateCompatibleDC(hdc);*hBit = CreateCompatibleBitmap(hdc,ScrnSize.right,ScrnSize.bottom);SelectObject(*memdc, *hBit);
hBrush = (HBRUSH)GetStockObject(fnObject);hDefBrush = SelectObject(*memdc,hBrush);
PatBlt(*memdc,0,0,ScrnSize.right,ScrnSize.bottom,PATCOPY);
SelectObject(*memdc,hDefBrush);
DeleteObject(hBrush);
ReleaseDC(hWnd,hdc);

return;}dlgproc.c#include <windows.h>#include "graph.h"#include "resource.h"

LRESULT CALLBACK MyDlg0Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
NMHDR *nmhdr;
BOOL Error;
int i;
LPCTSTR fuc[] = {"なし", "３次スプライン補間", "ラグランジュ補間","線形最小 2 乗法", "折れ線", "棒グラフ"};
LPCTSTR percent[] = {"300%", "250%", "200%", "150%", "100%", "75%", "50%"};38

LPCTSTR percent2[] = {"100%", "90%", "80%", "70%", "60%", "50%", "40%","30%", "20%", "10%"};
LPCTSTR mesure[] = {"なし", "1", "5", "10", "50", "100", "500", "1000"};
LPCTSTR color[] = {"黒色", "赤色", "青色", "緑色", "黄色"};
LPCTSTR line[] = {"なし", "実線", "点線", "破線", "一点破線", "二点破線"};
LPCTSTR plot[] = {" なし","●円形", "▲三角形", "▼逆三角形", "◆菱形", "■四角形"};
LPCTSTR gvolume[] = {"0", "1", "2", "3", "4", "5"};LPCTSTR pvolume[] = {"0", … ,"50"};

switch(msg) {case WM̲INITDIALOG:
for (i = 0; i < 5; i++) {SendDlgItemMessage(hDlg,IDC̲COMBO4, CB̲INSERTSTRING, (WPARAM)i, (LPARAM)color[i]);}for (i = 0; i < 6; i++) {SendDlgItemMessage(hDlg, IDC̲COMBO1, CB̲INSERTSTRING, (WPARAM)i, (LPARAM)fuc[i]);SendDlgItemMessage(hDlg,IDC̲COMBO3,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)plot[i]);SendDlgItemMessage(hDlg,IDC̲COMBO7,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)gvolume[i]);}for (i = 0; i < 7; i++) {SendDlgItemMessage(hDlg,IDC̲COMBO2,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)percent[i]);}for (i = 0; i < 8; i++) {SendDlgItemMessage(hDlg,IDC̲COMBO5,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)mesure[i]);SendDlgItemMessage(hDlg,IDC̲COMBO6,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)mesure[i]);}39for (i = 0; i < 10; i++) {SendDlgItemMessage(hDlg,IDC̲COMBO13,CB̲INSERTSTRING, (WPARAM)i,(LPARAM)percent2[i]);SendDlgItemMessage(hDlg,IDC̲COMBO14,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)percent2[i]);}for (i = 0; i < 51; i++) {SendDlgItemMessage(hDlg,IDC̲COMBO8,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)pvolume[i]);SendDlgItemMessage(hDlg,IDC̲COMBO9,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)pvolume[i]);SendDlgItemMessage(hDlg,IDC̲COMBO10,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)pvolume[i]);SendDlgItemMessage(hDlg,IDC̲COMBO11,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)pvolume[i]);SendDlgItemMessage(hDlg,IDC̲COMBO12,CB̲INSERTSTRING,(WPARAM)i,(LPARAM)pvolume[i]);}/*中心座標*/SetDlgItemText(hDlg,IDC̲EDIT1,(LPTSTR)XPOS);
SetDlgItemText(hDlg,IDC̲EDIT2,(LPTSTR)YPOS);/*軸名称*/
SetDlgItemText(hDlg,IDC̲EDIT3,(LPCTSTR)X̲title);
SetDlgItemText(hDlg,IDC̲EDIT4,(LPCTSTR)Y̲title);/*コンボボックス*/
SendDlgItemMessage(hDlg,IDC̲COMBO1,CB̲SETCURSEL,(WPARAM)arg1,0L);//グラフ

SendDlgItemMessage(hDlg,IDC̲COMBO2,CB̲SETCURSEL,(WPARAM)arg2,0L);//倍率

SendDlgItemMessage(hDlg,IDC̲COMBO3,CB̲SETCURSEL,(WPARAM)arg3,0L);//点

SendDlgItemMessage(hDlg,IDC̲COMBO4,CB̲SETCURSEL,(WPARAM)arg4,0L);//色

SendDlgItemMessage(hDlg,IDC̲COMBO5,CB̲SETCURSEL,(WPARAM)arg5,0L);//X メモリ

SendDlgItemMessage(hDlg,IDC̲COMBO6,CB̲SETCURSEL,(WPARAM)arg6,0L);//Y メモリ

40

SendDlgItemMessage(hDlg,IDC̲COMBO7,CB̲SETCURSEL,(WPARAM)arg7,0L);//グラフ数

SendDlgItemMessage(hDlg,IDC̲COMBO8,CB̲SETCURSEL,(WPARAM)arg8,0L);//グラフ１

SendDlgItemMessage(hDlg,IDC̲COMBO9,CB̲SETCURSEL,(WPARAM)arg9,0L);//グラフ２

SendDlgItemMessage(hDlg,IDC̲COMBO10,CB̲SETCURSEL,(WPARAM)arg10,0L);//グラフ３

SendDlgItemMessage(hDlg,IDC̲COMBO11,CB̲SETCURSEL,(WPARAM)arg11,0L);//グラフ４

SendDlgItemMessage(hDlg,IDC̲COMBO12,CB̲SETCURSEL,(WPARAM)arg12,0L);//グラフ５

SendDlgItemMessage(hDlg,IDC̲COMBO13,CB̲SETCURSEL,(WPARAM)arg13,0L);
SendDlgItemMessage(hDlg,IDC̲COMBO14,CB̲SETCURSEL,(WPARAM)arg14,0L);

return TRUE;
case WM̲NOTIFY:
nmhdr = (NMHDR *)lp;
switch(nmhdr‑>code) {case PSN̲APPLY:
arg1 = SendDlgItemMessage(hDlg, IDC̲COMBO1, CB̲GETCURSEL, 0L, 0L);
arg2 = SendDlgItemMessage(hDlg, IDC̲COMBO2, CB̲GETCURSEL, 0L, 0L);
arg3 = SendDlgItemMessage(hDlg, IDC̲COMBO3, CB̲GETCURSEL, 0L, 0L);
arg4 = SendDlgItemMessage(hDlg, IDC̲COMBO4, CB̲GETCURSEL, 0L, 0L);
arg5 = SendDlgItemMessage(hDlg, IDC̲COMBO5, CB̲GETCURSEL, 0L, 0L);
arg6 = SendDlgItemMessage(hDlg, IDC̲COMBO6, CB̲GETCURSEL, 0L, 0L);
arg7 = SendDlgItemMessage(hDlg, IDC̲COMBO7, CB̲GETCURSEL, 0L, 0L);
arg8 = SendDlgItemMessage(hDlg, IDC̲COMBO8, CB̲GETCURSEL, 0L, 0L);
arg9 = SendDlgItemMessage(hDlg, IDC̲COMBO9, CB̲GETCURSEL, 0L, 0L);
arg10 = SendDlgItemMessage(hDlg, IDC̲COMBO10, CB̲GETCURSEL, 0L, 0L);
arg11 = SendDlgItemMessage(hDlg, IDC̲COMBO11, CB̲GETCURSEL, 0L, 0L);
arg12 = SendDlgItemMessage(hDlg, IDC̲COMBO12, CB̲GETCURSEL, 0L, 0L);
arg13 = SendDlgItemMessage(hDlg, IDC̲COMBO13, CB̲GETCURSEL, 0L, 0L);
arg14 = SendDlgItemMessage(hDlg, IDC̲COMBO14, CB̲GETCURSEL, 0L, 0L);
width̲x = 421 ‑ strlen(X̲title) * 4;//746 421
width̲y = 275 + strlen(Y̲title) * 4;//516 275/*中心座標*/GetDlgItemText(hDlg, IDC̲EDIT1, (LPTSTR)XPOS,255);
GetDlgItemText(hDlg, IDC̲EDIT2, (LPTSTR)YPOS,255);
Xpos= atof(XPOS);
Ypos = atof(YPOS);

41

/*軸名称*/
GetDlgItemText(hDlg,IDC̲EDIT3,(LPTSTR)X̲title,255);
GetDlgItemText(hDlg,IDC̲EDIT4,(LPTSTR)Y̲title,255);

InvalidateRect(hParent, NULL, TRUE);
return TRUE;

default:
return FALSE;}
break;}
return FALSE;}LRESULT CALLBACK MyDlg1Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
NMHDR *nmhdr;

switch(msg) {case WM̲INITDIALOG:
SetDlgItemText(hDlg,IDC̲xa1,(LPCTSTR)xa1);

SetDlgItemText(hDlg,IDC̲xa50,(LPCTSTR)xa50);※
SetDlgItemText(hDlg,IDC̲ya1,(LPCTSTR)ya1);

SetDlgItemText(hDlg,IDC̲ya50,(LPCTSTR)ya50);
return TRUE;
case WM̲NOTIFY:
nmhdr = (NMHDR *)lp;
switch(nmhdr‑>code) {case PSN̲APPLY:
GetDlgItemText(hDlg, IDC̲xa1, (LPTSTR)xa1, 10);※
GetDlgItemText(hDlg, IDC̲xa1, (LPTSTR)xa1, 10);42

GetDlgItemText(hDlg, IDC̲xa1, (LPTSTR)xa1, 10);

GetDlgItemText(hDlg, IDC̲xa50, (LPTSTR)xa50, 10);
GetDlgItemText(hDlg, IDC̲ya1, (LPTSTR)ya1, 10);

GetDlgItemText(hDlg, IDC̲ya50, (LPTSTR)ya50, 10);px[0][0]= atof(xa1);

py[0][0]= atof(ya1);px[0][49]= atof(xa50);py[0][49]= atof(ya50);※

InvalidateRect(hParent, NULL, TRUE);
return TRUE;
default:
return FALSE;}
break;}

return FALSE;}LRESULT CALLBACK MyDlg1Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
NMHDR *nmhdr;

switch(msg) {case WM̲INITDIALOG:
SetDlgItemText(hDlg,IDC̲xa1,(LPCTSTR)xa1);

SetDlgItemText(hDlg,IDC̲xa50,(LPCTSTR)xa50);
SetDlgItemText(hDlg,IDC̲ya1,(LPCTSTR)ya1);

SetDlgItemText(hDlg,IDC̲ya50,(LPCTSTR)ya50);

43※

return TRUE;
case WM̲NOTIFY:
nmhdr = (NMHDR *)lp;
switch(nmhdr‑>code) {case PSN̲APPLY:
GetDlgItemText(hDlg, IDC̲xa1, (LPTSTR)xa1, 10);

GetDlgItemText(hDlg, IDC̲xa50, (LPTSTR)xa50, 10);
GetDlgItemText(hDlg, IDC̲ya1, (LPTSTR)ya1, 10);

GetDlgItemText(hDlg, IDC̲ya50, (LPTSTR)ya50, 10);px[0][0]= atof(xa1);

py[0][0]= atof(ya1);px[0][49]= atof(xa50);py[0][49]= atof(ya50);

InvalidateRect(hParent, NULL, TRUE);
return TRUE;
default:
return FALSE;}
break;}

return FALSE;}LRESULT CALLBACK MyDlg2Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
NMHDR *nmhdr;

switch(msg) {case WM̲INITDIALOG:
SetDlgItemText(hDlg,IDC̲xb1,(LPCTSTR)xb1);※
SetDlgItemText(hDlg,IDC̲xb50,(LPCTSTR)xb50);

44※

SetDlgItemText(hDlg,IDC̲yb1,(LPCTSTR)yb1);

SetDlgItemText(hDlg,IDC̲yb50,(LPCTSTR)yb50);
return TRUE;
case WM̲NOTIFY:
nmhdr = (NMHDR *)lp;
switch(nmhdr‑>code) {case PSN̲APPLY:
GetDlgItemText(hDlg, IDC̲xb1, (LPTSTR)xb1, 10);

GetDlgItemText(hDlg, IDC̲xb50, (LPTSTR)xb50, 10);
GetDlgItemText(hDlg, IDC̲yb1, (LPTSTR)yb1, 10);※
GetDlgItemText(hDlg, IDC̲yb50, (LPTSTR)yb50, 10);px[1][0]= atof(xb1);

py[1][0]= atof(yb1);

px[1][49]= atof(xb50);

py[1][49]= atof(yb50);

InvalidateRect(hParent, NULL, TRUE);
return TRUE;
default:
return FALSE;}
break;}

return FALSE;}LRESULT CALLBACK MyDlg3Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
NMHDR *nmhdr;

switch(msg) {case WM̲INITDIALOG:

45

SetDlgItemText(hDlg,IDC̲xc1,(LPCTSTR)xc1);

SetDlgItemText(hDlg,IDC̲xc50,(LPCTSTR)xc50);
SetDlgItemText(hDlg,IDC̲yc1,(LPCTSTR)yc1);

SetDlgItemText(hDlg,IDC̲yc50,(LPCTSTR)yc50);
return TRUE;
case WM̲NOTIFY:
nmhdr = (NMHDR *)lp;
switch(nmhdr‑>code) {case PSN̲APPLY:
GetDlgItemText(hDlg, IDC̲xc1, (LPTSTR)xc1, 10);

GetDlgItemText(hDlg, IDC̲xc50, (LPTSTR)xc50, 10);
GetDlgItemText(hDlg, IDC̲yc1, (LPTSTR)yc1, 10);

GetDlgItemText(hDlg, IDC̲yc50, (LPTSTR)yc50, 10);px[2][0]= atof(xc1);

py[2][0]= atof(yc1);

px[2][49]= atof(xc50);

py[2][49]= atof(yc50);

InvalidateRect(hParent, NULL, TRUE);
return TRUE;
default:
return FALSE;}
break;}

return FALSE;}LRESULT CALLBACK MyDlg4Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
NMHDR *nmhdr;

46

switch(msg) {case WM̲INITDIALOG:
SetDlgItemText(hDlg,IDC̲xd1,(LPCTSTR)xd1);

SetDlgItemText(hDlg,IDC̲xd50,(LPCTSTR)xd50);
SetDlgItemText(hDlg,IDC̲yd1,(LPCTSTR)yd1);

SetDlgItemText(hDlg,IDC̲yd50,(LPCTSTR)yd50);
return TRUE;
case WM̲NOTIFY:
nmhdr = (NMHDR *)lp;
switch(nmhdr‑>code) {case PSN̲APPLY:
GetDlgItemText(hDlg, IDC̲xd1, (LPTSTR)xd1, 10);

GetDlgItemText(hDlg, IDC̲xd50, (LPTSTR)xd50, 10);
GetDlgItemText(hDlg, IDC̲yd1, (LPTSTR)yd1, 10);

GetDlgItemText(hDlg, IDC̲yd50, (LPTSTR)yd50, 10);px[3][0]= atof(xd1);

py[3][0]= atof(yd1);

px[3][49]= atof(xd50);py[3][49]= atof(yd50);

InvalidateRect(hParent, NULL, TRUE);
return TRUE;
default:
return FALSE;}
break;}

return FALSE;}

47

LRESULT CALLBACK MyDlg5Proc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
NMHDR *nmhdr;

switch(msg) {case WM̲INITDIALOG:
SetDlgItemText(hDlg,IDC̲xe1,(LPCTSTR)xe1);

SetDlgItemText(hDlg,IDC̲xe50,(LPCTSTR)xe50);
SetDlgItemText(hDlg,IDC̲ye1,(LPCTSTR)ye1);

SetDlgItemText(hDlg,IDC̲ye50,(LPCTSTR)ye50);
return TRUE;
case WM̲NOTIFY:
nmhdr = (NMHDR *)lp;
switch(nmhdr‑>code) {case PSN̲APPLY:
GetDlgItemText(hDlg, IDC̲xe1, (LPTSTR)xe1, 10);

GetDlgItemText(hDlg, IDC̲xe50, (LPTSTR)xe50, 10);
GetDlgItemText(hDlg, IDC̲ye1, (LPTSTR)ye1, 10);

GetDlgItemText(hDlg, IDC̲ye50, (LPTSTR)ye50, 10);px[4][0]= atof(xe1);

py[4][0]= atof(ye1);px[4][49]= atof(xe50);py[4][49]= atof(ye50);

InvalidateRect(hParent, NULL, TRUE);
return TRUE;
default:
return FALSE;}
break;}

48

}return FALSE;}

void CreateMyProp(HWND hWnd){
HINSTANCE hInst;PROPSHEETPAGE psp;
PROPSHEETHEADER psh;
HPROPSHEETPAGE hpsp[6];hInst = (HINSTANCE)GetWindowLong(hWnd, GWL̲HINSTANCE);

psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP̲DEFAULT;
psp.hInstance = hInst;

psp.pszTemplate = "PAGE0";
psp.pfnDlgProc = (DLGPROC)MyDlg0Proc;
hpsp[0] = CreatePropertySheetPage(&psp);

psp.pszTemplate = "PAGE1";
psp.pfnDlgProc = (DLGPROC)MyDlg1Proc;
hpsp[1] = CreatePropertySheetPage(&psp);

psp.pszTemplate = "PAGE2";
psp.pfnDlgProc = (DLGPROC)MyDlg2Proc;
hpsp[2] = CreatePropertySheetPage(&psp);

psp.pszTemplate = "PAGE3";
psp.pfnDlgProc = (DLGPROC)MyDlg3Proc;
hpsp[3] = CreatePropertySheetPage(&psp);

psp.pszTemplate = "PAGE4";
psp.pfnDlgProc = (DLGPROC)MyDlg4Proc;.

49

hpsp[4] = CreatePropertySheetPage(&psp);

psp.pszTemplate = "PAGE5";
psp.pfnDlgProc = (DLGPROC)MyDlg5Proc;
hpsp[5] = CreatePropertySheetPage(&psp);

memset(&psh, 0, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH̲NOAPPLYNOW;
psh.hInstance = hInst;
psh.hwndParent = hWnd;
psh.nPages = 6;
psh.phpage = hpsp;
psh.pszCaption = "設定";(HWND)PropertySheet(&psh);}interpolate.c#include <windows.h>#include <math.h>#include "graph.h"#include "resource.h"double ymin(double rm, double r);
double spline(double *, double *, int *, double, int);
double lagrange(double *, double *, int *, double, int);
double lsq1(double *, double *, int *, int);
double lsq2(double *, double *, int *, int);

void plot(HDC, double *, double *, int *, long, double, double, double, double, double, double,
int, int);

HPEN hPen;
HBRUSH hBrush;50

void interpolate(HDC memdc, double px[][50], double py[][50], double Xpos, double Ypos,
long ans1, long ans2, long ans3,long ans4, long ans5, long ans6, long ans7, long ans8,
long ans9, long ans10, long ans11, long ans12, long ans13, long ans14,int z){
RECT re1 = {0,0,800,600},
re2 = {0,0,794,35},
re3 = {0,35,100,556},
re4 = {741,35,794,556},
re5 = {100,516,794,556},
re6 = {101, 35, 740, 516};

int i, j, k, Xaxis, Yaxis, xpos, ypos, judge;
long h;int NUM[5];long double t, Ry, Rx, MAGx, MAGy, xaxis, yaxis, xax, yax, numx, numy;
long double x[5][1000], y[5][1000];
double M[5], a[5], b[5];double mag[] = {3, 2.5, 2, 1.5, 1, 0.75, 0.5};
double mag2[] = {0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.01};
int figure = ans7;

Rectangle(memdc, 100*z, 35*z, 741*z, 516*z);
NUM[0] = ans8;
NUM[1] = ans9;NUM[2] = ans10;
NUM[3] = ans11;
NUM[4] = ans12;

for (i = 0; i < figure; i++) {M[i] = fabs(px[i][NUM[i]‑1] ‑ px[i][0]) / (N+1);}

if (ans1 == 1) {for (i = 0; i < figure; i++) {for (t = px[i][0], k = 0; t <= px[i][NUM[i]‑1], k <= N; t += M[i], k++) {x[i][k] = t;51

y[i][k] = spline(px, py, NUM, t, i);}}judge = N;}else if (ans1 == 2) {for (i = 0; i < figure; i++) {for (t = px[i][0], k = 0; t <= px[i][NUM[i]‑1], k <= N; t += M[i], k++) {x[i][k] = t;y[i][k] = lagrange(px, py, NUM, t, i);}}judge = N;}else if (ans1 == 3) {for (i = 0; i < figure; i++) {a[i] = lsq1(px, py, NUM, i);b[i] = lsq2(px, py, NUM, i);}for (i = 0; i < figure; i++) {x[i][0] = px[i][0];y[i][0] = a[i] * x[i][0] + b[i];}for (i = 0; i < figure; i++) {x[i][1] = px[i][NUM[i]‑1];
y[i][1] = a[i] * x[i][1] + b[i];}judge = 1;}

if (ans1 == 4) {Ry = 0;for (i = 0; i < figure; i++) {for (j = 0; j < NUM[i]; j++) {52

if (Ry < fabs(py[i][j]))Ry = py[i][j];}}Rx = 0;for (i = 0; i < figure; i++) {for (j = 0; j < 2; j++) {if (Rx < fabs(px[i][j*NUM[i]‑j]))Rx = px[i][j*NUM[i]‑j];}}}else if (ans1 == 3) {Ry = 0;for (i = 0; i < figure; i++) {for (j = 0; j < NUM[i]; j++) {if (Ry < fabs(py[i][j]))Ry = py[i][j];}}Rx = 0;for (i = 0; i < figure; i++) {for (j = 0; j < 2; j++) {if (Rx < fabs(px[i][j*NUM[i]‑j]))Rx = px[i][j*NUM[i]‑j];}}}else {
Ry = 0;for (i = 0; i < figure; i++) {for (j = 0; j <= N; j++) {if (Ry < fabs(y[i][j]))Ry = y[i][j];}}53Rx = 0;for (i = 0; i < figure; i++) {for (j = 0; j < 2; j++) {if (Rx < fabs(px[i][j*NUM[i]‑j]))Rx = px[i][j*NUM[i]‑j];}}}MAGx = mag2[ans13] * mag[ans2];
MAGy = mag2[ans14] * mag[ans2];

xaxis = 320 / fabs(Rx);yaxis = 240 / fabs(Ry);xpos = (int)(‑Xpos*xaxis*MAGx + 420);
ypos = (int)(Ypos*yaxis*MAGy + 275);

Xaxis = (int)(320 / (xaxis * MAGx));
Yaxis = (int)(240 / (yaxis * MAGy));for (i = 0; i < figure; i++) {SelectObject(memdc, hBlackPen);plot(memdc, px, py, NUM, ans3, xaxis, yaxis, MAGx, MAGy, Xpos, Ypos, i, z);if ((ans4+i == 0) ￨￨ (ans4+i == 5))
hPen = hBlackPen;else if ((ans4+i == 1) ￨￨ (ans4+i == 6))
hPen = hRedPen;else if ((ans4+i == 2) ￨￨ (ans4+i == 7))
hPen = hBluePen;
else if ((ans4+i == 3) ￨￨ (ans4+i == 8))
hPen = hGreenPen;
else
hPen = hYellowPen;

SelectObject(memdc, hPen);54

if ((ans1 == 1) ￨￨ (ans1 == 2)) {for (j = 0; j < judge; j++) {MoveToEx(memdc, (int)(x[i][j]*MAGx*xaxis + xpos)*z,(int)(‑y[i][j]*MAGy*yaxis+ypos)*z, NULL);LineTo(memdc, (int)(x[i][j+1]*MAGx*xaxis + xpos)*z,(int)(‑y[i][j+1]*MAGy*yaxis+ypos)*z);}}
else if (ans1 == 3) {MoveToEx(memdc, (int)(x[i][0]*MAGx*xaxis + xpos)*z,(int)(‑y[i][0]*MAGy*yaxis+ypos)*z, NULL);LineTo(memdc, (int)(x[i][1]*MAGx*xaxis + xpos)*z,(int)(‑y[i][1]*MAGy*yaxis+ypos)*z);}

else if (ans1 == 4) {for (j = 0; j < NUM[i]‑1; j++) {MoveToEx(memdc, (int)(px[i][j]*MAGx*xaxis + xpos)*z,(int)(‑py[i][j]*MAGy*yaxis+ypos)*z, NULL);LineTo(memdc, (int)(px[i][j+1]*MAGx*xaxis + xpos)*z,(int)(‑py[i][j+1]*MAGy*yaxis+ypos)*z);}}}

hPen = hBlackPen;
SelectObject(memdc, hPen);

MoveToEx(memdc, 100*z, ypos*z, NULL);//X 軸(原点)LineTo(memdc, 741*z, ypos*z);
MoveToEx(memdc, xpos*z, 35*z, NULL);LineTo(memdc, xpos*z, 516*z);

55//Y 軸(原点)}for (h = ypos; h >= 35; h = h ‑ (int)(yax+0.5)) {MoveToEx(memdc, (int)(xpos‑1)*z, (int)(h)*z, NULL);LineTo(memdc, (int)(xpos+2)*z, (int)(h)*z);｝for (h = ypos; h <= 516; h = h + (int)(yax*sumy+0.5)) {MoveToEx(memdc, (int)(xpos‑1)*z, (int)(h)*z, NULL);LineTo(memdc, (int)(xpos+2)*z, (int)(h)*z);｝for (h = xpos; h >= 100; h = h ‑ (int)(xax+0.5)) {MoveToEx(memdc, (int)(h)*z, (int)(ypos‑1)*z, NULL);LineTo(memdc, (int)(h)*z, (int)(ypos+2)*z);}for (h = xpos; h <= 741; h = h + (int)(xax+0.5)) {MoveToEx(memdc, (int)(h)*z, (int)(ypos‑1)*z, NULL);LineTo(memdc, (int)(h)*z, (int)(ypos+2)*z);}

double ymin(double rm, double r){
if (r * rm > 240)
return (240 / (r * rm));
else
return (r*rm/240);}

plot.c#include <windows.h>

void plot(HDC memdc, double prox[][50], double proy[][50], int num[],long pro, double xax, double yax, double Mx, double My, double xpo, double ypo, int p, int z){

56

int i;if (pro != 0) {if ((pro + p == 1) ￨￨ (pro + p == 6)) {for (i = 0; i < num[p]; i++)
Ellipse(memdc,(int)(prox[p][i]*Mx*xax+417‑xpo*Mx*xax)*z,(int)(‑proy[p][i]*My*yax+272+ypo*My*yax)*z,(int)(prox[p][i]*Mx*xax+423‑xpo*Mx*xax)*z,(int)(‑proy[p][i]*My*yax+278+ypo*My*yax)*z);}
else if ((pro + p == 2) ￨￨ (pro + p == 7)) {for (i = 0; i < num[p]; i++) {MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+417‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z);
MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+417‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+423‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z);
MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+423‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z);}}

else if ((pro + p == 3) ￨￨ (pro + p == 8)) {for (i = 0; i < num[p]; i++) {MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+417‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z);
MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z, NULL);

57

LineTo(memdc, (int)(prox[p][i]*xax*Mx+423‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z);
MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+423‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+417‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z);}}

else if ((pro + p == 4) ￨￨ (pro + p == 9)) {for (i = 0; i < num[p]; i++) {MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+417‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+275+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z);
MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+423‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+275+ypo*yax*My)*z);
MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+423‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+275+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z);
MoveToEx(memdc, (int)(prox[p][i]*xax*Mx+420‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z, NULL);LineTo(memdc, (int)(prox[p][i]*xax*Mx+417‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+275+ypo*yax*My)*z);}}

else if ((pro + p == 5) ￨￨ (pro + p == 10)) {for (i = 0; i < num[p]; i++)
Rectangle(memdc,(int)(prox[p][i]*xax*Mx+417‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+272+ypo*yax*My)*z,58

(int)(prox[p][i]*xax*Mx+423‑xpo*xax*Mx)*z,(int)(‑proy[p][i]*yax*My+278+ypo*yax*My)*z);}}}

print.c#include <windows.h>#include <math.h>#include "graph.h"#include "resource.h"

HDC GetPrintInfo(void);void plot(HDC, double *, double *, int *, long, double, double, double, double, double, double,
int, int);
void interpolate(HDC, long double *, long double *, double, double, long, long,
long,long, long, long, long, long,long, long, long, long, long, long, int);
PRINTER̲INFO̲5 prninfo[3];HPEN hPen;
HBRUSH hBrush;

int MyPrint(HDC memdc){

DOCINFO docinfo;

hFont1 = CreateFont(72,0,0,0,FW̲NORMAL,0,0,0,SHIFTJIS̲CHARSET,OUT̲DEFAULT̲PRECIS,CLIP̲DEFAULT̲PRECIS,DEFAULT̲QUALITY,DEFAULT̲PITCH ￨ FF̲DONTCARE,"MS ゴシック");

hFont2 = CreateFont(72,0,900,0,FW̲NORMAL,0,0,0,SHIFTJIS̲CHARSET,OUT̲DEFAULT̲PRECIS,CLIP̲DEFAULT̲PRECIS,DEFAULT̲QUALITY,DEFAULT̲PITCH ￨ FF̲DONTCARE,"MS ゴシック");

59

memset(&docinfo, 0, sizeof(DOCINFO));docinfo.cbSize = sizeof(DOCINFO);
docinfo.lpszDocName = "testprint";

memdc = GetPrintInfo();

StartDoc(memdc, &docinfo);
StartPage(memdc);
interpolate(memdc, px, py, Xpos, Ypos, arg1, arg2, arg3, arg4, arg5,
arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, 4);hPen = hWhitePen;
SelectObject(memdc, hPen);
Rectangle(memdc, 0, 0, 3175+1000, 139);
Rectangle(memdc, 0, 140, 399, 2223+1000);
Rectangle(memdc, 400, 2064, 3175, 2223+1000);
Rectangle(memdc, 2964, 140, 3175+1000, 2063);

SelectObject(memdc, hFont1);
TextOut(memdc, width̲x*4, 530*4, X̲title, strlen(X̲title));SelectObject(memdc, hFont2);
TextOut(memdc, 70*4, width̲y*4, Y̲title, strlen(Y̲title));EndPage(memdc);
EndDoc(memdc);
SetFocus(hParent);
DeleteDC(memdc);
return 0;}

HDC GetPrintInfo(){
DWORD dwNeeded, dwReturned;
if (EnumPrinters(PRINTER̲ENUM̲DEFAULT, NULL, 5, (LPBYTE)&prninfo,
sizeof(prninfo), &dwNeeded, &dwReturned)) {return CreateDC(NULL, prninfo[0].pPrinterName, NULL, NULL);}

60

return 0;}

int PrinterSet(){
HANDLE hPrint;
GetPrintInfo();
OpenPrinter(prninfo[0].pPrinterName, &hPrint, NULL);
PrinterProperties(hParent, hPrint);
ClosePrinter(hPrint);
return 0;}

savebmp.c#include <windows.h>#include "resource.h"

BOOL SaveBitmapFile(HDC memdc,HBITMAP bmp,LPCTSTR lpFileName){HANDLE hFile;LPBYTE bits;
HDC hdc;
DWORD filesize,bitsize;
BITMAPFILEHEADER fh;
BITMAPINFO bi;
BITMAP bm;
HBITMAP tmpbmp,oldbmp;
DWORD NumOfByteWritten;
BOOL RetVal = FALSE;
int rest;

if(GetObject(bmp,sizeof(BITMAP),&bm) == 0)
goto ERRHANDLER̲L1;

61

if(bm.bmBitsPixel < 16)goto ERRHANDLER̲L1;

bitsize = bm.bmWidthBytes;

if(rest = bitsize % 4)
bitsize += 4 ‑ rest;

bitsize *= bm.bmHeight;
filesize = bitsize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

hFile = CreateFile(lpFileName,GENERIC̲WRITE,0,NULL,CREATE̲ALWAYS,FILE̲ATTRIBUTE̲ARCHIVE,NULL);

if(hFile == INVALID̲HANDLE̲VALUE)
goto ERRHANDLER̲L1;

ZeroMemory(&fh,sizeof(BITMAPFILEHEADER));fh.bfType = 0x4d42; //BM
fh.bfSize = filesize;
fh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

if(WriteFile(hFile,(LPCVOID)&fh,(DWORD)sizeof(BITMAPFILEHEADER),&NumOfByteWritten,NULL) == FALSE)
goto ERRHANDLER̲L2;

ZeroMemory(&bi,sizeof(BITMAPINFOHEADER));bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = bm.bmWidth;bi.bmiHeader.biHeight = bm.bmHeight;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = bm.bmBitsPixel;
bi.bmiHeader.biCompression = BI̲RGB;
bi.bmiHeader.biSizeImage = bitsize;if(WriteFile(hFile,(LPCVOID)&bi,(DWORD)sizeof(BITMAPINFOHEADER),

62

&NumOfByteWritten,NULL) == FALSE)
goto ERRHANDLER̲L2;

if((bits = (LPBYTE)malloc(bitsize)) == NULL)
goto ERRHANDLER̲L2;

hdc = GetDC(NULL);
if(memdc != NULL){
tmpbmp = CreateCompatibleBitmap(hdc,10,10);
oldbmp = SelectObject(memdc,tmpbmp);}

if(!GetDIBits(hdc,bmp,0,bm.bmHeight,(LPVOID)bits,&bi,DIB̲RGB̲COLORS))
goto ERRHANDLER̲L3;

if(WriteFile(hFile,(LPCVOID)bits,(DWORD)bitsize,&NumOfByteWritten,NULL) == FALSE)
goto ERRHANDLER̲L3;

RetVal = TRUE;ERRHANDLER̲L3:

free(bits);
ReleaseDC(NULL,hdc);

if(memdc != NULL)
DeleteObject(SelectObject(memdc,oldbmp));

ERRHANDLER̲L2:

CloseHandle(hFile);

ERRHANDLER̲L1:

return RetVal;}

63main.c#include <windows.h>#include <stdio.h>#include <math.h>#include <commctrl.h>#define INSTANCE#include "resource.h"#include "graph.h"#include "setup.h"

BOOL SaveBitmapFile(HDC,HBITMAP,LPCTSTR);LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK MyDlg1Proc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK MyDlg2Proc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK MyDlg3Proc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK MyDlg4Proc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK MyDlg5Proc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK MyDlg0Proc(HWND, UINT, WPARAM, LPARAM);

void CreateMemdc(HWND, HDC *, HBITMAP *, int);
void OpenFiles(HWND);
void CreateMyProp(HWND);
void interpolate(HDC, long double *, long double *, double, double, long, long,
long,long, long, long, long, long,long, long, long, long, long, long, int);
int WriteMyFile(HWND);
int MyPrint(HDC);
int PrinterSet();int OverWriteMyFile(HWND);
int MakeNewFile(HWND);
double ymin(double, double);char szWinName[] = "grph01";
char FileName[MAX̲PATH], FileTitle[64];64char File[64] = "無題";
int filename̲type;
int show = 0;

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int nWinMode){

HWND hwnd;
MSG msg;WNDCLASSEX wcl;
hInst = hThisInst;

wcl.cbSize = sizeof(WNDCLASSEX);

wcl.hInstance = hInst;
wcl.lpszClassName = szWinName;
wcl.lpfnWndProc = WinProc;
wcl.style = CS̲HREDRAW ￨ CS̲VREDRAW ￨ CS̲OWNDC;

wcl.hIcon = LoadIcon(NULL, IDI̲APPLICATION);
wcl.hIconSm = LoadIcon(NULL, IDI̲WINLOGO);
wcl.hCursor = LoadCursor(NULL, IDC̲ARROW);

wcl.lpszMenuName = "MENU";
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;

wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE̲BRUSH);

if(!RegisterClassEx(&wcl))
return (0);hwnd = CreateWindow(
szWinName,"グラフ作成ソフト",

65

WS̲MINIMIZEBOX ￨ WS̲SYSMENU ￨ WS̲OVERLAPPED,CW̲USEDEFAULT,CW̲USEDEFAULT,
800,600,
HWND̲DESKTOP,
NULL,
hThisInst,NULL);

ShowWindow(hwnd, nWinMode);UpdateWindow(hwnd);

while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);
DispatchMessage(&msg);}
return msg.wParam;}

LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP){

HDC hdc;
static HPEN hPen;
static HBRUSH hBrush;static HDC memdc;
static HBITMAP hBit;
static HFONT hFont1, hFont2;
char strTitleText[256];
static OPENFILENAME ofn;
static char GotFileName[256];

PAINTSTRUCT ps;
RECT re1 = {0,0,800,600},
re2 = {0,0,794,35},66

re3 = {0,35,100,556},
re4 = {741,35,794,556},
re5 = {100,516,794,556},
re6 = {101, 35, 740, 516};

switch (msg) {case WM̲CREATE:
InitCommonControls();
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "ビットマップファイル (*.bmp)¥0*.bmp¥0 全てのファイル¥0*.*¥0";
ofn.nFilterIndex = 1;
ofn.lpstrFile = GotFileName;
ofn.nMaxFile = 256;
ofn.Flags = OFN̲OVERWRITEPROMPT;
ofn.lpstrDefExt = "bmp";

hBrush = CreateSolidBrush(RGB(255,255,255));

CreateMemdc(hwnd, &memdc, &hBit, WHITE̲BRUSH);

hBlackPen = CreatePen(PS̲SOLID,0,RGB(0,0,0));hRedPen = CreatePen(PS̲SOLID,0,RGB(255,0,0));hBluePen = CreatePen(PS̲SOLID,0,RGB(0,0,255));
hGreenPen = CreatePen(PS̲SOLID,0,RGB(0,255,0));hYellowPen = CreatePen(PS̲SOLID,0,RGB(255,255,0));hGreyPen = CreatePen(PS̲SOLID,0,RGB(220,220,220));hWhitePen = CreatePen(PS̲SOLID,0,RGB(255,255,255));
hPen = hBlackPen;
SelectObject(memdc, hPen);hFont1 = CreateFont(18,0,0,0,FW̲NORMAL,0,0,0,SHIFTJIS̲CHARSET,OUT̲DEFAULT̲PRECIS,CLIP̲DEFAULT̲PRECIS,DEFAULT̲QUALITY,DEFAULT̲PITCH ￨ FF̲DONTCARE,"MS ゴシック");

hFont2 = CreateFont(18,0,900,0,FW̲NORMAL,0,0,0,SHIFTJIS̲CHARSET,67

OUT̲DEFAULT̲PRECIS,CLIP̲DEFAULT̲PRECIS,DEFAULT̲QUALITY,DEFAULT̲PITCH ￨ FF̲DONTCARE,"MS ゴシック");
break;

case WM̲COMMAND:
switch (LOWORD(wP)){case SAVENAMEFILE:
WriteMyFile(hwnd);
break;
case SAVEFILE:
OverWriteMyFile(hwnd);
break;
case NEWFILE:
MakeNewFile(hwnd);
break;
case FILEOPEN:
OpenFiles(hwnd);
GetPrivateProfileString(strSection1,strKey1,"false",
strData1,sizeof(strData1),FileName);

GetPrivateProfileString(strSection1,strKey18,"false",
strData18,sizeof(strData18),FileName);
GetPrivateProfileString(strSection2,strxa1,"false",
strxaData1,sizeof(strxaData1),FileName);

GetPrivateProfileString(strSection2,strxa50,"false",※
strxaData50,sizeof(strxaData50),FileName);
GetPrivateProfileString(strSection2,strya1,"false",
stryaData1,sizeof(stryaData1),FileName);

GetPrivateProfileString(strSection2,strya50,"false",
stryaData50,sizeof(stryaData50),FileName);
GetPrivateProfileString(strSection3,strxb1,"false",
strxbData1,sizeof(strxbData1),FileName);

68GetPrivateProfileString(strSection3,strxb50,"false",
Strxb50,sizeof(strxbData50),FileName);
GetPrivateProfileString(strSection4,strxc1,"false",
strxcData1,sizeof(strxcData1),FileName);

GetPrivateProfileString(strSection4,strxc50,"false",
strxcData50,sizeof(strxcData50),FileName);

GetPrivateProfileString(strSection4,stryc1,"false",
strycData1,sizeof(strycData1),FileName);

GetPrivateProfileString(strSection4,stryc50,"false",
strycData50,sizeof(strycData50),FileName);
GetPrivateProfileString(strSection5,strxd1,"false",
strxdData1,sizeof(strxdData1),FileName);

GetPrivateProfileString(strSection5,strxd50,"false",
strxdData50,sizeof(strxdData50),FileName);
GetPrivateProfileString(strSection5,stryd1,"false",※
strydData1,sizeof(strydData1),FileName);

GetPrivateProfileString(strSection5,stryd50,"false",
strydData50,sizeof(strydData50),FileName);
GetPrivateProfileString(strSection6,strxe1,"false",
strxeData1,sizeof(strxeData1),FileName);

GetPrivateProfileString(strSection6,strxe50,"false",
strxeData50,sizeof(strxeData50),FileName);

GetPrivateProfileString(strSection6,stryd1,"false",
stryeData1,sizeof(stryeData1),FileName);

GetPrivateProfileString(strSection6,strye50,"false",
stryeData50,sizeof(stryeData50),FileName);69arg1 = atol(strData1);
arg2 = atol(strData2);
arg3 = atol(strData3);
arg4 = atol(strData4);
arg5 = atol(strData9); //メモリ幅
arg6 = atol(strData10); //メモリ幅
arg7 = atol(strData11); //グラフ数
arg8 = atol(strData12); //グラフ１
arg9 = atol(strData13); //２
arg10 = atol(strData14); //３
arg11 = atol(strData15); //４
arg12 =atol(strData16); //５
arg13 = atol(strData17); //４
arg14 =atol(strData18);
wsprintf(XPOS, "%s", strData5);
wsprintf(YPOS, "%s", strData6);
wsprintf(X̲title, "%s", strData7);
wsprintf(Y̲title, "%s", strData8);

wsprintf(xa1,"%s",strxaData1);

wsprintf(ya1,"%s",stryaData1);

wsprintf(xa50,"%s",strxaData1);

wsprintf(ya50,"%s",stryaData1);

wsprintf(xb1,"%s",strxbData1);

wsprintf(yb1,"%s",strybData1);

wsprintf(xb50,"%s",strxbData1);

wsprintf(yb50,"%s",strybData1);

wsprintf(xc1,"%s",strxcData1);

wsprintf(yc1,"%s",strycData1);※

wsprintf(xc50,"%s",strxcData1);

wsprintf(yc50,"%s",strycData1);

wsprintf(xd1,"%s",strxdData1);

wsprintf(yd1,"%s",strydData1);

wsprintf(xd50,"%s",strxdData1);

wsprintf(yd50,"%s",strydData1);

wsprintf(xe1,"%s",strxeData1);

wsprintf(ye1,"%s",stryeData1);

wsprintf(xe50,"%s",strxeData1);

wsprintf(ye50,"%s",stryeData1);

break;

70

case GRAPH:
CreateMyProp(hwnd);
FillRect(memdc, &re1, hBrush);
SelectObject(memdc, hPen);
Rectangle(memdc, 100, 15, 741, 456);
MoveToEx(memdc, 420, 15, NULL);LineTo(memdc, 420, 456);
MoveToEx(memdc, 100, 235, NULL);LineTo(memdc, 741, 235);

interpolate(memdc, px, py, Xpos, Ypos, arg1, arg2, arg3, arg4, arg5,
arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, 1);

FillRect(memdc, &re2, hBrush);
FillRect(memdc, &re3, hBrush);
FillRect(memdc, &re4, hBrush);
FillRect(memdc, &re5, hBrush);
InvalidateRect(hwnd, NULL, 1);
break;

case DEL:
SelectObject(memdc, hBrush);
FillRect(memdc, &re1, hBrush);
SelectObject(memdc, hBlackPen);
Rectangle(memdc, 100, 15, 741, 456);
SelectObject(memdc, hBlackPen);
MoveToEx(memdc, 420, 15, NULL);//X 軸

LineTo(memdc, 420, 456);
MoveToEx(memdc, 100, 235, NULL);//Y 軸

LineTo(memdc, 741, 235);
InvalidateRect(hwnd, NULL, 1);
break;

case SAVEBMP:
if(GetSaveFileName(&ofn)){
if(SaveBitmapFile(memdc,hBit,GotFileName) == TRUE)

71

wsprintf(strTitleText,"Russian Paint ‑ %s",GotFileName);
else
wsprintf(strTitleText,"Russian Paint‑ ファイル書き出しに失敗しました");
SetWindowText(hwnd,strTitleText);}
break;

case PRINT:
MyPrint(memdc);
break;

case SETPRINTER:
PrinterSet();break;

case VERSION:
MessageBox(hwnd, "Version 1.00α", "バージョン情報", MB̲OK);
break;

case EXIT:
PostQuitMessage(0);break;}
break;

case WM̲PAINT:
hdc = BeginPaint(hwnd, &ps);
BitBlt(hdc,ps.rcPaint.left,ps.rcPaint.top,
ps.rcPaint.right‑ps.rcPaint.left,
ps.rcPaint.bottom‑ps.rcPaint.top,
memdc,ps.rcPaint.left,ps.rcPaint.top,SRCCOPY);
SelectObject(hdc, hFont1);
TextOut(hdc, width̲x, 530, X̲title, strlen(X̲title));SelectObject(hdc, hFont2);
TextOut(hdc, 70, width̲y, Y̲title, strlen(Y̲title));72

EndPaint(hwnd, &ps);
break;

case WM̲DESTROY:
DeleteDC(memdc);
DeleteObject(hBit);
DeleteObject(hPen);
DeleteObject((HGDIOBJ)hFont1);
DeleteObject((HGDIOBJ)hFont2);

PostQuitMessage(0);break;

default:
return (DefWindowProc(hwnd, msg, wP, lP));}
return 0L;}

void OpenFiles(HWND hWnd){
OPENFILENAME ofn;memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter ="設定ファイル(*.ini)¥0*.ini¥0All Files(*.*)¥0*.*¥0¥0";
ofn.lpstrFile = FileName;
ofn.nMaxFile = MAX̲PATH;
ofn.Flags = OFN̲FILEMUSTEXIST;
ofn.lpstrDefExt = "ini";
ofn.nMaxFileTitle = 64;
ofn.lpstrFileTitle = FileTitle;
ofn.lpstrTitle = "設定ファイルを開く";

if (GetOpenFileName(&ofn)) {73

show = 1;
InvalidateRect(hWnd, NULL, TRUE);}}

int WriteMyFile(HWND hwnd){
OPENFILENAME ofn;memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "設定ファイル(*.ini)¥0*.ini¥0All files(*.*)¥0*.*¥0¥0";
ofn.lpstrFile = FileName;
ofn.lpstrFileTitle = File;ofn.nFilterIndex = 1;
ofn.nMaxFile = sizeof(FileName);
ofn.nMaxFileTitle = sizeof(File);
ofn.Flags = OFN̲OVERWRITEPROMPT ￨ OFN̲HIDEREADONLY;
ofn.lpstrDefExt = "ini";
ofn.lpstrTitle = "名前を付けて保存する";

if(GetSaveFileName(&ofn) == 0)
return ‑1;
wsprintf(strData1, "%d", arg1);
wsprintf(strData2, "%d", arg2);
wsprintf(strData3, "%d", arg3);
wsprintf(strData4, "%d", arg4);
wsprintf(strData5, "%s", XPOS);
wsprintf(strData6, "%s", YPOS);
wsprintf(strData7, "%s", X̲title);
wsprintf(strData8, "%s", Y̲title);
wsprintf(strData9, "%d", arg5);
wsprintf(strData10, "%d", arg6);
wsprintf(strData13, "%d", arg9);74

wsprintf(strData14, "%d", arg10);
wsprintf(strData15, "%d", arg11);
wsprintf(strData16, "%d", arg12);
wsprintf(strData17, "%d", arg13);
wsprintf(strData18, "%d", arg14);

wsprintf(xa1,"%s",strxaData1);

wsprintf(ya1,"%s",stryaData1);

wsprintf(xa50,"%s",strxaData1);

wsprintf(ya50,"%s",stryaData1);

wsprintf(xb1,"%s",strxbData1);

wsprintf(yb1,"%s",strybData1);

wsprintf(xb50,"%s",strxbData1);

wsprintf(yb50,"%s",strybData1);

wsprintf(xc1,"%s",strxcData1);

wsprintf(yc1,"%s",strycData1);

wsprintf(xc50,"%s",strxcData1);

wsprintf(yc50,"%s",strycData1);

wsprintf(xd1,"%s",strxdData1);

wsprintf(yd1,"%s",strydData1);

wsprintf(xd50,"%s",strxdData1);

wsprintf(yd50,"%s",strydData1);

wsprintf(xe1,"%s",strxeData1);

wsprintf(ye1,"%s",stryeData1);

wsprintf(xe50,"%s",strxeData1);

wsprintf(ye50,"%s",stryeData1);※

WritePrivateProfileString(strSection1, strKey1, strData1, FileName);

WritePrivateProfileString(strSection1, strKey18, strData18, FileName);
WritePrivateProfileString(strSection2, strxa1, strxaData1, FileName);

WritePrivateProfileString(strSection2, strxa50, strxaData50, FileName);
WritePrivateProfileString(strSection2, strya1, stryaData1, FileName);

WritePrivateProfileString(strSection2, strya50, stryaData50, FileName);
WritePrivateProfileString(strSection3, strxb1, strxbData1, FileName);

WritePrivateProfileString(strSection3, strxb50, strxbData50, FileName);
WritePrivateProfileString(strSection3, stryb1, strybData1, FileName);75WritePrivateProfileString(strSection3, stryb50, strybData50, FileName);
WritePrivateProfileString(strSection4, strxc1, strxcData1, FileName);

WritePrivateProfileString(strSection4, strxc50, strxcData50, FileName);
WritePrivateProfileString(strSection4, stryc1, strycData1, FileName);

WritePrivateProfileString(strSection4, stryc50, strycData50, FileName);
WritePrivateProfileString(strSection5, strxd1, strxdData1, FileName);※
WritePrivateProfileString(strSection5, strxd50, strxdData50, FileName);
WritePrivateProfileString(strSection5, stryd1, strydData1, FileName);

WritePrivateProfileString(strSection5, stryd50, strydData50, FileName);
WritePrivateProfileString(strSection6, strxe1, strxeData1, FileName);

WritePrivateProfileString(strSection6, strxe50, strxeData50, FileName);
WritePrivateProfileString(strSection6, strye1, stryeData1, FileName);

WritePrivateProfileString(strSection6, strye50, stryeData50, FileName);
return 0;}

int OverWriteMyFile(HWND hWnd){
wsprintf(strData1, "%d", arg1);
wsprintf(strData2, "%d", arg2);
wsprintf(strData3, "%d", arg3);
wsprintf(strData4, "%d", arg4);
wsprintf(strData5, "%s", XPOS);
wsprintf(strData6, "%s", YPOS);
wsprintf(strData7, "%s", X̲title);
wsprintf(strData8, "%s", Y̲title);
wsprintf(strData9, "%d", arg5);
wsprintf(strData10, "%d", arg6);
wsprintf(strData13, "%d", arg9);
wsprintf(strData14, "%d", arg10);76

wsprintf(strData15, "%d", arg11);
wsprintf(strData16, "%d", arg12);
wsprintf(strData17, "%d", arg13);
wsprintf(strData18, "%d", arg14);

wsprintf(xa1,"%s",strxaData1);

wsprintf(ya1,"%s",stryaData1);

wsprintf(xa50,"%s",strxaData1);

wsprintf(ya50,"%s",stryaData1);

wsprintf(xb1,"%s",strxbData1);

wsprintf(yb1,"%s",strybData1);

wsprintf(xb50,"%s",strxbData1);

wsprintf(yb50,"%s",strybData1);

wsprintf(xc1,"%s",strxcData1);

wsprintf(yc1,"%s",strycData1);

wsprintf(xc50,"%s",strxcData1);

wsprintf(yc50,"%s",strycData1);

wsprintf(xd1,"%s",strxdData1);

wsprintf(yd1,"%s",strydData1);

wsprintf(xd50,"%s",strxdData1);

wsprintf(yd50,"%s",strydData1);

wsprintf(xe1,"%s",strxeData1);

wsprintf(ye1,"%s",stryeData1);

wsprintf(xe50,"%s",strxeData1);

wsprintf(ye50,"%s",stryeData1);

WritePrivateProfileString(strSection1, strKey1, strData1, FileName);※
WritePrivateProfileString(strSection1, strKey18, strData18, FileName);
WritePrivateProfileString(strSection2, strxa1, strxaData1, FileName);

WritePrivateProfileString(strSection2, strxa50, strxaData50, FileName);
WritePrivateProfileString(strSection2, strya1, stryaData1, FileName);

WritePrivateProfileString(strSection2, strya50, stryaData50, FileName);
WritePrivateProfileString(strSection3, strxb1, strxbData1, FileName);

WritePrivateProfileString(strSection3, strxb50, strxbData50, FileName);
WritePrivateProfileString(strSection3, stryb1, strybData1, FileName);

WritePrivateProfileString(strSection3, stryb50, strybData50, FileName);77WritePrivateProfileString(strSection4, strxc1, strxcData1, FileName);

WritePrivateProfileString(strSection4, strxc50, strxcData50, FileName);
WritePrivateProfileString(strSection4, stryc1, strycData1, FileName);

WritePrivateProfileString(strSection4, stryc50, strycData50, FileName);
WritePrivateProfileString(strSection5, strxd1, strxdData1, FileName);

WritePrivateProfileString(strSection5, strxd50, strxdData50, FileName);
WritePrivateProfileString(strSection5, stryd1, strydData1, FileName);※
WritePrivateProfileString(strSection5, stryd50, strydData50, FileName);
WritePrivateProfileString(strSection6, strxe1, strxeData1, FileName);

WritePrivateProfileString(strSection6, strxe50, strxeData50, FileName);
WritePrivateProfileString(strSection6, strye1, stryeData1, FileName);

WritePrivateProfileString(strSection6, strye50, stryeData50, FileName);
return 0;}
int MakeNewFile(HWND hWnd){
int id;id = MessageBox(hWnd,"以前のデータは消去されます。保存しますか？","注意", MB̲YESNO ￨ MB̲ICONQUESTION);
if (id == IDYES)
WriteMyFile(hWnd);arg1 = 0;
arg2 = 0;
arg3 = 0;
arg4 = 0;
arg5 = 0; //メモリ幅
arg6 = 0; //メモリ幅
arg7 = 0; //グラフ数
arg8 = 0; //グラフ１78

arg9 = 0; //２
arg10 =0;//３

arg11 =0;//４

arg12 =0; //５
arg13 =0;//４

arg14 =0; //wsprintf(XPOS, "%s", "");
wsprintf(YPOS, "%s", "");
wsprintf(X̲title, "%s", "");
wsprintf(Y̲title, "%s", "");
wsprintf(xa1,"%s","");

wsprintf(ya1,"%s","");

wsprintf(xa50,"%s","");

wsprintf(ya50,"%s","");

wsprintf(xb1,"%s","");

wsprintf(yb1,"%s","");

wsprintf(xb50,"%s","");

wsprintf(yb50,"%s","");

wsprintf(xc1,"%s", "");

wsprintf(yc1,"%s","");※

wsprintf(xc50,"%s","");

wsprintf(yc50,"%s","");

wsprintf(xd1,"%s", "");

wsprintf(yd1,"%s","");

wsprintf(xd50,"%s","");

wsprintf(yd50,"%s","");

wsprintf(xe1,"%s","");

wsprintf(ye1,"%s","");

wsprintf(xe50,"%s","");

wsprintf(ye50,"%s","");

SetDlgItemText(hWnd,IDC̲EDIT1,XPOS);
SetDlgItemText(hWnd,IDC̲EDIT2,YPOS);
SetDlgItemText(hWnd,IDC̲EDIT3,(LPCTSTR)X̲title);
SetDlgItemText(hWnd,IDC̲EDIT4,(LPCTSTR)Y̲title);
SendDlgItemMessage(hWnd,IDC̲COMBO1,CB̲SETCURSEL,(WPARAM)arg1,0L);//グラフ

SendDlgItemMessage(hWnd,IDC̲COMBO2,CB̲SETCURSEL,(WPARAM)arg2,0L);//倍率

SendDlgItemMessage(hWnd,IDC̲COMBO3,CB̲SETCURSEL,(WPARAM)arg3,0L);//点

SendDlgItemMessage(hWnd,IDC̲COMBO4,CB̲SETCURSEL,(WPARAM)arg4,0L);//色

SendDlgItemMessage(hWnd,IDC̲COMBO5,CB̲SETCURSEL,(WPARAM)arg5,0L);//X メモリ

SendDlgItemMessage(hWnd,IDC̲COMBO6,CB̲SETCURSEL,(WPARAM)arg6,0L);//Y メモリ

SendDlgItemMessage(hWnd,IDC̲COMBO7,CB̲SETCURSEL,(WPARAM)arg7,0L);//グラフ数79SendDlgItemMessage(hWnd,IDC̲COMBO8,CB̲SETCURSEL,(WPARAM)arg8,0L);//グラフ１

SendDlgItemMessage(hWnd,IDC̲COMBO9,CB̲SETCURSEL,(WPARAM)arg9,0L);//グラフ２

SendDlgItemMessage(hWnd,IDC̲COMBO10,CB̲SETCURSEL,(WPARAM)arg10,0L);//グラフ３

SendDlgItemMessage(hWnd,IDC̲COMBO11,CB̲SETCURSEL,(WPARAM)arg11,0L);//グラフ４

SendDlgItemMessage(hWnd,IDC̲COMBO12,CB̲SETCURSEL,(WPARAM)arg12,0L);//グラフ５

SendDlgItemMessage(hWnd,IDC̲COMBO13,CB̲SETCURSEL,(WPARAM)arg13,0L);
SendDlgItemMessage(hWnd,IDC̲COMBO14,CB̲SETCURSEL,(WPARAM)arg14,0L);

SetDlgItemText(hWnd, IDC̲xa1, xa1);

SetDlgItemText(hWnd, IDC̲ya1,ya1);

SetDlgItemText(hWnd, IDC̲xa50, xa50);

SetDlgItemText(hWnd, IDC̲ya50,ya50);

SetDlgItemText(hWnd, IDC̲xb1, xb1);

SetDlgItemText(hWnd, IDC̲yb1,yb1);

SetDlgItemText(hWnd, IDC̲xb50, xb50);

SetDlgItemText(hWnd, IDC̲yb50,yb50);

SetDlgItemText(hWnd, IDC̲xc1, xc1);

SetDlgItemText(hWnd, IDC̲yc1,yc1);

SetDlgItemText(hWnd, IDC̲xc50, xc50);

SetDlgItemText(hWnd, IDC̲yc50,yc50);

SetDlgItemText(hWnd, IDC̲xd1, xd1);

SetDlgItemText(hWnd, IDC̲yd1,yd1);

SetDlgItemText(hWnd, IDC̲xd50, xd50);

SetDlgItemText(hWnd, IDC̲yd50,yd50);

SetDlgItemText(hWnd, IDC̲xe1, xe1);

SetDlgItemText(hWnd, IDC̲ye1,ye1);

SetDlgItemText(hWnd, IDC̲xe50, xe50);

SetDlgItemText(hWnd, IDC̲ye50,ye50);

return 0;}80※