📄 bluettsdlg.cpp
字号:
// BlueTTSDlg.cpp : implementation file
//
#include "stdafx.h"
#include "BlueTTS.h"
#include "BlueTTSDlg.h"
#include "DlgProxy.h"
#include "windows.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBlueTTSDlg dialog
IMPLEMENT_DYNAMIC(CBlueTTSDlg, CDialog);
CBlueTTSDlg::CBlueTTSDlg(CWnd* pParent /*=NULL*/)
: CDialog(CBlueTTSDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CBlueTTSDlg)
m_Input = _T("");
m_value1 = FALSE;
m_value2 = FALSE;
m_value3 = FALSE;
m_value4 = FALSE;
m_value5 = FALSE;
m_value6 = FALSE;
m_info=_T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pAutoProxy = NULL;
}
CBlueTTSDlg::~CBlueTTSDlg()
{
// If there is an automation proxy for this dialog, set
// its back pointer to this dialog to NULL, so it knows
// the dialog has been deleted.
if (m_pAutoProxy != NULL)
m_pAutoProxy->m_pDialog = NULL;
}
void CBlueTTSDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBlueTTSDlg)
DDX_Control(pDX, IDC_COMBO_Voice, m_Voice);
DDX_Text(pDX, IDC_EDIT_Input, m_Input);
DDX_Control(pDX, IDC_CHECK6, m_6);
DDX_Control(pDX, IDC_CHECK2, m_2);
DDX_Control(pDX, IDC_CHECK3, m_3);
DDX_Control(pDX, IDC_CHECK5, m_5);
DDX_Control(pDX, IDC_CHECK4, m_4);
DDX_Control(pDX, IDC_CHECK1, m_1);
DDX_Check(pDX, IDC_CHECK1, m_value1);
DDX_Check(pDX, IDC_CHECK4, m_value4);
DDX_Check(pDX, IDC_CHECK2, m_value2);
DDX_Check(pDX, IDC_CHECK6, m_value6);
DDX_Check(pDX, IDC_CHECK5, m_value5);
DDX_Check(pDX, IDC_CHECK3, m_value3);
DDX_Text(pDX, IDC_info, m_info);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBlueTTSDlg, CDialog)
//{{AFX_MSG_MAP(CBlueTTSDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CLOSE()
ON_WM_CTLCOLOR()
ON_EN_CHANGE(IDC_EDIT_Input, OnChangeEDITInput)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBlueTTSDlg message handlers
BOOL CBlueTTSDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
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);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
CLSIDFromProgID(L"SAPI.SpVoice", &CLSID_SpVoice);
voice.CreateDispatch(CLSID_SpVoice);
pDisp = voice.m_lpDispatch;
HRESULT hr = pDisp->QueryInterface(CLSID_SpVoice, (void**)&voice.m_lpDispatch);
if (hr == S_OK) {
pDisp->Release();
}
else {
voice.AttachDispatch(pDisp, TRUE);
}
//
m_Rate=0;
voice.SetRate(m_Rate);
m_Vol=100;
voice.SetVolume(m_Vol);
/////选择语种:
voiceList=voice.GetVoices(NULL,NULL);
int nList=0;
nList=voiceList.GetCount();
for(int i=0;i<nList;i++)
{
recoObject=voiceList.Item(i);
m_Voice.AddString(recoObject.GetDescription(NULL));
}
m_Voice.SetCurSel(1);
//
nList=m_Voice.GetCurSel();
voice.SetRefVoice(voiceList.Item(nList));
/////
UpdateData(FALSE);
//
return TRUE; // return TRUE unless you set the focus to a control
}
void CBlueTTSDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CBlueTTSDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CBlueTTSDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
// Automation servers should not exit when a user closes the UI
// if a controller still holds on to one of its objects. These
// message handlers make sure that if the proxy is still in use,
// then the UI is hidden but the dialog remains around if it
// is dismissed.
void CBlueTTSDlg::OnClose()
{
if (CanExit())
CDialog::OnClose();
}
HBRUSH CBlueTTSDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINT nCtlColor)
{
HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
pDC->SetTextColor(RGB(0,0,0));
return hbr;
}
void CBlueTTSDlg::OnOK()
{
if (CanExit())
CDialog::OnOK();
}
void CBlueTTSDlg::OnCancel()
{
if (CanExit())
CDialog::OnCancel();
}
BOOL CBlueTTSDlg::CanExit()
{
if (m_pAutoProxy != NULL)
{
ShowWindow(SW_HIDE);
return FALSE;
}
return TRUE;
}
void CBlueTTSDlg::OnChangeEDITInput()
{
}
BOOL CBlueTTSDlg::PreTranslateMessage(MSG *pMsg)
{
UpdateData(true);
if(pMsg->message == WM_KEYDOWN)
{
/////输入
switch(pMsg->wParam)
{
case 49:///1
m_1.SetCheck(TRUE);m_value1=true;break;
case 50:///2
m_2.SetCheck(TRUE);m_value2=true;break;
case 51:///3
m_3.SetCheck(TRUE);m_value3=true;break;
case 52:///4
m_4.SetCheck(TRUE);m_value4=true;break;
case 53:///5
m_5.SetCheck(TRUE);m_value5=true;break;
case 54:///6
m_6.SetCheck(TRUE);m_value6=true;break;
}
}
//////生成文字
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==55) ///7
{
int output=m_value1+m_value2*2+m_value3*4+m_value4*8+m_value5*16+m_value6*32;
m_1.SetCheck(false);m_value1=false;
m_2.SetCheck(false);m_value2=false;
m_3.SetCheck(false);m_value3=false;
m_4.SetCheck(false);m_value4=false;
m_5.SetCheck(false);m_value5=false;
m_6.SetCheck(false);m_value6=false;
CString o;
switch(output)
{
case 1: o="a";break;
case 3: o="b";break;
case 9: o="c";break;
case 25: o="d";break;
case 17: o="e";break;
case 11: o="f";break;
case 27: o="g";break;
case 19: o="h";break;
case 10: o="i";break;
case 26: o="j";break;
case 5: o="k";break;
case 7: o="l";break;
case 13: o="m";break;
case 29: o="n";break;
case 21: o="o";break;
case 15: o="p";break;
case 31: o="q";break;
case 23: o="r";break;
case 14: o="s";break;
case 30: o="t";break;
case 37: o="u";break;
case 39: o="v";break;
case 51: o="w";break;
case 45: o="x";break;
case 61: o="y";break;
case 53: o="z";break;
case 2: o=",";break;
case 6: o=";";break;
case 16: o="!";break;
case 36: o="?";break;
case 38: o="“";break;
case 52: o="”";break;
case 50: o=".";break;
}
m_Input+=o;
UpdateData(false);
GetDlgItem(IDC_info)->SetWindowText("文本编辑");
}
/////开始输入
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==83) ///s
{
GetDlgItem(IDC_CHECK1)->EnableWindow(true);
GetDlgItem(IDC_CHECK2)->EnableWindow(true);
GetDlgItem(IDC_CHECK3)->EnableWindow(true);
GetDlgItem(IDC_CHECK4)->EnableWindow(true);
GetDlgItem(IDC_CHECK5)->EnableWindow(true);
GetDlgItem(IDC_CHECK6)->EnableWindow(true);
}
/////开始朗读
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==56) ///8
{
UpdateData(TRUE);
voice.Speak(m_Input, 1);
GetDlgItem(IDC_info)->SetWindowText("开始朗读.....");
}
/////删除前一个字符
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==8) ///backspace
{
CString out="";
int length=m_Input.GetLength();
LPSTR temp=m_Input.GetBuffer(8);
m_Input.ReleaseBuffer();
for(int i=0;i<length-1;i++)
out+=temp[i];
m_Input=out;
UpdateData(false);
}
/////暂停朗读
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==57) ///9
{
voice.Pause();
GetDlgItem(IDC_info)->SetWindowText("暂停朗读");
}
/////继续朗读
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==48) ///0
{
voice.Resume();
GetDlgItem(IDC_info)->SetWindowText("开始朗读......");
}
/////文本清除
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==85) ///u
{
m_Input="";
UpdateData(false);
GetDlgItem(IDC_info)->SetWindowText("清除文本内容");
}
////帮助文件
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==72) ///h
{
GetDlgItem(IDC_CHECK1)->EnableWindow(false);
GetDlgItem(IDC_CHECK2)->EnableWindow(false);
GetDlgItem(IDC_CHECK3)->EnableWindow(false);
GetDlgItem(IDC_CHECK4)->EnableWindow(false);
GetDlgItem(IDC_CHECK5)->EnableWindow(false);
GetDlgItem(IDC_CHECK6)->EnableWindow(false);
m_Voice.SetCurSel(3);
int nList=m_Voice.GetCurSel();
voice.SetRefVoice(voiceList.Item(nList));
CFile MyFile;
if(!MyFile.Open("c:\\blindreadhelp.txt",CFile::modeRead,NULL))
{
UpdateData(TRUE);
voice.Speak("无法查看帮助文件,请确定文件存在", 0);
}
else
{
unsigned char *inBuff;
int lFileLen=MyFile.GetLength();
inBuff=new unsigned char[lFileLen];
MyFile.Read(inBuff,lFileLen);
m_Input=inBuff;
delete [] inBuff;
voice.Speak(m_Input, 1);
}
//m_Input="";
UpdateData(false);
GetDlgItem(IDC_info)->SetWindowText("帮助文档朗读");
}
////退出程序
if(pMsg->message == WM_KEYDOWN&&pMsg->wParam==27) ///ESC
{
CDialog::OnOK();
m_Voice.SetCurSel(3);
int nList=m_Voice.GetCurSel();
voice.SetRefVoice(voiceList.Item(nList));
voice.Speak("正在退出,谢谢您使用本软件", 0);
GetDlgItem(IDC_info)->SetWindowText("退出程序");
}
return CDialog::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -