ObjeqtNoteにもCTextFileを導入し、CMainMenuBarの処理も変更する・・・。
名前を付けて保存で、
保存される・・・。
・テキストファイル書き込みに文字コード変換を含める · bg1bgst333/ObjeqtNote@ac93145 · GitHub
ObjeqtNoteにもCTextFileを導入し、CMainMenuBarの処理も変更する・・・。
名前を付けて保存で、
保存される・・・。
・テキストファイル書き込みに文字コード変換を含める · bg1bgst333/ObjeqtNote@ac93145 · GitHub
これまでも、プログラムで扱うワイド文字(UNICODE)から書き込むときのマルチバイト文字(Shift_JIS)に文字コード変換していたが、CMainMenuBar::OnFileSaveAsの中で煩雑に文字コード変換を行っていたので、今度はCTextFileクラスで文字コード変換も含めてファイル書き込みをする・・・。
TextFile.hは、
列挙型EncodeTypeを定義・・・。
m_eEncodeTypeはこの列挙型の変数・・・。
とりあえずは、SHIFT_JISとUTF_16LEのどちらかに・・・。
TextFile.cppは、
EncodeType::SHIFT_JISの場合、WideCharToMultiByteで文字コード変換して、CBinaryFile::Writeで書き込む・・・。
今回はこれだけ・・・。
MainMenuBar.cppは、
CTextFileでファイル書き込みを行う・・・。
文字コード変換をCTextFileの中でやっているのですっきり・・・。
と入力し、
名前を付けて保存で、
このようにShift_JISで保存されてる・・・。
ObjeqtNoteでもテキストに書き込めるようにした・・・。
で、
で、
生成されたので、開くと、
書き込まれている・・・。
・エディットボックスのテキストをファイルに書き込む · bg1bgst333/ObjeqtNote@65157f8 · GitHub
エディットボックスのテキストを特定のファイルに書き込もうと思う・・・。
今回は、"test1.txt"にShift_JISで書き込む・・・。
すべてのファイル系クラスの基底クラスはCBinaryFileとするので、BinaryFile.hを追加・・・。
(すべてのファイルはバイナリファイルだし・・・。)
メンバ変数は、ファイル名配列m_tszFileName、ファイルハンドルm_hFile、バイナリデータ列へのポインタm_pByte・・・。
メンバ関数は、コンストラクタ、デストラクタ、Open、Close、Write・・・。
コンストラクタでNULL埋めたり、配列はZeroMemoryで埋めたり・・・。
デストラクタは解放処理(あ、配列もZeroMemoryするの忘れてた・・・。)
Openには、ファイル名lpctszFileName、アクセス方法dwDesiredAccess、ファイル作成についてのフラグdwCreationDispositionを指定・・・。
ファイル名はメンバm_tszFileNameにセット・・・。あとは、WindowsAPIのCreateFileを呼ぶ・・・。
Closeは引数なしで、WindowsAPIのCloseHandleを呼ぶ・・・。
Writeは書き込むバイナリデータ列と書き込むバイト数を指定・・・。
バイナリデータ列はバッファを外部に持っている場合に指定するもので、CBinaryFileにあるバッファを使う場合は別のメソッドを作るかも・・・。
WindowsAPIのWriteFileは書き込めたバイト数を格納する変数がいるので、とりあえずはローカル変数のdwBytesに入れてるが、あとで変更するかも・・・。
で、MainMenuBar.cppは、
pMainWindow->m_pEditBox->m_ptszTextはTCHARだが、CBinaryFileはバイト列で書き込むので変換しないといけない・・・。
特にShift-JISで書き込むので、文字コード変換が必要・・・。
WideCharToMultiByteの1回目は、変換先のバッファのサイズを計算するだけ・・・。
得られたサイズからchar型バッファpBufを確保・・・。
WideCharToMultiByteの2回目で、pBufに変換後の文字列が入る・・・。
そしたら、CBinaryFileオブジェクトを生成して、"test1.txt"をOpen・・・。
書き込みなのでGENERIC_WRITE、ファイルが無かったら作るのでOPEN_ALWAYS・・・。
WriteでpBufを書き込む・・・。
NULL文字の分は書かなくていいので、iMultiByteLen - 1・・・。
Closeで閉じる・・・。
そのあと、pBufとpBinaryFileをdelete・・・。
"あいうえお"を入力・・・。
"名前を付けて保存"を選択・・・。
デバッガで起動して相対パスだと、プロジェクトファイルのとこにできてしまうのだが、まあとりあえずファイルはできている・・・。
メモ帳で開くと、保存されてる・・・。
とりあえず、エディットボックスのテキストは取得できたが、もう少し関数化をして整理してみる・・・。
Window.hで、
GetWindowTextLengthとGetWindowTextを追加・・・。
中では、WindowsAPIのGetWindowTextLengthとGetWindowTextを呼んでる・・・。
EditBox.hでは、
エディットボックスのテキストバッファへのポインタm_ptszText、長さm_iLen・・・。
デストラクタ、CreateTextBufferとDestroyTextBuffer、GetWindowTextLengthとGetWindowText・・・。
EditBox.cppでは、
バッファのnewとdelete・・・。
GetWindowTextLengthは、中でCWindowのGetWindowTextLengthを呼んで、長さを取得・・・。
GetWindowTextで、これまでのGetWindowTextLength、CreateTextBuffer、CWindow::GetWindowTextでテキストを取得し、取得できたテキストの長さを返す・・・。
デストラクタは、DestroyTextBufferでバッファの破棄・・・。
MainMenuBar.cppは、
CWindow::m_mapWindowMapから、CMainWindowオブジェクトを取り出す・・・。
この時、dynamic_castでキャストしている・・・。
エディットボックスがあるなら、pMainWindow->m_pEditBox->GetWindowTextでテキストを取得・・・。
あとはメッセージボックスでテキストを表示・・・。
変わらないけど、中身はすっきり・・・。