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

📄 clientwnd1.cpp

📁 本系统实现了简单的点歌功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		m_playsong.SetFilePath(m_addrecord.GetSongPath(m_pSelectID[1]));
		for(i = 2; i <= m_pSelectID[0]; i++)
			m_playsong.SetFilePath(m_addrecord.GetSongPath(m_pSelectID[i]));
		break;//已点歌单 end
	
 	case VK_F6://删歌
 		gethostname(szText, sizeof(szText));		
		strsql.Format("select * from request where username='%s' order by playseq", 
			szText);
		ShowSelectSong(strsql, "已点歌清单,按对应的数字键删除:", false, false);
		m_nMenuFlag = 4;//将m_nMenuFlag置4,执行删歌操作
		//发送消息到服务器,所选歌曲已更改
 		CClientSocket::SendMsg("LoadAgain", 10);
		break;
	
	case 'T'://TV和VGA
 		break;
	}
	
	CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

//////////////////////////////////////////////////////////////////////////////////
//函数功能: 显示菜单
//参数说明: nMenuIndex: 当前菜单索引
void CClientWnd::ShowMenu(int nMenuIndex)
{
	CClientDC dc(this);

 	CDC mdc;
	CDC mdcsgn;
	mdcsgn.CreateCompatibleDC(&dc);
 	mdc.CreateCompatibleDC(&dc);

	//加载位图
	HBITMAP hbmpsgn;
  	HBITMAP hbmp = LoadBitmap(m_conserver.GetAppPath() + "picture\\login.bmp", m_nScreenX, m_nScreenY);

    SelectObject(mdc.m_hDC, hbmp);

	int xpos = GetXPos(m_selectmenu[nMenuIndex].m_strMenuItem[0].GetBuffer(0));
	int ypos = 40;
	int i, j;
	
	TextOut(&mdc.m_hDC, xpos-200, ypos+=40, m_selectmenu[nMenuIndex].m_strMenuItem[0], RGB(255,0,255));
	xpos-=150;

	int x = m_selectmenu[nMenuIndex].GetLftRtIndex();
	int y = m_selectmenu[nMenuIndex].GetUpDwnIndex();

	switch( nMenuIndex )
	{
	case 0://显示主菜单
	case 1://显示语种查询菜单
	case 2://显示歌手查询菜单
 		for(i = 1; i < m_selectmenu[nMenuIndex].GetMenuItemNum(); i++)
		{
			TextOut(&mdc.m_hDC, xpos, ypos+i*40, m_selectmenu[nMenuIndex].m_strMenuItem[i]);
		}

		int nIndex;
		nIndex = (x-1)*10+y;
		if( nMenuIndex == 2 )//贴上各歌手的图片
		{
			hbmpsgn = LoadBitmap(m_strSingerPath[nIndex-1], 120, 150);
			SelectObject(mdcsgn.m_hDC, hbmpsgn);
			BitBlt(mdc.m_hDC, xpos+200, ypos+40, 120, 150, mdcsgn.m_hDC, 0, 0, SRCCOPY);
		}
		TextOut(&mdc.m_hDC, xpos+(x-1)*40, ypos+y*40, m_selectmenu[nMenuIndex].m_strMenuItem[nIndex], RGB(255,0,255));
		if( nMenuIndex == 0 )
		{
			int xpos = GetXPos("按返回键查询已用时间和费用.");
			TextOut(&mdc.m_hDC, xpos, m_nScreenY-100, "按返回键查询已用时间和费用.", RGB(255,0,255));
		}
		break;
	case 3://显示字母查询菜单
 		for(i = 0; i < m_selectmenu[nMenuIndex].GetMenuItemNum()/10 + 1; i++)
		{
			for( j = 1; j < 11; j++)
			{
				if(i*10+j < m_selectmenu[nMenuIndex].GetMenuItemNum())
					TextOut(&mdc.m_hDC, xpos+(j-1)*40, ypos+(i+1)*40, m_selectmenu[nMenuIndex].m_strMenuItem[i*10+j]);			
			}
		}
		if( (y-1)*10+x > 26)//判断移动后的位置是否大于26,是则改变X,Y坐标,
		{
			if( x > 6 )
			{
				x = 1;
				m_selectmenu[nMenuIndex].SetLftRtIndex(x);
			}
			else if( x < 0 )
			{
				x = 6;
				m_selectmenu[nMenuIndex].SetLftRtIndex(x);
			}
			m_selectmenu[nMenuIndex].SetUpDwnIndex(y);
		}

		TextOut(&mdc.m_hDC, xpos+(x-1)*40, ypos+y*40, m_selectmenu[nMenuIndex].m_strMenuItem[(y-1)*10+x], RGB(255,0,255));
		TextOut(&mdc.m_hDC, xpos-40, ypos+200, "歌名首字母:  ", RGB(255,0,255));
		TextOut(&mdc.m_hDC, xpos+150, ypos+200, m_strAlphabet);
		TextOut(&mdc.m_hDC, xpos-40, m_nScreenY-100, "按0选择字母,3删除字母,确定键查询", RGB(255,0,255));
		break;
	case 4://显示歌名长度菜单
		for(i = 1; i < 10; i++)
		{
			TextOut(&mdc.m_hDC, xpos+(i-1)*40, ypos+40, m_selectmenu[nMenuIndex].m_strMenuItem[i]);
		}
		TextOut(&mdc.m_hDC, xpos+(x-1)*40, ypos+y*40, m_selectmenu[nMenuIndex].m_strMenuItem[(y-1)*10+x], RGB(255,0,255));
		break;
	}

	dc.BitBlt(0, 0, m_nScreenX, m_nScreenY, &mdc, 0, 0, SRCCOPY);
}

//////////////////////////////////////////////////////////////////////////////////
//函数功能: 执行查询操作
/*参数说明: nIndex == 0 为按确认键时调用 
            nIndex != 0 为按下的数字键 */
void CClientWnd::SelectSong(int nIndex)
{
	int npos;
	int nTotallen;//字符串总长度,得到查询条件时用
 	CString strsql;//SQL语句
	CString strtmp;

	if( nIndex == 0 )
	{
		//计算当前选中的菜单在数组中的位置
		int x = m_selectmenu[m_nMenuIndex].GetLftRtIndex();
		int y = m_selectmenu[m_nMenuIndex].GetUpDwnIndex();
		if( m_nMenuIndex < 3 )//列优先
			nIndex = (x-1)*10+y;
		else//行优先
			nIndex = (y-1)*10+x;

		if( m_strAlphabet.IsEmpty() )
			m_strAlphabet = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex];
	}
	
	switch( m_nMenuIndex )
	{
	case 1://按语种查询
		if( nIndex > 0 && nIndex < m_selectmenu[m_nMenuIndex].GetMenuItemNum())
		{
			//从当前选中的菜单项中找出用于查询的关键字保存在strtmp中
			nTotallen = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex].GetLength();
			npos = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex].Find("、");
			strtmp = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex].Right(nTotallen - npos - 3);
			
			strsql.Format("select ID, songname, singer from songlist where speech='%s' order by songname", strtmp);
			ShowSelectSong(strsql);
			m_nMenuFlag = 3;//将m_nMenuFlag置3,下一步将执行选歌操作
		}
		break;//按语种查询 end
	case 2://按歌手查询 begin
		if( nIndex > 0 && nIndex < m_selectmenu[m_nMenuIndex].GetMenuItemNum())
		{
			//从当前选中的菜单项中找出用于查询的关键字保存在strtmp中
			nTotallen = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex].GetLength();
			npos = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex].Find("、");
			strtmp = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex].Right(nTotallen - npos - 3);
			
			strsql.Format("select ID, songname, singer from songlist where singer='%s' order by songname", strtmp);
			ShowSelectSong(strsql);
			m_nMenuFlag = 3;
		}
		break;//按歌手查询 end
	case 3://按字母查询
		if( nIndex > 0 && nIndex < m_selectmenu[m_nMenuIndex].GetMenuItemNum())
		{
 			strsql.Format("select ID, songname, singer, fstalphabet from songlist order by songname", m_strAlphabet);
			ShowSelectSong(strsql);
			m_nMenuFlag = 3;//将m_nMenuFlag置3,下一步将执行选歌
		}
		break;
	case 4://按歌名长度查询
		if( nIndex > 0 && nIndex < m_selectmenu[m_nMenuIndex].GetMenuItemNum())
		{
			strtmp = m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex];
			strsql.Format("select ID, songname, singer from songlist where namelen='%s' order by songname", strtmp);
			ShowSelectSong(strsql);
			m_nMenuFlag = 3;//将m_nMenuFlag置3,下一步将执行选歌
		}
		break;
	}
}

//////////////////////////////////////////////////////////////////////////////////
//函数功能: 将选定的歌显示在屏幕上
/*参数说明: lpszsql: 将执行的SQL查询语句
            lpszTitle: 显示的提示信息
            bPageDnUp: 是否为翻页, true为翻页
            bSonglistTable: 是否为显示songlist表里的歌曲*/
void CClientWnd::ShowSelectSong(LPCTSTR lpszsql, LPCTSTR lpszTitle, BOOL bPageDnUp, BOOL bSonglistTable)
{
	CClientDC dc(this);

	DrawBGBmp();

	int xpos;
	int ypos = 40;
 	int nItemNum = 0;

	m_strPreSelect = lpszsql;

 	try
	{
		_RecordsetPtr pRequestPtr;
		pRequestPtr = m_addrecord.GetRecordsetPtr((_bstr_t)lpszsql);
		
		if( !pRequestPtr->BOF )
			pRequestPtr->MoveFirst();
		else
		{
			xpos = GetXPos("没有您要找的歌,请重新查找");
			TextOut(&dc.m_hDC, xpos, ypos, "没有您要找的歌,请重新查找", RGB(255,0,255));
			return;
		}
		
		CString strFstAlphabet;
		if( !bPageDnUp )//得到查询后的总歌数
		{
			m_nPageNum = 0;
			while( !pRequestPtr->adoEOF )
			{
				if( bSonglistTable && m_nMenuIndex == 3 )//当前的查询为按字母查询,则从所有的歌中找出歌名首字母中含有要查询字母的歌
				{
					strFstAlphabet = (LPCTSTR)(_bstr_t)pRequestPtr->GetCollect("fstalphabet");
					if( strFstAlphabet.Find(m_strAlphabet) != 0 )
					{
						pRequestPtr->MoveNext();
						continue;
					}
				}
				nItemNum++;
				if( nItemNum > m_nPageNum*10 )
					m_nPageNum++;

				pRequestPtr->MoveNext();
			}
			if( nItemNum == 0 )
			{
				xpos = GetXPos("没有您要找的歌,请重新查找");
				TextOut(&dc.m_hDC, xpos, ypos, "没有您要找的歌,请重新查找", RGB(255,0,255));
				return;
			}
			
			if( m_pSelectID != NULL )
			{
				delete[] m_pSelectID;
				m_pSelectID = NULL;
			}
			m_pSelectID = new int[nItemNum + 1];//分配一个数组,存入查询得到的歌的ID
			m_pSelectID[0] = nItemNum;//0号位置存放ID的个数
			m_nPageIndex = 1;
			
			nItemNum = 0;
			pRequestPtr->MoveFirst();
		}
		
 		xpos = GetXPos(lpszTitle);
		TextOut(&dc.m_hDC, xpos-200, ypos+=40, lpszTitle, RGB(255,0,255));
		xpos-=150;
		
		_variant_t vtID;
 		_variant_t vtsongname;
		_variant_t vtsinger;
		
		CString strmsg;
		
		int nItemIndex = 0;
		while( !pRequestPtr->adoEOF )
		{
			nItemIndex++;
			if( bPageDnUp && bSonglistTable && nItemIndex <= (m_nPageIndex-1)*10 )//控制查询歌曲时的翻页
			{
				pRequestPtr->MoveNext();
				continue;
			}

			if( !bPageDnUp && bSonglistTable && m_nMenuIndex == 3 )//当前的查询为按字母查询,则从所有的歌中找出歌名首字母中含有要查询字母的歌
			{
				strFstAlphabet = (LPCTSTR)(_bstr_t)pRequestPtr->GetCollect("fstalphabet");
				if( strFstAlphabet.Find(m_strAlphabet) != 0 )
				{
					pRequestPtr->MoveNext();
					continue;
				}
			}
	
			int nID;
			nItemNum++;
			
			if( !bPageDnUp )//是否为翻页, 否, 则把ID存入数组
			{
				vtID = pRequestPtr->GetCollect("ID");
				nID = atoi((LPCTSTR)(_bstr_t)vtID);
				m_pSelectID[nItemNum] = nID;
			}

			if( nItemNum <= 10 )//每页显示十首歌,当nItemNum>10时,不再显示
			{
				vtsinger = pRequestPtr->GetCollect("singer");
				vtsongname = pRequestPtr->GetCollect("songname");
				
				strmsg.Format( "%-3d、 %-20s  %-10s", 
					nItemNum, 
					(LPCTSTR)(_bstr_t)vtsongname, 
					(LPCTSTR)(_bstr_t)vtsinger );
				TextOut(&dc.m_hDC, xpos, ypos+=40, strmsg);
			}
			
			pRequestPtr->MoveNext();
		}
//		TextOut(&dc.m_hDC, 
	}
	catch(_com_error e)
	{
		AfxMessageBox(e.ErrorMessage());
		return;
	}
}

//////////////////////////////////////////////////////////////////////////////////
//函数功能: 将选定的歌曲加到数据库中
/*参数说明: nIndex: 选定歌曲在数组m_pSelectID中的下标
返回值说明: 返回0: 失败 返回1: 成功 返回2: 该歌已选过*/
BOOL CClientWnd::AddSong(int nIndex)
{
	if(nIndex > m_pSelectID[0])
		return 0;

	char hostname[256];
	gethostname(hostname, sizeof(hostname));	
	
	try
	{
		CString strsql;
		strsql.Format("select * from songlist where ID=%d", m_pSelectID[nIndex]);
		_RecordsetPtr pRequestPtr;
		pRequestPtr = m_addrecord.GetRecordsetPtr(strsql);

		char szID[10];
		_variant_t vtsongname;
        _variant_t vtsinger;

		itoa(m_pSelectID[nIndex], szID, 10);
		vtsongname = pRequestPtr->GetCollect("songname");
		vtsinger = pRequestPtr->GetCollect("singer");

		if( m_addrecord.SaveRecord(m_pSelectID[nIndex], hostname, vtsongname, vtsinger) == 2 )
			return 2;
	}
	catch(_com_error e)
	{
		AfxMessageBox((CString)e.ErrorMessage() + "选歌失败");
		return 0;
	}

	return 1;
}

void CClientWnd::SetUsedTime(LPCTSTR lpszUsedTime)
{
	m_strUsedTime = lpszUsedTime;
}

void CClientWnd::SetPayforMoney(LPCTSTR lpszPayforMoney)
{
	m_strPayforMoney = lpszPayforMoney;
}

⌨️ 快捷键说明

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