//////////////////////////////////////////
// TextToSpeechProc.h
// Copyright (c) 11/19/2020 by BCCSkelton
//////////////////////////////////////////

#define	MAX_LEN	65536	//DISPDLG(IDD_DISPLAY)のIDC_EDITの最大文字数

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//ウィンドウメッセージ関数
/////////////////////////////////
bool CMyWnd::OnInit(WPARAM wParam, LPARAM lParam) {

	//コモンコントロールの初期化
	InitCommonControls();

	//ツールバー登録−SetHandle(hWnd))
	TBar.SetHandle(GetDlgItem(m_hWnd, IDC_TOOLBAR));
	//ツールバーボタン用カスタムビットマップ追加
	TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 10);
	//ツールバーボタン追加
	TBBUTTON tbb[13];
	ZeroMemory(tbb, sizeof(tbb));
	tbb[0].iBitmap = TBar.m_id + 0;
	tbb[0].fsState = TBSTATE_ENABLED;
	tbb[0].fsStyle = TBSTYLE_BUTTON;
	tbb[0].idCommand = IDM_INPUT;
	tbb[1].iBitmap = TBar.m_id + 1;
	tbb[1].fsState = TBSTATE_ENABLED;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_CLIP;
	tbb[2].iBitmap = TBar.m_id + 2;
	tbb[2].fsState = TBSTATE_ENABLED;
	tbb[2].fsStyle = TBSTYLE_BUTTON;
	tbb[2].idCommand = IDM_OPEN;
	tbb[3].iBitmap = TBar.m_id + 3;
	tbb[3].fsState = TBSTATE_ENABLED;
	tbb[3].fsStyle = TBSTYLE_BUTTON;
	tbb[3].idCommand = IDM_SAVE;
	tbb[4].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[5].iBitmap = TBar.m_id + 4;
	tbb[5].fsState = TBSTATE_ENABLED;
	tbb[5].fsStyle = TBSTYLE_BUTTON;
	tbb[5].idCommand = IDM_EXIT;
	tbb[6].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[7].iBitmap = TBar.m_id + 5;
	tbb[7].fsState = TBSTATE_ENABLED;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_READ;
	tbb[8].iBitmap = TBar.m_id + 6;
	tbb[8].fsState = TBSTATE_ENABLED;
	tbb[8].fsStyle = TBSTYLE_BUTTON;
	tbb[8].idCommand = IDM_STOP;
	tbb[9].iBitmap = TBar.m_id + 7;
	tbb[9].fsState = TBSTATE_ENABLED;
	tbb[9].fsStyle = TBSTYLE_BUTTON;
	tbb[9].idCommand = IDM_CONTINUE;
	tbb[10].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[11].iBitmap = TBar.m_id + 8;
	tbb[11].fsState = TBSTATE_ENABLED;
	tbb[11].fsStyle = TBSTYLE_BUTTON;
	tbb[11].idCommand = IDM_HELP;
	tbb[12].iBitmap = TBar.m_id + 9;
	tbb[12].fsState = TBSTATE_ENABLED;
	tbb[12].fsStyle = TBSTYLE_BUTTON;
	tbb[12].idCommand = IDM_VERSION;
	TBar.AddButtons(13, tbb);

	//ステータスバー登録−SetHandle(hWnd))
	SBar.SetHandle(GetDlgItem(m_hWnd, IDC_STATUSBAR));
	//ステータスバー区画設定
	int sec[2] = {120, -1};
	SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "TextToSpeech Ver1.0");

	//音声リストボックスの設定
	HWND hLBWnd = GetDlgItem(m_hWnd, IDC_VOICE);	//リストボックスのハンドル
	Voice.GetVoices(hLBWnd);
	//リストボックス（IDC_VOICE）の水平スクロール幅を設定
	int num = SendMessage(hLBWnd, LB_GETCOUNT, 0, (LPARAM)0);
	int len, maxlen = 0;
	char buff[MAX_PATH];
	for(int i = 0; i < num; i++) {
		len = SendMessage(hLBWnd, LB_GETTEXTLEN, i, (LPARAM)0);
		if(len > maxlen) {
			maxlen = len;
			SendMessage(hLBWnd, LB_GETTEXT, i, (LPARAM)buff);
		}
	}
	//LB_SETHORIZONTALEXTENTはpixcel数で指定する必要がある（1Twip = 1/1440インチ）
	SIZE size;
	HDC hDC = GetDC(hLBWnd);	//リストボックスのDC取得
	GetTextExtentPoint(hDC, buff, maxlen, &size);
	ReleaseDC(hLBWnd, hDC);		//取得したDCの開放
	//IDC_LANGUAGEの水平スクロールバーをMAX_PATH分利用可能にする
	SendItemMsg(IDC_VOICE, LB_SETHORIZONTALEXTENT, size.cx, (LPARAM)0);

	//言語リストボックス・主要言語のみ−ただし、音声エンジンがなければ発音不可
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 0, (LPARAM)"日本語");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 1, (LPARAM)"英語(US)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 2, (LPARAM)"英語(UK)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 3, (LPARAM)"英語(カナダ)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 4, (LPARAM)"中国語(中国)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 5, (LPARAM)"中国語(台湾)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 6, (LPARAM)"中国語(香港)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 7, (LPARAM)"韓国語");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 8, (LPARAM)"フランス語(フランス)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 9, (LPARAM)"フフランス語(カナダ)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 10, (LPARAM)"ドイツ語(ドイツ)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 11, (LPARAM)"イタリア語(イタリア)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 12, (LPARAM)"スペイン語(メキシコ)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 13, (LPARAM)"ポルトガル語(ブラジル)");
	SendItemMsg(IDC_LANGUAGE, LB_INSERTSTRING, 14, (LPARAM)"オランダ語(オランダ)");
	//デフォルト音声が適合すればそれを選択する
	char* ptLang = Voice.GetLanguage(0);
	if(!lstrcmp(ptLang, "411"))			//日本語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 0, (LPARAM)0);
	else if(!lstrcmp(ptLang, "409"))	//米英語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 1, (LPARAM)0);
	else if(!lstrcmp(ptLang, "809"))	//英英語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 2, (LPARAM)0);
	else if(!lstrcmp(ptLang, "1009"))	//英語(カナダ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 3, (LPARAM)0);
	else if(!lstrcmp(ptLang, "804"))	//中国語(中国)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 4, (LPARAM)0);
	else if(!lstrcmp(ptLang, "404"))	//中国語(台湾)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 5, (LPARAM)0);
	else if(!lstrcmp(ptLang, "C04"))	//中国語(香港)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 6, (LPARAM)0);
	else if(!lstrcmp(ptLang, "412"))	//韓国語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 7, (LPARAM)0);
	else if(!lstrcmp(ptLang, "40C"))	//フランス語(フランス)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 8, (LPARAM)0);
	else if(!lstrcmp(ptLang, "C0C"))	//フランス語(カナダ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 9, (LPARAM)0);
	else if(!lstrcmp(ptLang, "407"))	//ドイツ語(ドイツ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 10, (LPARAM)0);
	else if(!lstrcmp(ptLang, "410"))	//イタリア語(イタリア)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 11, (LPARAM)0);
	else if(!lstrcmp(ptLang, "80A"))	//スペイン語(メキシコ))
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 12, (LPARAM)0);
	else if(!lstrcmp(ptLang, "416"))	//ポルトガル語(ブラジル)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 13, (LPARAM)0);
	else if(!lstrcmp(ptLang, "413"))	//オランダ語(オランダ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 14, (LPARAM)0);
	else
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, -1, (LPARAM)0);
	
	//性別グループの初期設定（女性））
	EnableWindow(GetDlgItem(m_hWnd, IDC_MALE), FALSE);
	EnableWindow(GetDlgItem(m_hWnd, IDC_FEMALE), FALSE);
	//利用可能音声に性別の該当があれば有効化する
	for(int i = 0; i < Voice.GetCount(); i++)
		if(lstrcmp(Voice.GetGender(i), "Female"))
			EnableWindow(GetDlgItem(m_hWnd, IDC_FEMALE), TRUE);
		else
			EnableWindow(GetDlgItem(m_hWnd, IDC_MALE), TRUE);
	//デフォルト音声（0）の性別を調べ、チェックを入れる
	if(!lstrcmp(Voice.GetGender(0), "Female"))
		Button_SetCheck(GetDlgItem(m_hWnd, IDC_FEMALE), BST_CHECKED);
	else
		Button_SetCheck(GetDlgItem(m_hWnd, IDC_MALE), BST_CHECKED);

	//スライダーの設定
	SendItemMsg(IDC_VOLUME, TBM_SETRANGE, TRUE, MAKELPARAM(0, 100));
	SendItemMsg(IDC_VOLUME, TBM_SETTICFREQ, 10, (LPARAM)10);
	SendItemMsg(IDC_VOLUME, TBM_SETPOS, TRUE, (LPARAM)50);
	SendItemMsg(IDC_SPEED, TBM_SETRANGE, TRUE, MAKELPARAM(-10, 10));
	SendItemMsg(IDC_SPEED, TBM_SETTICFREQ, 1, (LPARAM)0);
	SendItemMsg(IDC_SPEED, TBM_SETPOS, TRUE, (LPARAM)0);
	SendItemMsg(IDC_PITCH, TBM_SETRANGE, TRUE, MAKELPARAM(-10, 10));
	SendItemMsg(IDC_PITCH, TBM_SETTICFREQ, 1, (LPARAM)0);
	SendItemMsg(IDC_PITCH, TBM_SETPOS, TRUE, (LPARAM)0);

	//ファイルのドロップでの起動の場合
	if(g_ByFile) {
		g_SourcePath = Arg.v(1);
		OnOpen();
	}

	//ヘルプファイルの設定
	g_HelpFile = Arg.Path();
	g_HelpFile = g_HelpFile + "\\TextToSpeech.chm";

	//メニューハンドルの取得
	g_hPopup = GetSubMenu(GetMenu(m_hWnd), 1);

	//クリップボード初期化
	cBoard.SetWnd(m_hWnd);

	//コントロールのサブクラス化−ResTextToSpeech.hでIDC_SELからIDC_LANGLABEL迄13個のコントロールが定義
	for(int i = 0; i < (IDC_LANGLABEL - IDC_SEL + 1); i++) {
		g_SubClass[i].hWnd = GetDlgItem(m_hWnd, IDC_SEL + i);
		g_SubClass[i].wProc = (WNDPROC)GetWindowLongPtr(g_SubClass[i].hWnd, GWLP_WNDPROC);
		SetWindowLongPtr(g_SubClass[i].hWnd, GWLP_WNDPROC, (LONG_PTR)SubClassProc);
	}

	//ドラッグアンドドロップの受付開始
	DragAcceptFiles(m_hWnd, TRUE);

	return TRUE;
}

bool CMyWnd::OnDropFiles(WPARAM wParam) {

	char FileName[MAX_PATH];
	//ドラッグアンドドロップされたファイル名取得と処理
	DragQueryFile((HDROP)wParam, 0, FileName, MAX_PATH);
	g_SourcePath = FileName;
	g_ByFile = TRUE;
	OnOpen();
	MessageBox(m_hWnd, FileName, "ドラッグアンドドロップされたファイル", MB_OK | MB_ICONINFORMATION);
	DragFinish((HDROP)wParam);
	return TRUE;
}

bool CMyWnd::OnRButtonUp(WPARAM wParam, LPARAM lParam) {

	//ウインドウの位置情報を取得
	RECT rec;
	GetWindowRect(m_hWnd, &rec);
	//ポップアップメニューの表示場所を設定
	POINT pt;
	GetCursorPos(&pt);
	//ポップアップメニューの表示
	TrackPopupMenu(g_hPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, m_hWnd, &rec);
	return TRUE;
}

bool CMyWnd::OnNotify(WPARAM wParam, LPARAM lParam) {

	//ツールバーツールチップ
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {	//TTN_GETDISPINFOと同じ
		switch(((LPTOOLTIPTEXT)lParam)->hdr.idFrom) {
		case IDM_INPUT:
			((LPTOOLTIPTEXT)lParam)->lpszText = "スクリプトの入力";
			break;
		case IDM_CLIP:
			((LPTOOLTIPTEXT)lParam)->lpszText = "クリップボードからの入力";
			break;
		case IDM_OPEN:
			((LPTOOLTIPTEXT)lParam)->lpszText = "ファイルから入力";
			break;
		case IDM_SAVE:
			((LPTOOLTIPTEXT)lParam)->lpszText = "スクリプトファイルの保存";
			break;
		case IDM_EXIT:
			((LPTOOLTIPTEXT)lParam)->lpszText = "終了";
			break;
		case IDM_READ:
			((LPTOOLTIPTEXT)lParam)->lpszText = "テキスト読み上げ";
			break;
		case IDM_STOP:
			((LPTOOLTIPTEXT)lParam)->lpszText = "読み上げ一時停止";
			break;
		case IDM_CONTINUE:
			((LPTOOLTIPTEXT)lParam)->lpszText = "読み上げ再開";
			break;
		case IDM_HELP:
			((LPTOOLTIPTEXT)lParam)->lpszText = "使い方について";
			break;
		case IDM_VERSION:
			((LPTOOLTIPTEXT)lParam)->lpszText = "バージョン情報";
			break;
		}
		return TRUE;
	}
	return FALSE;
}

bool CMyWnd::OnSize(WPARAM wParam, LPARAM lParam) {

	TBar.AutoSize();
	SBar.AutoSize();
	return TRUE;
}

bool CMyWnd::OnHScroll(WPARAM wParam, LPARAM lParam) {

	int value;
	char str[20];
	if(LOWORD(wParam) == TB_THUMBPOSITION || LOWORD(wParam) == TB_THUMBTRACK) {
		value = HIWORD(wParam);
		if((HWND)lParam == GetDlgItem(m_hWnd, IDC_VOLUME)) {
			wsprintf(str, "音量 - %hd", value);
			SendItemMsg(IDC_VOLUMELABEL, WM_SETTEXT, 0, (LPARAM)str);
		}
		else if((HWND)lParam == GetDlgItem(m_hWnd, IDC_SPEED)) {
			wsprintf(str, "速度 - %hd", value);
			SendItemMsg(IDC_SPEEDLABEL, WM_SETTEXT, 0, (LPARAM)str);
		}
		else if((HWND)lParam == GetDlgItem(m_hWnd, IDC_PITCH)) {
			wsprintf(str, "音程 - %hd", value);
			SendItemMsg(IDC_PITCHLABEL, WM_SETTEXT, 0, (LPARAM)str);
		}
	}
	else {
		if((HWND)lParam == GetDlgItem(m_hWnd, IDC_VOLUME)) {
			value = SendItemMsg(IDC_VOLUME, TBM_GETPOS, 0, (LPARAM)0);
			wsprintf(str, "音量 - %2hd", value);
			SendItemMsg(IDC_VOLUMELABEL, WM_SETTEXT, 0, (LPARAM)str);
		}
		else if((HWND)lParam == GetDlgItem(m_hWnd, IDC_SPEED)) {
			value = SendItemMsg(IDC_SPEED, TBM_GETPOS, 0, (LPARAM)0);
			wsprintf(str, "速度 - %2hd", value);
			SendItemMsg(IDC_SPEEDLABEL, WM_SETTEXT, 0, (LPARAM)str);
		}
		else if((HWND)lParam == GetDlgItem(m_hWnd, IDC_PITCH)) {
			value = SendItemMsg(IDC_PITCH, TBM_GETPOS, 0, (LPARAM)0);
			wsprintf(str, "音程 - %2hd", value);
			SendItemMsg(IDC_PITCHLABEL, WM_SETTEXT, 0, (LPARAM)str);
		}
	}
	return TRUE;
}

bool CMyWnd::OnClose(WPARAM wParam, LPARAM lParam) {

	if(MessageBox(m_hWnd, "終了しますか", "終了確認",
					MB_YESNO | MB_ICONINFORMATION) == IDYES) {
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
		EndModal(TRUE);
		return TRUE;
	}
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

//ダイアログベースの場合はこれが必要
bool CMyWnd::OnDestroy(WPARAM wPram, LPARAM lParam) {

	PostQuitMessage(0);
	return TRUE;
}

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//メニュー項目、コントロール関数
/////////////////////////////////
bool CMyWnd::OnSelect() {

	//音声リストボックスの選択番号
	int num;
	//選択チェックボックスがチェックされた場合
	if(SendItemMsg(IDC_SEL, BM_GETCHECK, 0, 0) == BST_CHECKED) {
		num = SendItemMsg(IDC_VOICE, LB_GETCURSEL, 0, 0);
		if(num == LB_ERR) {
			MessageBox(m_hWnd, "音声が選択されていません", "エラー", MB_OK | MB_ICONERROR);
			SendItemMsg(IDC_SEL, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
			return FALSE;
		}
		else {
			EnableWindow(GetDlgItem(m_hWnd, IDC_VOICE), FALSE);
			EnableLangAndGend(FALSE);
			g_IsSelUsed = TRUE;
		}
	}
	//選択チェックボックスが外された場合
	else {
		num = 0;	//デフォルト音声オブジェクトに再設定
		EnableWindow(GetDlgItem(m_hWnd, IDC_VOICE), TRUE);
		SendItemMsg(IDC_VOICE, LB_SETCURSEL, -1, (LPARAM)0);
		EnableLangAndGend(TRUE);
		g_IsSelUsed = FALSE;
	}
	//音声オブジェクトに設定
	Voice.SetVoice(num);
	//性別も変更
	if(!lstrcmp(Voice.GetGender(num), "Female")) {
		Button_SetCheck(GetDlgItem(m_hWnd, IDC_FEMALE), BST_CHECKED);
		Button_SetCheck(GetDlgItem(m_hWnd, IDC_MALE), BST_UNCHECKED);
	}
	else {
		Button_SetCheck(GetDlgItem(m_hWnd, IDC_FEMALE), BST_UNCHECKED);
		Button_SetCheck(GetDlgItem(m_hWnd, IDC_MALE), BST_CHECKED);
	}
	//言語も変更
	char* lang = Voice.GetLanguage(num);
	if(!lstrcmp(lang, "411"))	//日本語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 0, (LPARAM)0);
	else if(!lstrcmp(lang, "409"))	//米英語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 1, (LPARAM)0);
	else if(!lstrcmp(lang, "809"))	//英英語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 2, (LPARAM)0);
	else if(!lstrcmp(lang, "1009"))	//英語(カナダ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 3, (LPARAM)0);
	else if(!lstrcmp(lang, "804"))	//中国語(中国)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 4, (LPARAM)0);
	else if(!lstrcmp(lang, "404"))	//中国語(台湾)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 5, (LPARAM)0);
	else if(!lstrcmp(lang, "C04"))	//中国語(香港)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 6, (LPARAM)0);
	else if(!lstrcmp(lang, "412"))	//韓国語
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 7, (LPARAM)0);
	else if(!lstrcmp(lang, "40C"))	//フランス語(フランス)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 8, (LPARAM)0);
	else if(!lstrcmp(lang, "C0C"))	//フランス語(カナダ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 9, (LPARAM)0);
	else if(!lstrcmp(lang, "407"))	//ドイツ語(ドイツ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 10, (LPARAM)0);
	else if(!lstrcmp(lang, "410"))	//イタリア語(イタリア)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 11, (LPARAM)0);
	else if(!lstrcmp(lang, "80A"))	//スペイン語(メキシコ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 12, (LPARAM)0);
	else if(!lstrcmp(lang, "416"))	//ポルトガル語(ブラジル)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 13, (LPARAM)0);
	else if(!lstrcmp(lang, "413"))	//オランダ語(オランダ)
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, 14, (LPARAM)0);
	else
		SendItemMsg(IDC_LANGUAGE, LB_SETCURSEL, -1, (LPARAM)0);

	return TRUE;
}

bool CMyWnd::OnInput() {

	displaydlg.DoModal(m_hWnd, "IDD_DISPLAY", displaydlgProc);
	return TRUE;
}

bool CMyWnd::OnClip() {

	char *cp = cBoard.GetText();
	if(!cp) {
		MessageBox(m_hWnd, "クリップボードに文字データはありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else {
		g_SourceFile = cp;
		SBar.SetText(1, "クリップボードから入力");
		return TRUE;
	}
}

bool CMyWnd::OnOpen() {

	if(!g_ByFile) {	//指定ファイルがない場合
		char* cp = cmndlg.GetFileName(m_hWnd, "テキストファイル(*.txt)\0*.txt\0\0", TRUE, "txt", "テキストファイルを開く");
		if(!cp) {
			MessageBox(m_hWnd, "ファイル読み込みがキャンセルされました", "Error", MB_OK | MB_ICONERROR);
			return FALSE;
		}
		else
			g_SourcePath = cp;
	}
	g_SourceFile.FromFile(g_SourcePath.ToChar());
	SBar.SetText(1, g_SourcePath.ToChar());
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_SourcePath.ToChar());	//ToolTipをつける
	SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)g_SourceFile.ToChar());
	g_ByFile = FALSE;
	return TRUE;
}

bool CMyWnd::OnSave() {

	if(!*g_SourcePath.ToChar()) {
		char* cp = cmndlg.GetFileName(m_hWnd, "テキストファイル(*.txt)\0*.txt\0\0", FALSE, "txt", "テキストファイルを保存");
		if(!cp) {
			MessageBox(m_hWnd, "ファイル書き込みがキャンセルされました", "Error", MB_OK | MB_ICONERROR);
			return FALSE;
		}
		else
			g_SourcePath = cp;
	}
	g_SourceFile.ToFile(g_SourcePath.ToChar());
	return TRUE;
}

bool CMyWnd::OnExit() {

	SendMsg(WM_CLOSE, 0, 0);
	return TRUE;
}

bool CMyWnd::OnRead() {

	//読上げ文（Script）と接尾句（Post）
	CSTR Script, Post;
	char buff[MAX_PATH];	//wsprint用バッファ
	//読み上げオプション取得
	int lang = SendItemMsg(IDC_LANGUAGE, LB_GETCURSEL, 0, 0);
   	int sex = (BST_CHECKED == SendItemMsg(IDC_MALE, BM_GETCHECK, 0, 0));
	int volume = SendItemMsg(IDC_VOLUME, TBM_GETPOS, 0, 0);
	int speed = SendItemMsg(IDC_SPEED, TBM_GETPOS, 0, 0);
	int pitch = SendItemMsg(IDC_PITCH, TBM_GETPOS, 0, 0);
	//使用言語−現在のYsamaの環境では日本語と米英語
	if(!g_IsSelUsed) {
		switch(lang) {
		case 0:
			Script = "<lang langid=\"411\">\n";	//日本語
			break;
		case 1:
			Script = "<lang langid=\"409\">\n";	//米英語
			break;
		case 2:
			Script = "<lang langid=\"809\">\n";	//英英語
			break;
		case 3:
			Script = "<lang langid=\"1009\">\n";//英語(カナダ)
			break;
		case 4:
			Script = "<lang langid=\"804\">\n";	//中国語(中国)
			break;
		case 5:
			Script = "<lang langid=\"404\">\n";	//中国語(台湾)
			break;
		case 6:
			Script = "<lang langid=\"C04\">\n";	//中国語(香港)
			break;
		case 7:
			Script = "<lang langid=\"412\">\n";	//韓国語
			break;
		case 8:
			Script = "<lang langid=\"40C\">\n";	//フランス語(フランス)
			break;
		case 9:
			Script = "<lang langid=\"C0C\">\n";	//フランス語(カナダ)
			break;
		case 10:
			Script = "<lang langid=\"407\">\n";	//ドイツ語(ドイツ)
			break;
		case 11:
			Script = "<lang langid=\"410\">\n";	//イタリア語(イタリア)
			break;
		case 12:
			Script = "<lang langid=\"80A\">\n";	//スペイン語(メキシコ)
			break;
		case 13:
			Script = "<lang langid=\"416\">\n";	//ポルトガル語(ブラジル)
			break;
		case 14:
			Script = "<lang langid=\"413\">\n";	//オランダ語(オランダ)
			break;
		default:
			//その他の言語は言語指定なし
			break;
		}
		//性別
		if(sex)
			Script = Script + "<voice required=\"Gender=Male\">\n";
		else
			Script = Script + "<voice required=\"Gender=Female\">\n";
	}
	//音量
	wsprintf(buff, "<volume level=\"%d\">\n", volume);
	Script = Script + buff;
	//速度
	wsprintf(buff, "<rate speed=\"%d\">\n", speed);
	Script = Script + buff;
	//音程
	wsprintf(buff, "<pitch absmiddle=\"%d\">\n", pitch);
	Script = Script + buff;
	//本文
	Script = Script + g_SourceFile;
	//接尾句
	if(g_IsSelUsed)
		Post = "\n</pitch>\n</rate>\n</volume>";
	else
		Post = "\n</pitch>\n</rate>\n</volume>\n</voice>\n</lang>";
	Script = Script + Post;
	//読上げ
	Voice.Speak(Script.ToChar());	//Option該当エンジンがなく読み上げられなくてもSUCCEEDED()となる
	return TRUE;
}

bool CMyWnd::OnStop() {

	HMENU hMenu = GetMenu(TextToSpeech.GetHandle());	//メニューハンドルの取得
	//メニューバー
	EnableMenuItem(GetSubMenu(hMenu, 1), 0, MF_BYPOSITION | MF_GRAYED);
	//ツールバー(MAKELONGマクロは16bit整数2つをunsigned 32bit整数にする)
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_READ, MAKELONG(FALSE, 0));
	Voice.Pause();
	return TRUE;
}

bool CMyWnd::OnContinue() {

	HMENU hMenu = GetMenu(TextToSpeech.GetHandle());	//メニューハンドルの取得
	//メニューバー
	EnableMenuItem(GetSubMenu(hMenu, 1), 0, MF_BYPOSITION | MF_ENABLED);
	//ツールバー(MAKELONGマクロは16bit整数2つをunsigned 32bit整数にする)
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_READ, MAKELONG(TRUE, 0));
	Voice.Resume();
	return TRUE;
}

bool CMyWnd::OnHelp() {

	CSTR cmd = "hh \"";
	cmd = cmd + g_HelpFile + "\"";
	WinExec(cmd.ToChar(), SW_SHOWNORMAL);
	return TRUE;
}

bool CMyWnd::OnVersion() {

	versiondlg.DoModal(m_hWnd, "IDD_VERSION", versiondlgProc);
	return TRUE;
}

///////////////////////////////
//ユーザー定義関数
//言語、性別を無効、有効にする
///////////////////////////////
void CMyWnd::EnableLangAndGend(bool state) {

	EnableWindow(GetDlgItem(m_hWnd, IDC_LANGUAGE), state);
	EnableWindow(GetDlgItem(m_hWnd, IDC_MALE), state);
	EnableWindow(GetDlgItem(m_hWnd, IDC_FEMALE), state);
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool DISPLAYDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//IDC_EDITの最大文字数（TextToSpeech.h参照）
	SendItemMsg(IDC_EDIT, EM_SETLIMITTEXT, (WPARAM)MAX_LEN, (LPARAM)0);
	//IDC_EDITへg_SourceFileを読み込む
	SendItemMsg(IDC_EDIT, WM_SETTEXT,(WPARAM)0, (LPARAM)g_SourceFile.ToChar());
	return TRUE;
}

bool DISPLAYDLG::OnSize(WPARAM wParam, LPARAM lParam) {

	RECT rect;
	GetWindowRect(GetDlgItem(m_hWnd, IDC_EDIT), &rect);
	POINT pt = {rect.left, rect.top};
	ScreenToClient(m_hWnd, &pt);
	GetWindowRect(GetDlgItem(m_hWnd, IDOK), &rect);
	MoveWindow(GetDlgItem(m_hWnd, IDC_EDIT), pt.x, pt.y, LOWORD(lParam) - pt.x * 2, HIWORD(lParam) - (rect.bottom - rect.top) * 2, TRUE);
	MoveWindow(GetDlgItem(m_hWnd, IDOK), (LOWORD(lParam) - (rect.right - rect.left)) / 2,
		HIWORD(lParam) - (rect.bottom - rect.top) - (rect.bottom - rect.top) / 3,
		rect.right - rect.left, rect.bottom - rect.top, TRUE);
	return TRUE;
}

bool DISPLAYDLG::OnIdok() {

	//エディットコントロールの文字列長を取得
	int len = SendItemMsg(IDC_EDIT, WM_GETTEXTLENGTH, 0, (LPARAM)0);
	//IDC_EDITからg_SourceFileへ書き込む
	char *pt = new char[len + 1];
	SendItemMsg(IDC_EDIT, WM_GETTEXT, (WPARAM)len + 1, (LPARAM)pt);
	g_SourceFile = pt;
	delete [] pt;
	EndModal(TRUE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool VERSIONDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	SendItemMsg(IDC_VERTXT, WM_SETTEXT,
				0, (LPARAM)"TextToSpeech Ver 1.0\r\nCopyright (c) 2020\r\nby ysama");
	return TRUE;
}

bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}
