Unicode版のCSTRのUTF-16とUTF-8ファイルの読み書きについて、まだUTF-16はゴミ(どうも最後のCRLF-0D 00 0A 00が0D
00になったり、消えたりする)、UTF-8は謎の不具合(文字化けや文字列の短縮化が、同じ形式のファイルで起ったり、起らなかったりして完全な再現化ができていない)が続いており、ソースを見直してもおかしいところが無く、何故そうなるのか未だ分かりません。
ということで、CSTRの不具合はじっくりやるとして、BCCSkeltonWplus→ECCSkeltonへの変更部分の説明を先行させましょう。
【WCEditor.cpp】-ウィンドウクラス登録にコールバック関数アドレスが不要になりました
//////////////////////////////////////////
// WCEditor.cpp
//Copyright (c) 06/30/2022 by ECCSkelton
//////////////////////////////////////////
#include "WCEditor.h"
#include "WCEditorProc.h"
////////////////
// WinMain関数
////////////////
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpCmdLine, int nCmdShow) { //WinMainがユニコードベース
//2重起動防止
if(!WCEditor.IsOnlyOne()) {
HWND hWnd = FindWindowW(L"MainWnd", L"WCEditor");
if(IsIconic(hWnd))
ShowWindow(hWnd, SW_RESTORE);
SetForegroundWindow(hWnd);
return 0L;
}
//ウィンドウ登録 - Init(ClassName, hInstance, (WndProcは不要,)"IDM_MAIN",
// (以下省略可)"IDI_ICON"-これをLPWSTRにした, IDC_ARROW, Brush)
WCEditor.Init(L"MainWnd", hInstance, L"IDM_MAIN", L"IDI_ICON");
//ウィンドウ作成と表示-Create(WindowTitle, (以下省略可)Style,
// ExStyle, hParent, hMenu, x, y, w, h)
if(!WCEditor.Create(L"WCEditor"))
return 0L;
//メッセージループに入る
return WCEditor.Loop();
}
【WCEditor.h】-一番変更点が多い
//////////////////////////////////////////
// WCEditor.h
// Copyright (c) 06/30/2022 by ECCSkelton
//////////////////////////////////////////
//ECCSkeltonのヘッダー-これに必要なヘッダーが入っている
#include "..\ECCSkelton.h" //今はこのパスに仮置き状態です
//リソースIDのヘッダー
#include "ResWCEditor.h"
/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCSDIクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CSDI
{
public: //以下はコールバック関数マクロと関連している
//2重起動防止用のMutex用ID名称
CMyWnd(WCHAR* UName) : CSDI(UName) {}
//メンバー変数
bool m_16OR8 = TRUE; //UTF-16(TRUE)かUTF-8(FALSE)か
bool m_BOM = TRUE; //BOM付きか否か
int m_POS = 0; //変換型式(UTF-16 - 0、BOM付UTF-8 - 1、BOM無UTF-8 - 2)
//メニュー項目、ダイアログコントロール関連
bool OnNew();
bool OnOpen();
bool OnSave();
bool OnSaveas();
bool OnExit();
bool OnCut();
bool OnCopy();
bool OnPaste();
bool OnUtf16();
bool OnUtf8();
bool OnUtf8n();
bool OnVersion();
//ウィンドウメッセージ関連
CMDTABLE //CMyWndクラスのOnCommand()関数宣言-これは追加です
bool OnCreate(WPARAM, LPARAM);
bool OnSize(WPARAM, LPARAM);
bool OnClose(WPARAM, LPARAM);
//ユーザー定義関数
void ChangeCheck(int);
};
////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとOnCommand関数(マクロ)の作成
////////////////////////////////////////////////////////////////////////
CMyWnd WCEditor(L"WCEditor"); //ウィンドウクラスインスタンスの生成
//CMyWndクラスのOnCommand()関数定義-メッセージテーブル(BEGIN_SDIMSG)の代わりに入れます
BEGIN_CMDTABLE(CMyWnd)
ON(IDM_NEW, OnNew())
ON(IDM_OPEN, OnOpen())
ON(IDM_SAVE, OnSave())
ON(IDM_SAVEAS, OnSaveas())
ON(IDM_EXIT, OnExit())
ON(IDM_CUT, OnCut())
ON(IDM_COPY, OnCopy())
ON(IDM_PASTE, OnPaste())
ON(IDM_UTF16, OnUtf16())
ON(IDM_UTF8, OnUtf8())
ON(IDM_UTF8N, OnUtf8n())
ON(IDM_VERSION, OnVersion())
END_CMDTABLE
//////////////////////
//UTF Types Constants
//////////////////////
const WCHAR *g_UTFTypes[3] = {L"UTF-16(BOM付)", L"UTF-8(BOM付)", L"UTF-8(BOM無)"};
///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;
////////////////////////
//EDIT BOX用コントロール
////////////////////////
CCTRL g_Edit;
////////////////////////
//コモンダイアログの作成
////////////////////////
CMNDLG g_Cmndlg;
///////////////////
//ファイル関係変数
///////////////////
CSTR g_FileName;
CSTR g_File;
///////////////////////////////////////////
// CDLGWクラスからVERSIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class VERSIONDLG : public CDLG {
public:
bool OnInit(WPARAM, LPARAM);
CMDTABLE //CMyWndクラスのOnCommand()関数宣言-ダイアログも同じです
bool OnIdok();
};
////////////////////////////////////////////////////////////////////////////
// VERSIONDLGクラスダイアログ変数の生成とそのコールバック関数(マクロ)を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
VERSIONDLG versiondlg;
//VERSIONDLGクラスのOnCommand()関数定義-メッセージテーブルがコマンドテーブルになります
BEGIN_CMDTABLE(VERSIONDLG)
ON(IDOK, OnIdok())
END_CMDTABLE
【WCEditorProc.h】-ここは更に少ないので、変更部分のみ
bool CMyWnd::OnVersion() {
//IDD_VERSIONダイアログを呼び出す-コールバック関数アドレスが不要になりました
versiondlg.DoModal(m_hWnd, L"IDD_VERSION");
return TRUE;
}
WCEditorでこの程度の変更でBCCSkeltonベースのプログラムが (完全ワイド文字対応のBCC102専用)ECCSkeltonベースに変更ができます。







