次はGraphMaker.hに行きましょう。
GraphMakerは、中坊の数学程度の関数グラフを描画することを考えていますので、仕様として、
(1)一次、二次、三次(は中学でやっていなかったっけな?まっ、いいか)と円の方程式を入れましょう。
"y = ax + b"
"y = ax² + bx + c"
"y = ax³ + bx² + cx + d"
"y = +-√(ax² - b)"
(2)これらの選択は式を文字列(上付きとルート記号がありUnicodeとなる)としてコンボボックスへ入れて行いましょう。
(3)また選択された式の項のa~dの値はエディットボックスに入力してもらいますが、不要なエディットボックスはdisabledにしましょうか。
(4)更に項の値は少数以下も使えるように倍精度実数(double)にしましょう。
(5)これらの入力が終わったら、IDC_SHOWGRAPHボタンでグラフを描画し、IDOKボタンでプログラムを終了させます。
(6)グラフの描画は"PICTUREBOX"コントロール(注)のIDC_GRAPHで行いますので、IDC_GRAPHの画面クリア、前景色(グラフの色)と背景色も変更できるようにしたいですね。これは右クリックのポップアップメニューで行うことにしましょう。
注:PICTUREBOXはBCCSkelton|ECCSkeltonのCANVASクラスを利用するコントロールです。
と定めます。
では、早速BCCFormで作らなかったポップアップメニューを手書きで追加します。
私はこのような場合、過去に作ったプログラムのコードを持ってきて貼り付けるようにします。丁度BCCMakerで独立したポップアップメニューを使っていたのでそのコードを持ってきます。
【GraphMaker.rc】
//----------------------
// ポップアップメニュー
//----------------------
IDM_POPUP MENU DISCARDABLE
{
POPUP L"ポップアップ"
{
MENUITEM L"消去", IDC_CLEAR
MENUITEM SEPARATOR
MENUITEM L"背景色", IDC_BACKCOL
MENUITEM L"前景色", IDC_FRONTCOL
}
}
【ResGraphMaker.h】
//---------------------
// メニューリソース
//---------------------
#define IDC_CLEAR 200
#define IDC_BACKCOL 201
#define IDC_FRONTCOL 202
この3つのメニューアイテムをGraphMaker.hに追加してやる必要があります。
では、最終的にGraphMaker.hにどのように手を入れたかを解説します。
【GraphMaker.h】
//解説:赤字部分はすべてBCC2ECCが書き換えています。
//////////////////////////////////////////
// GraphMaker.h
// Copyright (c) 12/14/2022 by ECCSkelton
//////////////////////////////////////////
//ECCSkeltonのヘッダー-これに必要なヘッダーが入っている
#include "ECCSkelton.h"
//リソースIDのヘッダー
#include "ResGraphMaker.h"
/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCDLGクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CDLG
{
public: //以下はコールバック関数マクロと関連している
//2重起動防止用のMutex用ID名称
CMyWnd(WCHAR* UName) : CDLG(UName) {}
//メンバー変数
CPICBOX m_PicBox; //PictureBoxの作成
int m_Selection = 0; //選択された式の番号(順)
int m_GraphW = 0; //m_PicBoxクライアントエリアの幅
int m_GraphH = 0; //m_PicBoxクライアントエリアの高さ
COLORREF m_FrCol; //描画(前景)色
COLORREF m_BkCol = 0; //背景色
//解説:↑の「メンバー変数」はGraphMaker用の手書き追加部分です。その目的はコメントのとおりです。
//メニュー項目、ダイアログコントロール関連
bool OnClear();
bool OnBackCol();
bool OnFrontCol();
//解説:これらがポップアップメニューの手書き追加部分です。
bool OnCombobox(WPARAM); //解説:「式の選択」で使うコンボボックスの選択処理です
bool OnShowgraph(); //解説:グラフ描画処理です
bool OnIdok(); //解説:終了処理です
//ウィンドウメッセージ関連
CMDTABLE //OnCommand()関数宣言
bool OnInit(WPARAM, LPARAM);
bool OnNotify(WPARAM, LPARAM);
bool OnClose(WPARAM, LPARAM);
bool OnDestroy(WPARAM, LPARAM);
//ユーザー定義関数
COLORREF GetCol();
void SetCol(COLORREF);
void ClearGraph();
//解説:これらは描画処理で使うユーザー定義関数(手書き追加)です。
};
////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ)の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd GraphMaker(L"GraphMaker"); //ウィンドウクラスインスタンスの生成
BEGIN_CMDTABLE(CMyWnd) //クラス名がCMyWndではない場合、クラス名、テーブルを適宜マニュアルで修正してください
//BEGIN_MODELESSDLGMSG(ModelessProc, GraphMaker) //コールバック関数名は主ウィンドウの場合ModelessProcにしている //解説:BCCSkeltonのコードをコメントアウトしています。
//メニュー項目、ダイアログコントロール関連
ON(IDC_CLEAR, OnClear())
ON(IDC_BACKCOL, OnBackCol())
ON(IDC_FRONTCOL, OnFrontCol())
//解説:これらがポップアップメニューの手書き追加部分です。
ON(IDC_COMBOBOX, OnCombobox(wParam))
ON(IDC_SHOWGRAPH, OnShowgraph())
ON(IDOK, OnIdok())
//解説:BCCSkeltonのコードを書き換えています。
//ウィンドウメッセージ関連
//自動的にダイアログ作成時にOnInit()、終了時にOnClose()を呼びます
//ON_CLOSE(GraphMaker)
//ON_DESTROY(GraphMaker)
//END_DLGMSG
//解説:BCCSkeltonのコードをコメントアウトしています。
END_CMDTABLE
////////////////////////
//コモンダイアログの作成
////////////////////////
CMNDLG g_CmnDlg;
//解説:SkeltonWizardで「コモンダイアログ」にチェックを入れませんでしたが、あとで気が変わって色選択ダイアログを使うことにしたので手書きで追加しました。
これでGraphMakerの宣言や定義が完了しましたので、次回以降は宣言、定義された関数の実装や変数の利用を最後に残されたGraphMakerProc.hで解説してゆきます。