📄 tedlg.cpp
字号:
// TEDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TE.h"
#include "TEDlg.h"
#include"edge.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CString GetIpAddress();
/////////////////////////////////////////////////////////////////////////////
// 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()
/////////////////////////////////////////////////////////////////////////////
// CTEDlg dialog
CTEDlg::CTEDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTEDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTEDlg)
m_state = _T("法克");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_uPort = UDP_PORT;
srand((unsigned)time(NULL));
TheEdge=NULL;
Model_First=NULL;
Model_Next=NULL;
makeup=NULL;
HEADX=355;
HEADY=100;
// TEMP=3;
Start=false;
m_Music[0] = "happy.mid";
m_Music[1] = "sadmemory.mid";
m_Music[2] = "dream.mid";
m_Music[3] = "sky.mid";
m_Music[4] = "godofsun.mid";
m_Music[5] = "fly.mid";
m_Last_Music = ID_MUSIC_1; //默认音乐为蝶恋,代码为1;
next_color= 0;
color=0;
}
void CTEDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTEDlg)
DDX_Text(pDX, IDC_STATIC_STATE, m_state);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTEDlg, CDialog)
//{{AFX_MSG_MAP(CTEDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_START, OnStart)
ON_WM_TIMER()
ON_COMMAND(ID_CLOSE_MUSIC, OnCloseMusic)
ON_COMMAND(ID_MUSIC_1, OnMusic1)
ON_COMMAND(ID_MUSIC_2, OnMusic2)
ON_COMMAND(ID_MUSIC_3, OnMusic3)
ON_COMMAND(ID_MUSIC_4, OnMusic4)
ON_COMMAND(ID_MUSIC_5, OnMusic5)
ON_COMMAND(ID_MUSIC_6, OnMusic6)
ON_MESSAGE(UDP_C_SOCK,OnRev)
ON_MESSAGE(UDP_S_SOCK,OnSer)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTEDlg message handlers
BOOL CTEDlg::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
//初始化MIDI设备;
/* m_CloseParms.dwCallback = 0;
m_OpenParms.dwCallback = (DWORD)this->m_hWnd; //指定欲收到MIDI消息的窗口的句柄;
m_OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER;
m_OpenParms.lpstrElementName = m_Music[0];
m_OpenParms.wDeviceID = 0;
m_PlayParms.dwFrom = 0;
m_PlayParms.dwTo = 0;
m_PlayParms.dwCallback = (DWORD)this->m_hWnd;
//打开MCI设备;
mciSendCommand (NULL, MCI_OPEN,
MCI_WAIT | MCI_OPEN_TYPE |
MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &m_OpenParms);
mciSendCommand (m_OpenParms.wDeviceID, MCI_PLAY,
MCI_NOTIFY, (DWORD)(LPVOID)&m_PlayParms);
*/ GetMenu()->CheckMenuItem(ID_MUSIC_1,MF_CHECKED);
WSADATA wsaData;
WORD version = MAKEWORD(2, 0);
int ret = WSAStartup(version, &wsaData);
if(ret != 0)
{
TRACE("Initilize Error!\r\n"); //初始化失败
AfxMessageBox("Failed in initial socket");
}
SetUDPserver() ;
if(m_client.m_hUSocket != NULL)
{
//如果原来打开这套接字先关闭
closesocket(m_client.m_hUSocket);
m_client.m_hUSocket = NULL;
}
if(m_client.m_hUSocket == NULL)
{
//创建新的流套接字
m_client.m_hUSocket = socket(AF_INET, SOCK_DGRAM,0);
ASSERT(m_client.m_hUSocket != NULL);
m_client.UDPClientInit();
}
HostData=GetIpAddress();
TCHAR serveraddr[MAX_LENGTH]; //存放主机名
TCHAR FAR* lpServeraddr = serveraddr;
gethostname(lpServeraddr, MAX_LENGTH);
HostData=","+HostData;
HostData=lpServeraddr+HostData;
// TODO: Add extra initialization here
CString h="IP地址:";
h+="[";
h+=GetIpAddress();
h+="]";
int a=26-h.GetLength();
for(int i=0;i<a;i++){
h+=" ";
}
h+="主机名:";
h+=lpServeraddr;
HostData=h;
char *buffer=HostData.GetBuffer(0);
BroadSend(buffer,m_server.m_hUSocket,m_uPort);
return TRUE; // return TRUE unless you set the focus to a control
}
void CTEDlg::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 CTEDlg::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();
}
Graph();
if(Start){
DrawEdge();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTEDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTEDlg::Graph(){
CDC mdc;
CClientDC dc(this);
mdc.CreateCompatibleDC(&dc);
int x=355,y=100;
dc.FillSolidRect(x+ONE,y+ONE,WIDE*ONE-35,HIGH*ONE-35,RGB(0,0,0));
dc.FillSolidRect(5+TWO,80+TWO,WIDE*TWO-17,HIGH*TWO-17,RGB(0,200,0));
dc.FillSolidRect(123+TWO,80+TWO,WIDE*TWO-17,HIGH*TWO-17,RGB(0,0,200));
dc.FillSolidRect(5+TWO,350+TWO,WIDE*TWO-17,HIGH*TWO-17,RGB(200,0,0));
dc.FillSolidRect(123+TWO,350+TWO,WIDE*TWO-17,HIGH*TWO-17,RGB(200,200,0));
dc.FillSolidRect(241+TWO,350+TWO,WIDE*TWO-17,HIGH*TWO-17,RGB(0,200,0));
dc.FillSolidRect(285,198,4*ONE,4*ONE,RGB(0,0,0));
}
void CTEDlg::DrawEdge(){
int *temp=TheEdge->MakeUp();
for(int i=0;i<HIGH;i++){
for(int j=0;j<WIDE;j++){
if(*temp==0){
Sigle(HEADX+j*ONE,HEADY+i*ONE,0,0);
}
if(*temp>ADDDATA){
Sigle(HEADX+j*ONE,HEADY+i*ONE,0,(*temp)-ADDDATA);
}
temp++;
}
}
}
void CTEDlg::Sigle(int x,int y,int style,int color){
CDC mdc;
CClientDC dc(this);
mdc.CreateCompatibleDC(&dc);
switch (color){
case 0:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(0,0,0));
break;
case 2:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(0,255,0));
break;
case 3:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(0,0,255));
break;
case 4:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(255,255,0));
break;
case 5:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(0,255,255));
break;
case 6:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(255,0,255));
break;
case 7:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(238,13,165));
break;
case 8:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(87,71,231));
break;
case 9:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(51,225,60));
break;
case 10:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(240,169,34));
break;
case 11:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(128,0,255));
break;
case 12:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(255,0,128));
break;
case 13:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(0,255,128));
break;
case 14:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(255,128,64));
break;
case 15:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(128,128,255));
break;
case 16:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(255,0,0));
break;
default:
dc.FillSolidRect(x+1,y+1,ONE-1,ONE-1,RGB(128,0,128));
break;
}
return;
}
int CTEDlg::GetDown(Edge *edge,Model *model,int color){
// DrawEdge();
int *Location=edge->Location();
int *Model=model->Mod();
Movie(edge->Location(),model->Mod()+15,0,0,4);
int check=edge->ObjectDown(model,color);
if(check==1){
Movie(Location,Model+15,color,1,1);
int lines=edge->Lines();
if(lines==100){
return GameOver();
}
if(lines!=0){
GetScore(edge->Score());
for(int i=0;i<lines;i++){
int number=edge->OnTheFloor();
DrawEdge();
}
}
return 2;
}
Movie(edge->Location(),model->Mod()+15,color,0,4);
return 3;
}
int CTEDlg::GameOver(){
KillTimer(1);
Start=false;
delete TheEdge;
delete Model_Next;
delete Model_First;
CDC mdc;
CClientDC dc(this);
mdc.CreateCompatibleDC(&dc);
dc.TextOut(440,280,"GAME OVER");
return 4;
}
void CTEDlg::Movie(int *locate,int *objm,int color,int pat,int style){
int *temp2=objm;
int *head=makeup;
for( int j=0;j<4;j++){
for (int i=0;i<4;i++){
int PianYi=locate-head;
if(*temp2==1&&*locate==0&&pat==0)
Sigle(HEADX+ONE*(PianYi%WIDE),HEADY+ONE*(PianYi/WIDE),style,color);
if(pat!=0&&*temp2==1)
Sigle(HEADX+ONE*(PianYi%WIDE),HEADY+ONE*(PianYi/WIDE),style,color);
temp2--;
locate--;
}
locate=locate-WIDE+4;
if(*locate==4)
break;
}
}
void CTEDlg::GetScore(int score){
char qa[6];
itoa(score,qa,10);
// setfillstyle(0,0);
// bar(480,95,midx*2,122);
// settextstyle(0,0,4);
// setcolor(4);
// outtextxy(480,95,qa);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -