Aoi #16 テキストファイル書き込みに文字コード変換を含める

これまでも、プログラムで扱うワイド文字(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の中でやっているのですっきり・・・。

f:id:BG1:20170220010310p:plain

と入力し、

f:id:BG1:20170220010408p:plain

名前を付けて保存で、

f:id:BG1:20170220010447p:plain

このようにShift_JISで保存されてる・・・。

・テキストファイル書き込みに文字コード変換を含める · bg1bgst333/Aoi@ee4018a · GitHub

Aoi #15 エディットボックスのテキストをファイルに書き込む

エディットボックスのテキストを特定のファイルに書き込もうと思う・・・。
今回は、"test1.txt"にShift_JISで書き込む・・・。

f:id:BG1:20170202103037p:plain

すべてのファイル系クラスの基底クラスは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・・・。

f:id:BG1:20170202105910p:plain

"あいうえお"を入力・・・。

f:id:BG1:20170202105937p:plain

"名前を付けて保存"を選択・・・。

f:id:BG1:20170202110132p:plain

デバッガで起動して相対パスだと、プロジェクトファイルのとこにできてしまうのだが、まあとりあえずファイルはできている・・・。

f:id:BG1:20170202110242p:plain

メモ帳で開くと、保存されてる・・・。

・エディットボックスのテキストをファイルに書き込む · bg1bgst333/Aoi@fe0f9c5 · GitHub

Aoi #14 テキスト取得処理の整理

とりあえず、エディットボックスのテキストは取得できたが、もう少し関数化をして整理してみる・・・。

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でテキストを取得・・・。
あとはメッセージボックスでテキストを表示・・・。

f:id:BG1:20170201145937p:plain

変わらないけど、中身はすっきり・・・。

・テキスト取得処理の整理 · bg1bgst333/Aoi@eab00db · GitHub

ObjeqtNote #14 エディットボックスのテキストを取得

ObjeqtNoteでもテキストを取得してみる・・・。

基本はAoiと同じだが、

ユーザコントロールでWM_APP + 1を使ってしまっているので、IDC_EDITBOX1はWM_APP + 2とする・・・。

MainWindow.cppでは、エディットボックスの方にIDC_EDITBOX1をセット・・・。

メニューから"名前を付けて保存"で、

f:id:BG1:20170201105538p:plain

このように取得できる・・・。

・エディットボックスのテキストを取得 · bg1bgst333/ObjeqtNote@1dbdffb · GitHub