管理人のタツです。
題の通り、電卓を作っていきます。
GWは10連休を頂けたので実家に帰っているのですが、
帰ったら帰ったでやることあって、定期的な投稿ってできないんですよね。
それは置いといて。
初めに
私、こういう記事を書く場合ってだいたい作りながら記事を書いています。
なので、まだこの記事を出す段階では電卓は完成していません。
なので、どういう結果になるかは現状未定です。
今回ですが、作りたかったけど処理が難しそうって箇所はおそらく諦めると思います。
その場合は、また後日、改めて挑戦する、という形にします。
日記型ブログなので、何卒ご了承ください。
プロジェクト作成
Visual Studio 2022で作成します。
プロジェクト名は無難にCalculatorでいいでしょう。
アプリケーションの種類はダイアログベースに。

今回作成予定レイアウトは、おおざっぱに以下の通り。

表示箇所はエディットボックス、他はすべてボタンにします。
制御は置いといて、とりあえず置くだけおきます。
((((((((((っ・ω・)っ ハヤオクリ
このように配置しました。

rcファイルで、このダイアログに関する情報は
IDD_CALCULATOR_DIALOG DIALOGEX 0, 0, 290, 210
STYLE DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
FONT 9, "MS UI Gothic", 0, 0, 0x1
BEGIN
EDITTEXT IDC_EDIT_DISPLAY,40,20,200,70,ES_AUTOHSCROLL
PUSHBUTTON "√",IDC_BUTTON00_Root,40,110,50,14
PUSHBUTTON "π",IDC_BUTTON01_Pi,90,110,50,14
PUSHBUTTON "^",IDC_BUTTON02_Hat,140,110,50,14
PUSHBUTTON "!",IDC_BUTTON03_Factorial,190,110,50,14
PUSHBUTTON "AC",IDC_BUTTON10_AC,40,125,50,14
PUSHBUTTON "()",IDC_BUTTON11_BRACKET,90,125,50,14
PUSHBUTTON "÷",IDC_BUTTON13_DIVIDE,190,125,50,14
PUSHBUTTON "7",IDC_BUTTON20_7,40,140,50,14
PUSHBUTTON "8",IDC_BUTTON21_8,90,140,50,14
PUSHBUTTON "9",IDC_BUTTON22_9,140,140,50,14
PUSHBUTTON "×",IDC_BUTTON23_TIMES,190,140,50,14
PUSHBUTTON "4",IDC_BUTTON30_4,40,155,50,14
PUSHBUTTON "5",IDC_BUTTON31_5,90,155,50,14
PUSHBUTTON "6",IDC_BUTTON32_6,140,155,50,14
PUSHBUTTON "-",IDC_BUTTON33_MINUS,190,155,50,14
PUSHBUTTON "1",IDC_BUTTON40_1,40,170,50,14
PUSHBUTTON "2",IDC_BUTTON41_2,90,170,50,14
PUSHBUTTON "3",IDC_BUTTON42_3,140,170,50,14
PUSHBUTTON "+",IDC_BUTTON43_PLUS,190,185,50,14
PUSHBUTTON "0",IDC_BUTTON50_0,40,185,50,14
PUSHBUTTON ".",IDC_BUTTON51_DOT,90,185,50,14
PUSHBUTTON "=",IDC_BUTTON53_EQUAL,190,185,50,14
ENDフォントやフォントサイズはこのままです。
※「+」ボタンの配置箇所が間違っているため、
このままだと「=」ボタンとかぶってしまってます。
PUSHBUTTON “+”,IDC_BUTTON43_PLUS,190,170,50,14
に以降は修正しています。
処理追加
リソースビューに戻り、各ボタンを、クリックして呼応関数を作ります。
ヘッダーはこんな感じ。

cppファイルの方も同じく新しい関数が挿入されています。
更に、エディットボックスに関して少し制御をかけておきます。
今回エディットボックスは入力不可にしたいのでOnInitDialogで処理を加えます。
CEdit* pEditDisplay = (CEdit*)GetDlgItem(IDC_EDIT_DISPLAY);
pEditDisplay->SetReadOnly(TRUE);
これでエディットボックスは読み取り専用になります。
後、ボタンを押したときに表示させる式を格納する変数の用意もしておきます。
ヘッダーに、変数と関数を一つずつ追加します。
private:
void SetEditText(CString strText);
private:
CString m_strEditText;3か所、処理を追加します。
①コンストラクタ
→変数m_strEditTextを空白で初期化しておきます。
CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_CALCULATOR_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_strEditText = _T("");
}②DoDataExchange
→DDX_Textを入れておきます。
対応するIDと変数は以下の通り。
void CCalculatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_DISPLAY, m_strEditText);
}③新規関数
→引数の値を、m_strEditTextに追加する処理です。
/**
* @fn
* @brief 引数の値を、m_strEditTextに追加する
* @param CString strText
* @return なし
*/
void CCalculatorDlg::SetEditText(CString strText)
{
m_strEditText += strText;
SetDlgItemText(IDC_EDIT_DISPLAY, m_strEditText);
}1回、ビルドします。

レイアウトは問題ないなさそうです。
エディットボックスは入力ができません。
ボタン押下時の処理
ボタンが押下されたとき、SetEditTextを呼応するようにします。
ほとんどのボタンは、キャプションで表示されてある文字を引数にして呼応しますが、
とりあえず√、()、=、の3つだけは処理記載をいったん置いておきます。
また、ACが押されると文字列をクリアするようにします。
突然ですけど、ACって何の略か。
この際調べて知ったのですが、All Clearだったんですね。
Clearはなんとなく予想できていましたが。
処理を入れました。
void CCalculatorDlg::OnBnClickedButton00Root()
{
}
void CCalculatorDlg::OnBnClickedButton01Pi()
{
SetEditText(_T("π"));
}
void CCalculatorDlg::OnBnClickedButton02Hat()
{
SetEditText(_T("^"));
}
void CCalculatorDlg::OnBnClickedButton03Factorial()
{
SetEditText(_T("!"));
}
void CCalculatorDlg::OnBnClickedButton10Ac()
{
m_strEditText = _T("");
SetDlgItemText(IDC_EDIT_DISPLAY, m_strEditText);
}
void CCalculatorDlg::OnBnClickedButton11Bracket()
{
}
void CCalculatorDlg::OnBnClickedButton13Divide()
{
SetEditText(_T("÷"));
}
void CCalculatorDlg::OnBnClickedButton207()
{
SetEditText(_T("7"));
}
void CCalculatorDlg::OnBnClickedButton218()
{
SetEditText(_T("8"));
}
void CCalculatorDlg::OnBnClickedButton229()
{
SetEditText(_T("9"));
}
void CCalculatorDlg::OnBnClickedButton23Times()
{
SetEditText(_T("×"));
}
void CCalculatorDlg::OnBnClickedButton304()
{
SetEditText(_T("4"));
}
void CCalculatorDlg::OnBnClickedButton315()
{
SetEditText(_T("5"));
}
void CCalculatorDlg::OnBnClickedButton326()
{
SetEditText(_T("6"));
}
void CCalculatorDlg::OnBnClickedButton33Minus()
{
SetEditText(_T("-"));
}
void CCalculatorDlg::OnBnClickedButton401()
{
SetEditText(_T("1"));
}
void CCalculatorDlg::OnBnClickedButton412()
{
SetEditText(_T("2"));
}
void CCalculatorDlg::OnBnClickedButton423()
{
SetEditText(_T("3"));
}
void CCalculatorDlg::OnBnClickedButton43Plus()
{
SetEditText(_T("+"));
}
void CCalculatorDlg::OnBnClickedButton500()
{
SetEditText(_T("0"));
}
void CCalculatorDlg::OnBnClickedButton51Dot()
{
SetEditText(_T("."));
}
void CCalculatorDlg::OnBnClickedButton53Equal()
{
}3か所空白、ACだけ違う処理を入れました。
コメントとかは最後に入れておきます。
さぁ、ビルドします。

入力できました!
当然ですが、まだ計算は何もできません。
ただ式を表示しているだけです。
ACを押すと、エディットボックスの中身が消えるのも確認できました。
今回はここまで。
5月10日追記
初めにで宣言してた件ですが。
1週間仕事と両立しながら処理を考えていたのですが、
どうも技術的に不完全な箇所があるので、
実際に計算をする処理を思いつくことができませんでした。
今回、電卓作成は諦めます。
また知識や技術がつき次第、挑戦します。

コメント