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

📄 poemdlg.cpp

📁 你用过<<中华诗词6000>>吗?那个是VF编写的,而我是用VC++编烈写的!搜索速度明显比作者原版更快了,还包含了重要的诗词数据库,代码注释详尽.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	Author->GetValueString(nd, 2);//取得作者年代
	
	delete Author;

	if (m_flg == "Z")
	{
		m_flg = "0";
		m_czp = "";
		m_czz = "";
		return;
	}
	else if (m_flg == "A")
	{
		int i = m_nd.FindStringExact(0, nd);
		if (i != -1)
		{
			m_nd.SetCurSel(i);
			SetZZ();
			SetZP();
			m_flg = "0";
			m_czp = "";
			m_czz = "";
		}
	}
}

void CPOEMDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	delete m_con;
	delete m_Poem;
	CDialog::OnClose();
}

void CPOEMDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	m_flg = "A";
	CAdoRecordSet record;
	record  = m_Poem->m_pRecordset->Clone(adLockReadOnly);
	record.m_pRecordset->Bookmark = m_Poem->m_pRecordset->Bookmark;
	if (!record.IsEOF())
	{
		record.MoveNext();
	}

	if (!record.IsEOF())
	{
		m_Poem->MoveNext();
		SetPoem();
	}
}

void CPOEMDlg::MoveToZP(CString str)
{
	long i;
	CString tem;
	CAdoRecordSet record;

	record = m_Poem->m_pRecordset->Clone(adLockUnspecified);
	tem = "Title ='" + str + "'";
	record.m_pRecordset->Filter = _variant_t(LPCTSTR(tem));

	m_Poem->m_pRecordset->Bookmark = record.m_pRecordset->Bookmark;
	i = m_Poem->m_pRecordset->GetAbsolutePosition();
}

void CPOEMDlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	m_flg = "A";
	CAdoRecordSet record;
	record = m_Poem->m_pRecordset->Clone(adLockReadOnly);
	record.m_pRecordset->Bookmark = m_Poem->m_pRecordset->Bookmark;
	
	if (!record.IsBOF())
	{
		record.MovePrevious();
	}

	if (!record.IsBOF())
	{
		m_Poem->MovePrevious();
		SetPoem();
	}
}

void CPOEMDlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	m_flg = "A";
	m_Poem->MoveFirst();
	SetPoem();
	
}

void CPOEMDlg::OnBnClickedButton8()
{
	// TODO: 在此添加控件通知处理程序代码
	m_flg = "A";
	m_Poem->MoveLast();
	SetPoem();
}

void CPOEMDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	PostMessage(WM_QUIT);
}

void CPOEMDlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码
	ShowWindow(SW_MINIMIZE);
}

BOOL CPOEMDlg::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	
		CRect rc;
		CBitmap BitAll, BitFelt;
	
		GetWindowRect(&rc);
		ScreenToClient(&rc);

		BitAll.CreateCompatibleBitmap(pDC, rc.Width() , rc.Height());
		
		CDC* Mem = new CDC;
		Mem->CreateCompatibleDC(pDC);
		Mem->SelectObject(BitAll);

		BitFelt.LoadBitmap(IDB_BK);
		CBrush br(&BitFelt);
		Mem->SelectObject(br);
		Mem->FillRect(&rc, &br);	
		
	CBitmap bit, biti;
	BITMAP sbit;
	CDC mdc;
	
	bit.LoadBitmap(IDB_CAP);
	bit.GetBitmap(&sbit);
	
	mdc.CreateCompatibleDC(pDC);
	mdc.SelectObject(&bit);
	
	CRect rect;
	GetWindowRect(&rect);
	rect.bottom = rect.top + sbit.bmHeight;
	int cx = rect.right - rect.left;
	int cy = rect.bottom - rect.top;
	Mem->StretchBlt(0, 0, 
					cx, cy, &mdc,
					0, 0,
					sbit.bmWidth, sbit.bmHeight,
					SRCCOPY);
	CFont ft;
	ft.CreateFont(16,12,0,0,400,0,0,0,0,0,0,0,0,"宋体");
	Mem->SelectObject(ft);
	Mem->SetBkMode(0);
	Mem->SetTextColor(0x0000ff);
	Mem->TextOut(10, 3, "中华诗词-——郭肇禄开发");
	pDC->BitBlt(0, 0, rc.Width() , rc.Height(), Mem, 0, 0, SRCCOPY);
	Mem->DeleteDC();
	
	delete Mem;
	return	1;
}

BOOL CPOEMDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	
	if(pMsg->message == WM_KEYDOWN)
    {
        switch(pMsg->wParam)
        {
        case VK_ESCAPE://屏蔽Esc
            return TRUE;
        }
    }

	return CDialog::PreTranslateMessage(pMsg);
}

void CPOEMDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rect;
	GetWindowRect(&rect);
	ScreenToClient(&rect);

	CBitmap bit;
	BITMAP sbit;
	
	bit.LoadBitmap(IDB_CAP);
	bit.GetBitmap(&sbit);
	rect.bottom = rect.top + sbit.bmHeight;

	if (rect.PtInRect(point))
	{
		SendMessage( WM_SYSCOMMAND, SC_MOVE | HTCLIENT, 0 );

	}

	CDialog::OnMouseMove(nFlags, point);
}

void CPOEMDlg::OnEnSelchangeRichedit25(NMHDR *pNMHDR, LRESULT *pResult)
{
	SELCHANGE *pSelChange = reinterpret_cast<SELCHANGE *>(pNMHDR);
	// TODO:  控件将不发送该通知,除非您重写
	// CDialog::OnInitDialog() 函数以发送 EM_SETEVENTMASK 消息
	// 到具有 ENM_SELCHANGE 标志“或”运算到 lParam 掩码中的控件。

	// TODO:  在此添加控件通知处理程序代码
	long start, end;
	CString   str;
	
	m_xz.SendMessage(EM_SETEVENTMASK, 0, ~ENM_SELCHANGE);
	m_xz.GetSel(start, end);

	m_xz.SetSel(start, start + 1);
	str = m_xz.GetSelText();
	
	if (start != m_xzs)
	{
		SpeakCh(str);
		m_xzs = start;
	}
	
	m_xz.SetSel(start, end);
	str = GetYin(str);
	str = GetPY(str);
	
	m_zx.SetWindowText(str);
	UpdateData(0);
	m_xz.SendMessage(EM_SETEVENTMASK, 0, ENM_SELCHANGE);
	*pResult = 0;
}

void CPOEMDlg::OnEnSelchangeRichedit26(NMHDR *pNMHDR, LRESULT *pResult)
{
	SELCHANGE *pSelChange = reinterpret_cast<SELCHANGE *>(pNMHDR);
	// TODO:  控件将不发送该通知,除非您重写
	// CDialog::OnInitDialog() 函数以发送 EM_SETEVENTMASK 消息
	// 到具有 ENM_SELCHANGE 标志“或”运算到 lParam 掩码中的控件。

	// TODO:  在此添加控件通知处理程序代码
	long start, end;
	CString   str;
	m_gs.SendMessage(EM_SETEVENTMASK, 0, ~ENM_SELCHANGE);
	m_gs.GetSel(start, end);

	m_gs.SetSel(start, start + 1);
	str = m_gs.GetSelText();

	if (start != m_gss)
	{
		SpeakCh(str);
		m_gss = start;
	}

	m_gs.SetSel(start, end);
	str = GetYin(str);
	str = GetPY(str);

	m_zx.SetWindowText(str);
	UpdateData(0);
	m_gs.SendMessage(EM_SETEVENTMASK, 0, ENM_SELCHANGE);
	*pResult = 0;
}

CString CPOEMDlg::GetYin(CString str)
{	
	CAdoRecordSet *Author = new CAdoRecordSet(m_con);
	CString sql = "select * from ZiYin where Zi = '" + str + "'";
	Author->Open(sql);
	str = "";
	Author->GetValueString(str,0);

	delete Author;

	return CString(str);
}

CString CPOEMDlg::GetPY(CString str)
{	
	CString b[6][4] = {{"à" ,"ǎ" ,"á" ,"ā"},{"ō" ,"ó" ,"ǒ" ,"ò"},{"ē", "é", "ě", "è"},
	{"ī","í","ǐ","ì"}, {"ū", "ú", "ǔ", "ù"}, {"ǖ", "ǘ", "ǚ", "ǜ"}};
	CString sdz;
	CString sb;
	CString s;
	CString a[6];
	int i = -1;
	int k = -1;

	a[0] = "a";
	a[1] = "o";
	a[2] = "e";
	a[3] = "i";
	a[4] = "u";
	a[5] = "v";

	for (int j=0; j<6; j++)
	{
		i = str.Find(a[j], 0);
		if (i >= 0)
		{
			str = str.Trim(" ");
			sdz = str.Mid(str.GetLength()-1, 1);
			k = (int)strtod(sdz.GetBuffer(), NULL);
			k = k - 1;
			
			if (k < 0)
			{
				str = str.Left(str.GetLength() -1);
				return CString(str);
				break;	
			}

			if (j != 3 )
			{
				sb = b[j][k];
				break;
			}
			else if (j == 3)
			{
				s = str.Mid(i+1, 1);
				sb = b[j][k];
				if (s == "u")
				{
					sb = b[j+1][k];
					i = i + 1;
				}
				break;
			}
		}
	}
	
	str = str.Left(str.GetLength() -1);
	str = str.Left(i) + sb + str.Mid(i+1);
	return CString(str);
}

void CPOEMDlg::OnEnSelchangeRichedit27(NMHDR *pNMHDR, LRESULT *pResult)
{
	SELCHANGE *pSelChange = reinterpret_cast<SELCHANGE *>(pNMHDR);
	// TODO:  控件将不发送该通知,除非您重写
	// CDialog::OnInitDialog() 函数以发送 EM_SETEVENTMASK 消息
	// 到具有 ENM_SELCHANGE 标志“或”运算到 lParam 掩码中的控件。
	
	// TODO:  在此添加控件通知处理程序代码
	long start, end;
	CString   str;
	m_zs.HideSelection(TRUE, FALSE);
	m_zs.SendMessage(EM_SETEVENTMASK, 0, ~ENM_SELCHANGE);
	m_zs.GetSel(start, end);

	m_zs.SetSel(start, start + 1);
	str = m_zs.GetSelText();
	
	if (start != m_zss)
	{
		SpeakCh(str);
		m_zss = start;
	}

	int i = str.GetLength();
	m_zs.SetSel(start, end);
	str = GetYin(str);
	str = GetPY(str);

	m_zx.SetWindowText(str);
	UpdateData(0);
	m_zs.HideSelection(FALSE, FALSE);
	m_zs.SendMessage(EM_SETEVENTMASK, 0, ENM_SELCHANGE);
	*pResult = 0;
}

void CPOEMDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(1);

	m_ftxt.Trim();
	m_fre.ResetContent();

	if (m_ftxt == "")
	{
		return;
	}

	m_fstore = m_ftxt;
	CAdoRecordSet *poem = new CAdoRecordSet(m_con);
	CString sql = "select * from PoemN where Content like '%" + m_ftxt + "%'";
	sql = sql + " order by Po_ID";
	
	poem->Open(sql);
	CString str = "";
	
	if (poem->GetRecordCount() <=0 )
	{
		return;
	}

	while (!poem->IsEOF())
	{
		poem->GetValueString(str,1);
		m_fre.AddString(str);
		poem->MoveNext();
	}
	
	m_fre.SetCurSel(0);
	OnCbnSelchangeZp2();

	delete poem;
}

void CPOEMDlg::OnCbnSelchangeZp2()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str;
	m_fre.GetLBText(m_fre.GetCurSel(), str);
	MoveToZP(str);
	m_flg = "F";
	SetPoem();
}

 void CPOEMDlg::OnBnClickedOk()
 {
	if (GetFocus()->m_hWnd  == m_ftxtctrl.m_hWnd )
	{
		OnBnClickedButton2();
	}
 }


 BOOL CPOEMDlg::FindSelStr(void)
 {
	long start, end, s, e, ys, ye;
	BOOL f = 0;
	WCHAR *wstr;
	CString str;

	m_gs.SendMessage(EM_SETEVENTMASK, 0, ~ENM_SELCHANGE);
	m_gs.HideSelection(TRUE, FALSE);

	m_gs.GetSel(ys, ye);
	m_gs.SetSel(0, -1);
	m_gs.GetSel(start, end);

	wstr  = new WCHAR[strlen(m_fstore)+1];
	wsprintfW(wstr, L"%S", m_fstore);
	
	for (s=0; s< end; s++)
	{
		e = s + wcslen(wstr);
		m_gs.SetSel(s, e);
		str = m_gs.GetSelText();

		if (str == m_fstore)
		{
			f = 1;
			break;
		}
	}
	
	m_gs.HideSelection(FALSE, FALSE);
	
	if (f == 0)
	{
		m_gs.SetSel(ys, ye);
	}
	else if (f == 1)
	{
		m_gs.SetSel(s, e);
	}

	m_gs.SendMessage(EM_SETEVENTMASK, 0, ENM_SELCHANGE);

	delete wstr;
	return 0;
 }


 HRESULT  CPOEMDlg::VoiceChange(HWND hwnd)
/////////////////////////////////////////////////////////////////
//
// This function is called during initialization and whenever the 
// selection for the voice combo box changes. 
// It gets the token pointer associated with the voice.
// If the new voice is different from the one that's currently 
// selected, it first stops any synthesis that is going on and
// sets the new voice on the global voice object. 
//
{
    HRESULT         hr = S_OK;
    GUID*           pguidAudioFormat = NULL;
    int             iFormat = 0;

    // Get the token associated with the selected voice
    ISpObjectToken* pToken = SpGetCurSelComboBoxToken(hwnd);
    
    //Determine if it is the current voice
    CComPtr<ISpObjectToken> pOldToken;
    hr = pVoice->GetVoice( &pOldToken );

    if (SUCCEEDED(hr))
    {
        if (pOldToken != pToken)
        {        
            // Stop speaking. This is not necesary, for the next call to work,
            // but just to show that we are changing voices.
            hr = pVoice->Speak( NULL, SPF_PURGEBEFORESPEAK, 0);
            // And set the new voice on the global voice object
            if (SUCCEEDED (hr) )
            {
                hr = pVoice->SetVoice(pToken);
            }
        }
    }
    return hr;
}

BOOL CPOEMDlg::SpeakCh(CString str)
{
	WCHAR     *pwstr = new WCHAR[strlen(str) + 1];
	int old = cBox->GetCurSel();
	int iCh = cBox->FindString(-1, "Microsoft Simplified Chinese");
	
	pVoice->Speak( NULL, SPF_PURGEBEFORESPEAK, 0);
	cBox->SetCurSel(iCh);
	VoiceChange(cBox->m_hWnd);
	
	wsprintfW(pwstr, L"%S", str);
	pVoice->Speak(pwstr, SPF_ASYNC, 0);
	
	delete pwstr;
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -