// TTSpeechDlg.cpp : 实现文件 // #include "stdafx.h" #include "TTSpeech.h" #include "TTSpeechDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CTTSpeechDlg 对话框 CTTSpeechDlg::CTTSpeechDlg(CWnd* pParent /*=NULL*/) : CDialog(CTTSpeechDlg::IDD, pParent) { m_nVoices = 0; m_pSTVoices = NULL; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTTSpeechDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, m_combobox); DDX_Control(pDX, IDC_SLIDER1, m_VoicesRate); DDX_Control(pDX, IDC_SLIDER2, m_VoicesVolume); } BEGIN_MESSAGE_MAP(CTTSpeechDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(Btn_InitVoices, OnBnClickedInitvoices) ON_BN_CLICKED(Btn_ExitVoices, OnBnClickedExitvoices) ON_BN_CLICKED(Btn_CreateWav, OnBnClickedCreatewav) ON_BN_CLICKED(Btn_PlayWav, OnBnClickedPlaywav) ON_BN_CLICKED(IDOK, OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel) ON_BN_CLICKED(Btn_Play, OnBnClickedPlay) ON_CBN_SELCHANGE(IDC_COMBO1, OnCbnSelchangeCombo1) // ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, OnNMCustomdrawSlider1) // ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER2, OnNMCustomdrawSlider2) ON_WM_HSCROLL() ON_EN_CHANGE(IDC_EDIT1, &CTTSpeechDlg::OnEnChangeEdit1) END_MESSAGE_MAP() // CTTSpeechDlg 消息处理程序 BOOL CTTSpeechDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将\“关于...\”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 m_VoicesRate.SetRange(-10, 10, TRUE); //设置滑动条范围 m_VoicesRate.SetPos(0); //设置滑动条位置 m_VoicesVolume.SetRange(0, 100, TRUE); //设置滑动条范围 m_VoicesVolume.SetPos(100); //设置滑动条位置 SetDlgItemInt(IDC_EDIT1, -1); SetDlgItemText(Et_VoiceText, _T("您已经选择 Microsoft Lili - Chinese (China) 作为计算机的默认语音。*,#,%,$")); #if 0 // 先CoInitialize,初始化COM CoInitialize(NULL); HRESULT hr = SpInitTokenComboBox(m_combobox.m_hWnd, SPCAT_VOICES); // 使用完SpInitTokenComboBox后,要使用SpDestroyTokenComboBox; #endif // TODO: 在此添加额外的初始化代码 return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } void CTTSpeechDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CTTSpeechDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSOR CTTSpeechDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } // 初始化按钮; void CTTSpeechDlg::OnBnClickedInitvoices() { // TODO: 在此添加控件通知处理程序代码 if (!LoadText2Speeck() || g_pOpenSapi == NULL) { AfxMessageBox(_T("未初始化成功")); return; } BOOL bInit = g_pOpenSapi(); if (bInit) { TCHAR pszDes[1024] = {0}; m_nVoices = g_pGetVoiceCount(); m_pSTVoices = new STVoices[m_nVoices]; for (int i = 0; i < m_nVoices; i++) { m_pSTVoices[i].uVoiceIndex = i; g_pGetVoiceName(pszDes,1024, i); _stprintf_s(m_pSTVoices[i].szDescription, _T("%s"), pszDes); m_combobox.AddString(m_pSTVoices[i].szDescription); } m_combobox.SetCurSel(0); CString strShow; strShow.Format(_T("您已经选择 %s 作为计算机的默认语音。按*确认,按#退出,按%%暂停,按@继续,按&播放!"), m_pSTVoices[0].szDescription); SetDlgItemText(Et_VoiceText, strShow); SetDlgItemText(Tx_Index, _T("当前编号:0")); SetDlgItemText(Tx_States, _T("初始化语音库成功!")); SetDlgItemText(Tx_Rate, _T("0")); SetDlgItemText(Tx_Volume, _T("100")); } else { SetDlgItemText(Tx_States, _T("初始化语音库失败!")); } } // 释放按钮; void CTTSpeechDlg::OnBnClickedExitvoices() { FreeTex2Speeck(); SetDlgItemText(Tx_States, _T("语音库已释放!")); } // 试听按钮; void CTTSpeechDlg::OnBnClickedPlay() { if (g_pSpeak == NULL) { SetDlgItemText(Tx_States, _T("语音库未初始化,不能试听!")); return; } CString str; GetDlgItemText(Et_VoiceText, str); TCHAR szText[1024] = { 0 }; _stprintf_s(szText, _T("%s"), str); g_pSpeak(szText); } /* CString s; WCHAR w[128]; wcsncpy(w, T2W(s), NUMELMS(w)-1); */ // 生成WAV按钮; void CTTSpeechDlg::OnBnClickedCreatewav() { // TODO: 在此添加控件通知处理程序代码 if (g_pText2Speeck == NULL) { SetDlgItemText(Tx_States, _T("语音库未初始化,不能生成WAV!")); return; } UpdateData(FALSE); CString strText; GetDlgItemText(Et_VoiceText, strText); DeleteFile(_T("TTSTest.wav")); g_pText2Speeck(strText, _T("TTSTest.wav")); } // 播放WAV按钮; void CTTSpeechDlg::OnBnClickedPlaywav() { if (g_pPlay == NULL) { SetDlgItemText(Tx_States, _T("语音库未初始化,不能播放WAV!")); return; } g_pPlay(_T("TTSTest.wav")); } void CTTSpeechDlg::OnCbnSelchangeCombo1() { UpdateData(FALSE); CString str; GetDlgItemText(IDC_COMBO1, str); int nIndex = -1; for (int i = 0; i < m_nVoices; i++) { if (str.Compare(m_pSTVoices[i].szDescription) == 0) { nIndex = i; } } if (g_pSetSpeeck) { INT nVoiceIndex = m_combobox.GetCurSel(); INT nSpeeckVolume = m_VoicesVolume.GetPos(); INT nSpeeckRate = m_VoicesRate.GetPos(); INT nSpStreamFormat = GetDlgItemInt(IDC_EDIT1); g_pSetSpeeck(nVoiceIndex, nSpeeckRate, nSpeeckVolume, nSpStreamFormat); } CString strShow; strShow.Format(_T("您已经选择 %s 作为计算机的默认语音。按*确认,按#退出,按%%暂停,按@继续,按&播放!"), m_pSTVoices[nIndex].szDescription); SetDlgItemText(Et_VoiceText, strShow); str.Format(_T("当前语音系统编号: %d"), nIndex); SetDlgItemText(Tx_Index, str); } // 确定按钮; void CTTSpeechDlg::OnBnClickedOk() { FreeTex2Speeck(); if (m_pSTVoices) { delete[]m_pSTVoices; m_pSTVoices = NULL; } OnOK(); } void CTTSpeechDlg::OnBnClickedCancel() { FreeTex2Speeck(); if (m_pSTVoices) { delete[]m_pSTVoices; m_pSTVoices = NULL; } OnCancel(); } void CTTSpeechDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CSliderCtrl *slider = (CSliderCtrl*)pScrollBar; int nPost = slider->GetPos(); CString sValue = _T(""); INT nVoiceIndex = m_combobox.GetCurSel(); INT nSpeeckVolume = m_VoicesVolume.GetPos(); INT nSpeeckRate = m_VoicesRate.GetPos(); INT nSpStreamFormat = GetDlgItemInt(IDC_EDIT1); if (g_pSetSpeeck) g_pSetSpeeck(nVoiceIndex, nSpeeckRate, nSpeeckVolume, nSpStreamFormat); CWnd::OnHScroll(nSBCode, nPos, pScrollBar); CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } void CTTSpeechDlg::OnEnChangeEdit1() { // TODO: 如果该控件是 RICHEDIT 控件,它将不 // 发送此通知,除非重写 CDialog::OnInitDialog() // 函数并调用 CRichEditCtrl().SetEventMask(), // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 if (g_pSetSpeeck) { INT nVoiceIndex = m_combobox.GetCurSel(); INT nSpeeckVolume = m_VoicesVolume.GetPos(); INT nSpeeckRate = m_VoicesRate.GetPos(); INT nSpStreamFormat = GetDlgItemInt(IDC_EDIT1); g_pSetSpeeck(nVoiceIndex, nSpeeckRate, nSpeeckVolume, nSpStreamFormat); } // TODO: 在此添加控件通知处理程序代码 }