⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bluettsdlg.cpp

📁 盲人输入法
💻 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 + -