パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
基本的メニュー項目ハンドラの実装

KTxtEditプロジェクトに追加された基本的メニュー項目ハンドラを実装する。

プログラミング手順

  1. KTxtEditFrameプライベートメンバ変数の追加
  2. ファイル操作ハンドラの実装
  3. 編集操作ハンドラの実装
  4. リポジトリ更新とビルドテスト

KTxtEditFrameプライベートメンバ変数の追加

編集中のファイルフルパス名を保持するfileFullPath_プライベートメンバ変数をKTxtEditFrameクラスに追加する。

KTxtEditFrame.h

class KTxtEditFrame: public wxFrame
{
public:
...
private:
...
//(*Declarations(KTxtEditFrame)
wxStatusBar* statusBar_;
wxTextCtrl* textCtrl_;
//*)
wxHelpController helpController_;
wxString fileFullPath_;
DECLARE_EVENT_TABLE()
};
覚え書き
メンバ変数はデフォルト構築するとしてもコンストラクタ初期化リストに明示するのが作法だが、ここでは省略する。

ファイル操作ハンドラの実装

KTxtEditFrame.cpp

wxSmithが挿入した各ハンドラのスケルトンに処理を実装する。wxTextCtrlクラスのメンバ関数を用い、かつ編集有無によるダイアログ確認も加えている。

...
void KTxtEditFrame::OnNew(wxCommandEvent& event)
{
if (!textCtrl_->IsModified()
||wxMessageBox(_("The current file is modified. Do you want to discard?")
,MYAPPINFO_NAME,wxICON_QUESTION|wxYES_NO|wxNO_DEFAULT|wxCENTER)==wxYES)
{
textCtrl_->Clear();
}
}
void KTxtEditFrame::OnOpen(wxCommandEvent& event)
{
if (!textCtrl_->IsModified()
||wxMessageBox(_("The current file is modified. Do you want to discard?")
,MYAPPINFO_NAME,wxICON_QUESTION|wxYES_NO|wxNO_DEFAULT|wxCENTER)==wxYES)
{
wxFileDialog fileDlg{this,_("Open a file")
,wxEmptyString,wxEmptyString,wxEmptyString,wxFD_OPEN|wxFD_FILE_MUST_EXIST};
if (fileDlg.ShowModal()==wxID_OK)
{
if (textCtrl_->LoadFile(fileDlg.GetPath()))
{
fileFullPath_=fileDlg.GetPath();
}
else
{
wxMessageBox(_("Failed to open a file."),MYAPPINFO_NAME,wxICON_ERROR|wxCENTER);
}
}
}
}
void KTxtEditFrame::OnSave(wxCommandEvent& event)
{
if (fileFullPath_.IsEmpty())
{
OnSaveAs(event);
}
else
{
if (!textCtrl_->SaveFile(fileFullPath_))
{
wxMessageBox(_("Failed to save the current file."),MYAPPINFO_NAME,wxICON_ERROR|wxCENTER);
}
}
}
void KTxtEditFrame::OnSaveAs(wxCommandEvent& event)
{
wxFileDialog fileDlg{this,_("Save the current file")
,wxEmptyString,fileFullPath_,wxEmptyString,wxFD_SAVE|wxFD_OVERWRITE_PROMPT};
if (fileDlg.ShowModal()==wxID_OK)
{
if (textCtrl_->SaveFile(fileDlg.GetFilename()))
{
fileFullPath_=fileDlg.GetFilename();
}
else
{
wxMessageBox(_("Failed to save the current file."),MYAPPINFO_NAME,wxICON_ERROR|wxCENTER);
}
}
}
...

編集操作ハンドラの実装

wxTextCtrlの基底クラスの一つであるwxTextEntryのメンバ関数でやり直し操作とクリップボード操作を実装する。

KTxtEditFrame.cpp

...
void KTxtEditFrame::OnUndo(wxCommandEvent& event)
{
textCtrl_->Undo();
}
void KTxtEditFrame::OnRedo(wxCommandEvent& event)
{
textCtrl_->Redo();
}
void KTxtEditFrame::OnCut(wxCommandEvent& event)
{
textCtrl_->Cut();
}
void KTxtEditFrame::OnCopy(wxCommandEvent& event)
{
textCtrl_->Copy();
}
void KTxtEditFrame::OnPaste(wxCommandEvent& event)
{
textCtrl_->Paste();
}
...

リポジトリ更新とビルドテスト

動作確認(4)を参考にGit for Windowsリポジトリを更新する。ビルド実行して基本的エディタ機能が実装されている事を確認する。ファイル文字コードはUTF-8に固定されている。wxTextCtrlのやり直し操作(アンドゥ/リドゥ)は不完全な実装だがとりあえずそのままとする。

UMLクラス図

簡略したUMLクラス図でアプリケーションの構成を説明する。

  • KTxtEditFrameクラスにfileFullPath_メンバ変数を追加する。
  • 追加した基本的メニュー項目のハンドラを実装する。