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

📄 clientwnd1.cpp

📁 本系统实现了简单的点歌功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				nIndex = 3;
			break;
		case 4://处理歌名长度查询时的坐标移动
			if(nIndex < 1)
				nIndex = 1;
			break;
		}
		m_selectmenu[m_nMenuIndex].SetUpDwnIndex(nIndex);
		break;//向上移 end
	case 2://向下移
		nIndex = m_selectmenu[m_nMenuIndex].GetUpDwnIndex();
		++nIndex;
		switch( m_nMenuIndex )
		{
		case 0://主菜单移动
			if(nIndex > 4)
				nIndex = 1;
			break;
		case 1://处理语种查询时的坐标移动
			if(nIndex > m_nSpeechNum)
				nIndex = 1;
			break;
		case 2://处理歌手查询时的坐标移动
			if(nIndex > m_nSingerNum)
				nIndex = 1;
			break;
		case 3://处理字母查询时的坐标移动
			if(nIndex > 3)
				nIndex = 1;
			break;
		case 4://处理歌名长度查询时的坐标移动
			if(nIndex > 1)
				nIndex = 1;
			break;
		}
		m_selectmenu[m_nMenuIndex].SetUpDwnIndex(nIndex);
		break;//向下移 end
	case 3://向左移
		switch( m_nMenuIndex )
		{
 		case 3://处理字母查询时的坐标移动
			nIndex = m_selectmenu[m_nMenuIndex].GetLftRtIndex();
			--nIndex;
			if(nIndex < 1)
				nIndex = 10;
			m_selectmenu[m_nMenuIndex].SetLftRtIndex(nIndex);
			break;
		case 4://处理歌名长度查询时的坐标移动
			nIndex = m_selectmenu[m_nMenuIndex].GetLftRtIndex();
			--nIndex;
			if(nIndex < 1)
				nIndex = 9;
			m_selectmenu[m_nMenuIndex].SetLftRtIndex(nIndex);
			break;
		default:
			break;
		}
		break;
	case 4://向右移
		switch( m_nMenuIndex )
		{
		case 3://处理字母查询时的坐标移动
			nIndex = m_selectmenu[m_nMenuIndex].GetLftRtIndex();
			++nIndex;
			if(nIndex > 10)
				nIndex = 1;
			m_selectmenu[m_nMenuIndex].SetLftRtIndex(nIndex);
			break;
		case 4://处理歌名长度查询时的坐标移动
 			nIndex = m_selectmenu[m_nMenuIndex].GetLftRtIndex();
			++nIndex;
			if(nIndex > 9)
				nIndex = 1;
			m_selectmenu[m_nMenuIndex].SetLftRtIndex(nIndex);
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
	//只有nMoveFlag在0和5之间时才显示菜单
	if( nMoveFlag > 0 && nMoveFlag < 5)
		ShowMenu(m_nMenuIndex);
}

//////////////////////////////////////////////////////////////////////////////////
//函数功能: 处理按键
void CClientWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
 	CClientDC dc(this);
 
  	int  nIndex;
 	char szText[256] = {0};
	CString strsql;
 
	//显示的是结帐页面时,只能按回车键重新连接服务器或按ESC退出程序
	if( m_nMenuFlag == 7 &&  nChar != VK_RETURN && nChar != VK_ESCAPE )
		return;

    switch(nChar)
	{
	case VK_ESCAPE:	//退出
		PostMessage(WM_CLOSE);
		break;

	case VK_RETURN:	//确认
  	switch( m_nMenuFlag )
		{
		case 1://主菜单操作
			if(m_bFstRun)
			{
				m_bFstRun = false;
				m_nMenuFlag = 1;//将m_nMenuFlag置1,在主菜单上操作
				m_nMenuIndex = 0;
				ShowMenu(0);
				break;
			}
			int x;
			int y;
			x = m_selectmenu[m_nMenuIndex].GetLftRtIndex();
			y = m_selectmenu[m_nMenuIndex].GetUpDwnIndex();
 			nIndex = (x-1)*10+y;
			m_nMenuIndex = nIndex;
			ShowMenu(m_nMenuIndex);
			m_nMenuFlag = 2;//将m_nMenuFlag置2,下一步将执行查询操作
			break;
		case 2://将执行查询操作
            SelectSong();
			m_strAlphabet = "";
			break;
 		case 6://当前显示的为查询时间和费用,此时按确定回到主菜单
			m_nMenuFlag = 1;//将m_nMenuFlag置1,在主菜单上操作
			m_nMenuIndex = 0;
			ShowMenu(0);
			this->SetFocus();
 			break;			
		case 7://当前显示的为结帐的界面,此时按确定回到主菜单
			//重新连接服务器
			CClientSocket clientSocket;
			if( !clientSocket.ReConnect() )
			{
				CDC mdc;
				mdc.CreateCompatibleDC(&dc);				
				//加载位图
				HBITMAP hbmp = LoadBitmap(m_conserver.GetAppPath() + 
					"picture\\login.bmp", m_nScreenX, m_nScreenY);
				SelectObject(mdc.m_hDC, hbmp);
                CString strmsg;
 				strmsg.Format("请到前台咨询");
				int xpos = GetXPos(strmsg);
				TextOut(&dc.m_hDC, xpos, 30, strmsg);
				Sleep(500);//让字显示0.5秒钟
				//用图片把字覆盖
				dc.BitBlt(0, 0, m_nScreenX, 70, &mdc, 0, 0, SRCCOPY);
				return;
			}

			if( !clientSocket.ConnectServer(CConnectServer::GetServerIp()) )
			{
				int xpos = GetXPos("连接失败服务器失败.");
				dc.TextOut(xpos, 40, "连接失败服务器失败.");
				dc.TextOut(xpos, 80, "请确认服务器是否打开");
				dc.TextOut(xpos, 120, "或连接服务器的人过多");
				dc.TextOut(xpos, 160, "请稍后再试.");
 				PostMessage(WM_CLOSE);//退出程序
				return;
			}	
			
			m_nMenuFlag = 1;//将m_nMenuFlag置1,在主菜单上操作
			m_nMenuIndex = 0;
			ShowMenu(0);
			this->SetFocus();

			break;			
		}
		break;
	
	case 'Q'://返回
		if( m_nMenuFlag == 1 )//在主菜单页面上按返回键为结帐
		{
			m_nMenuFlag = 6;//将m_nMenuFlag置6,当前显示的为查询时间和费用
			CDC mdc;
			mdc.CreateCompatibleDC(&dc);				
			//加载位图
			HBITMAP hbmp = LoadBitmap(m_conserver.GetAppPath() + 
				"picture\\login.bmp", m_nScreenX, m_nScreenY);
			SelectObject(mdc.m_hDC, hbmp);

			CClientSocket::SelectInfo();//向服务器发查询时间和费用的命令
			CString strmsg;
			strmsg.Format("您已用时: %s, 您应付%s块.", m_strUsedTime, 
				m_strPayforMoney);
			m_strUsedTime = "";
			m_strPayforMoney = "";
			int xpos = GetXPos(strmsg);
 			TextOut(&mdc.m_hDC, xpos, 200, strmsg, RGB(255,0,255));

			xpos = GetXPos("按确定返回主菜单,按返回键结帐.");
 			TextOut(&mdc.m_hDC, xpos, m_nScreenY-100, 
				"按确定键返回主菜单,按返回键结帐.", RGB(255,0,255));
			dc.BitBlt(0, 0, m_nScreenX, m_nScreenY, &mdc, 0, 0, SRCCOPY);
			break;
		}
		else if( m_nMenuFlag == 6 )//在查询时间和费用的界面上按返回则结帐
		{
			m_nMenuFlag = 7;//将m_nMenuFlag置7,显示结帐界面
			int xpos = GetXPos("谢谢光临,欢迎下次再来.");
			TextOut(&dc.m_hDC, xpos, m_nScreenY/2-40, "谢谢光临,欢迎下次再来.", 
				RGB(255,0,255));
			TextOut(&dc.m_hDC, xpos, m_nScreenY/2, "请到前台结帐.", 
				RGB(255,0,255));
		    //通知服务器结帐
			char szmsg[] = "payment";
			CClientSocket::SendMsg(szmsg, sizeof(szmsg));
			break;
		}
		else if( m_nMenuFlag != 3 && m_nMenuFlag != 1 && m_nMenuFlag < 6)
		{//当m_nMenuFlag等于2, 4或5时,返回主菜单
			m_nMenuFlag = 1;
			m_nMenuIndex = 0;
			ShowMenu(m_nMenuIndex);
		}
		else if( m_nMenuFlag == 3 )
		{//当m_nMenuFlag等于3即为选歌操作时,返回到上一级菜单,执行查询操作
			m_nMenuFlag = 2;
			ShowMenu(m_nMenuIndex);
		}
 
		break;
    
	case VK_PRIOR://上页
		Flip(1);
  		break;
	
	case VK_NEXT://下页

		Flip(2);
 		break;

	case VK_UP://上移
        MovePosition(1);
		break;

	case VK_DOWN://下移
        MovePosition(2);
		break;

	case 190: case VK_LEFT://左移
		MovePosition(3);
		break;

	case 191: case VK_RIGHT://右移 begin
        MovePosition(4);
		break;//右移 end

	//数字0-9
	case '0': 	case '1':	case '2':	case '3':	case '4':
	case '5':	case '6':	case '7':	case '8':	case '9':
		int nkey;
		nkey = nChar - '0';
 
	    /*m_nMenuFlag  1: 主菜单操作 2: 查询操作 3: 选歌操作 4: 删歌操作 5: 播放歌曲*/
		switch( m_nMenuFlag )
		{
		case 1://主菜单操作 begin
 			if( nkey > 0 && nkey < m_selectmenu[m_nMenuIndex].GetMenuItemNum())
			{
				ShowMenu(nkey);
				m_nMenuIndex = nkey;
				m_nMenuFlag = 2;
			}
			break;//主菜单操作 end

		case 2://将执行查询操作
			if( m_nMenuIndex == 3 )//是否为按字母查询
			{
				if( nkey == 0 )//0键用于选择单个字母
				{
					int x = m_selectmenu[m_nMenuIndex].GetLftRtIndex();
					int y = m_selectmenu[m_nMenuIndex].GetUpDwnIndex();
 					int	nIndex = (y-1)*10+x;
					
					m_strAlphabet += m_selectmenu[m_nMenuIndex].m_strMenuItem[nIndex];
					
					int xpos = GetXPos("请选择首字母:");
					TextOut(&dc.m_hDC, xpos, 280, m_strAlphabet);					
				}
				else if( nkey == 3 )//数字3用于删除上一个字母
				{
					CDC mdc;
					mdc.CreateCompatibleDC(&dc);				
					//加载位图
					HBITMAP hbmp = LoadBitmap(m_conserver.GetAppPath() + 
						"picture\\login.bmp", m_nScreenX, m_nScreenY);
					SelectObject(mdc.m_hDC, hbmp);

					int xpos = GetXPos("请选择首字母:");
					int ypos = 280;
					dc.BitBlt(xpos, ypos, 100, 50, &mdc, xpos, ypos, SRCCOPY);

					m_strAlphabet = m_strAlphabet.Left(m_strAlphabet.GetLength()-1);
					TextOut(&dc.m_hDC, xpos, 280, m_strAlphabet);					
				}
				break;
			}

			SelectSong(nkey);
			break;

		case 3://选定一首歌 begin
			int ret;
			nkey = (nkey == 0) ? m_nPageIndex*10 : (m_nPageIndex-1)*10 + nkey;
			ret = AddSong(nkey);
			if( ret > 0 )
			{
				//发送消息到服务器,所选歌曲已更改
				CClientSocket::SendMsg("LoadAgain", 10);
				CDC mdc;
 				mdc.CreateCompatibleDC(&dc);				
				//加载位图
 				HBITMAP hbmp = LoadBitmap(m_conserver.GetAppPath() + 
					"picture\\login.bmp", m_nScreenX, m_nScreenY);
				SelectObject(mdc.m_hDC, hbmp);
                CString strmsg;
				if( ret == 2 )
					strmsg.Format("这首歌已在播放列表中,请选择其它歌");
				else
					strmsg.Format("您已选定第%d首歌,按已点歌单查看已点歌曲", nkey);
				int xpos = GetXPos(strmsg);
				TextOut(&dc.m_hDC, xpos, 30, strmsg);
				Sleep(500);//让字显示0.5秒钟
				//用图片把字覆盖
				dc.BitBlt(0, 0, m_nScreenX, 70, &mdc, 0, 0, SRCCOPY);
			}
			break;//选定一首歌 end

		case 4://删除一首歌
			if(m_pSelectID == NULL)
				break;
			if(nkey > m_pSelectID[0])
				break;
			nkey = (nkey == 0) ? m_nPageIndex*10 : (m_nPageIndex-1)*10 + nkey;
 			strsql.Format("delete from request where ID=%d", m_pSelectID[nkey]);
			m_addrecord.GetRecordsetPtr(strsql);
			SendMessage(WM_KEYDOWN, VK_F6);
			break;

		case 5://播放歌曲
			if( m_pSelectID == NULL )
				break;
			if( nkey > m_pSelectID[0] || ( nkey == 0 && m_pSelectID[0] < 10) )
				break;
 
			m_nMenuFlag = 6;
			m_playsong.ShowWindow(SW_SHOW);
			m_playsong.Play( (nkey == 0) ? 
				m_nPageIndex*10 : (m_nPageIndex-1)*10 + nkey - 1 );
			break;
		}
		break;//数字键 end

	case VK_F4:	//已点歌单 begin
 		gethostname(szText, sizeof(szText));		
		strsql.Format("select * from request where username='%s' order by playseq", 
			szText);
		ShowSelectSong(strsql, "已点歌清单,按对应的数字键播放:", false, false);
        m_nMenuFlag = 5;//将m_nMenuFlag置5, 播放歌曲

		//将已选歌曲列表保存
		if( m_pSelectID == NULL )
			break;		
		int i;

⌨️ 快捷键说明

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