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

📄 dianji3dlg.cpp

📁 这是一个在PC上的电机控制软件
💻 CPP
字号:
// dianji3Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "dianji3.h"
#include "dianji3Dlg.h"
#include "ChangeDialog.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()

/////////////////////////////////////////////////////////////////////////////
// CDianji3Dlg dialog

CDianji3Dlg::CDianji3Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDianji3Dlg::IDD, pParent)
{	//{{AFX_DATA_INIT(CSecondwatchDlg)
	m_editHour = 0;
	m_editMinute = 0;
	m_editSecond = 0;
	m_editMsecond = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_second=0;
	m_msecond=0;
	m_minute=0;
	m_hour=0;
	m_bstart=false;
	soundflag=true;

	//{{AFX_DATA_INIT(CDianji3Dlg)
	m_setspeed = 0;
	m_currentspeed = 0;
	m_time_fen = 0;
	m_time_miao = 0;
	m_strRXData = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDianji3Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDianji3Dlg)

//	DDX_Control(pDX, IDOK, m_ctrOK);//?????????????加入这句会出现Desertation Failed!
	DDX_Control(pDX, IDCANCEL, m_Button5);
	DDX_Control(pDX, IDC_BUTTON5_fanzhuan, m_Button2);
	DDX_Control(pDX, IDC_BUTTON4_zhengzhuan, m_Button1);
	DDX_Control(pDX, IDC_BUTTON3, m_Button3);
//	DDX_Control(pDX, IDC_BUTTON4, m_ctrOK);
//	DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
	DDX_Text(pDX, IDC_EDIT1, m_setspeed);
	DDV_MinMaxInt(pDX, m_setspeed, 0, 3000);
	DDX_Text(pDX, IDC_EDIT2, m_currentspeed);
	DDX_Text(pDX, IDC_time_fen, m_time_fen);
	DDX_Text(pDX, IDC_time_miao, m_time_miao);
//	DDX_Text(pDX, IDC_EDIT3, m_strRXData);
	//}}AFX_DATA_MAP
		CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSecondwatchDlg)
	DDX_Control(pDX, IDC_CHANGE_START, m_btn4);
	DDX_Control(pDX, IDC_EXIT, m_btn3);
	DDX_Control(pDX, IDC_CHANGE_ZERO, m_btn2);
	DDX_Control(pDX, IDC_START, m_btn1);
	DDX_Text(pDX, IDC_EDIT01, m_editHour);
	DDX_Text(pDX, IDC_EDIT02, m_editMinute);
	DDX_Text(pDX, IDC_EDIT03, m_editSecond);
	DDX_Text(pDX, IDC_EDIT04, m_editMsecond);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDianji3Dlg, CDialog)
	//{{AFX_MSG_MAP(CDianji3Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_ERASEBKGND()
	ON_BN_CLICKED(IDC_BUTTON6_setspeed, Onsetspeed)
	ON_BN_CLICKED(IDC_BUTTON1_begin, Onbegin)
	ON_BN_CLICKED(IDC_BUTTON2_stop, Onstop)
	ON_BN_CLICKED(IDC_BUTTON4_zhengzhuan, Onzhengzhuan)
	ON_BN_CLICKED(IDC_BUTTON5_fanzhuan, Onfanzhuan)
	ON_BN_CLICKED(IDC_zengsu, Onzengsu)
	ON_BN_CLICKED(IDC_jiansu, Onjiansu)

	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_START, OnStart)
	ON_BN_CLICKED(IDC_CHANGE_ZERO, OnChangeZero)
	ON_BN_CLICKED(IDC_EXIT, OnExit)
//	ON_COMMAND(ID_SOUND, OnSound)
//	ON_UPDATE_COMMAND_UI(ID_SOUND, OnUpdateSound)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
//	ON_COMMAND(ID_EXIT, OnExit)
	ON_BN_CLICKED(IDC_CHANGE_START, OnChangeStart)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDianji3Dlg message handlers

BOOL CDianji3Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	CRect rc(0,0,0,0);
m_ctrlComm.Create(NULL,NULL,WS_CHILD,rc,this,IDC_MSCOMM1);
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);

m_ctrlComm.SetCommPort(1); //选择com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");

m_ctrlComm.SetSettings("9600,N,8,1"); //波特率9600,奇校验,8个数据位,1个停止位 
m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
m_ctrlComm.SetRThreshold(5); 
//参数1表示每当串口接收缓冲区中有多于或等于5个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

	// 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
	m_ctrOK.LoadAVI(IDR_AVI1);/////????????????
		int iInstallResult;
	iInstallResult=SetTimer(1,1,NULL);
	if(iInstallResult==0)
	{
		MessageBox("Can not install timer!");
	}
	
	return TRUE;   // return TRUE  unless you set the focus to a control
}

void CDianji3Dlg::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 CDianji3Dlg::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();  
/*		//实现有渐变背景的对话框
  CPaintDC dc(this);
	   CRect rc;
	   GetClientRect(&rc);//获取客户大小
	   int nHeight=rc.Height();
	   int i,j;
	   for(i=255,j=0;nHeight>=0;nHeight--,j++)
	   {
		   for (i=255,j=0;nHeight>=0;nHeight--,j++)
		   { CPen pen;
		   //pen.CreatePen(PS_SOLID,1,RGB(0,i,i);
		   CPen*pOldPen=dc.SelectObject(&pen);
		   dc.MoveTo(rc.left,j);
		   dc.LineTo(rc.right,j);
		   dc.SelectObject(pOldPen);
		   pen.DeleteObject();
		   i=max(0,i-1);
		   }
	   }*/
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDianji3Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BEGIN_EVENTSINK_MAP(CDianji3Dlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CDianji3Dlg)
	ON_EVENT(CDianji3Dlg, IDC_MSCOMM1, 1 /* OnComm */, OnMscomm1, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

//CByteArray是一个动态字节数组,可参看MSDN帮助
int CDianji3Dlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else 
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;

}


char CDianji3Dlg::ConvertHexChar(char ch) 
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else return (-1);
}


int CDianji3Dlg::OnMscomm1() 
{
  // TODO: Add your control notification handler code here
		VARIANT variant_inp;
		COleSafeArray safearray_inp;
		LONG len,k;
		BOOL flag2=FALSE;
		BOOL flag=FALSE;
		int m_singnal1,m_singnal2,m_contrdata,m_temp_h,m_temp_l;
		BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
		CString strtemp;
		if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
		{
			variant_inp=m_ctrlComm.GetInput(); //读缓冲区
			safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
			len=safearray_inp.GetOneDimSize(); //得到有效数据长度
			for(k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
			for(k=0;k<len;k++) //将数组转换为Cstring型变量
			{
				BYTE bt=*(char*)(rxdata+k); //字符型
				strtemp.Format("%02d",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
				if (k==0)
				{m_singnal1=atoi((LPCTSTR)strtemp);}
				if (k==1)
				{m_singnal2=atoi((LPCTSTR)strtemp);}
				if (k==2)
				{m_contrdata=atoi((LPCTSTR)strtemp);}
				if (k==3)
				{m_temp_h=atoi((LPCTSTR)strtemp);}
				if (k==4)
				{m_temp_l=atoi((LPCTSTR)strtemp);}
			}
			
					
			if (m_singnal1==255)
			  {	if (m_singnal2==255)
			    switch(m_contrdata)
				{case 8:m_time_fen=m_temp_h;
				        m_time_miao=m_temp_l;
    					break;
				 case 7:m_currentspeed=m_temp_h*256+m_temp_l;break;
		         case 4:flag2=true;break;
				 case 3:flag2=false;break;
				 case 2:flag=false;break;
				 case 1:flag=true;break;
   				}
				else
				{	  return 1;}
			  }	
			else
			{	  return 1;}
		}
	UpdateData(FALSE); //更新编辑框内容
  
}

		void CDianji3Dlg::Onsetspeed() 
		{
		UpdateData(TRUE); //读取编辑框内容
		int c,a,b;
		CByteArray hexdata;
		m_strTXData="FFFF07";
		int len2=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个字节
		hexdata.SetSize(10);
		len2++;
		if (m_setspeed<=255)
		{ c=0;
		  hexdata[len2]=(char)c;
		  len2++;
		  hexdata[len2]=(char)m_setspeed;
		}
		 else if ((255<m_setspeed)&&(m_setspeed<=3000))
		{  a=m_setspeed/256;//得前8字节的数据
		   m_time_fen=a;
		   b=m_setspeed%256;//得后8字节的数据
		   hexdata[len2]=(char)a;//分别传送数据
		   len2++;
		   hexdata[len2]=(char)b;
		}
		else
		{	 AfxMessageBox("所设定速度超出范围");}
		hexdata.SetSize(len2);
		m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
			UpdateData(FALSE);	
		}

		void CDianji3Dlg::Onbegin() 
		{
		CByteArray hexdata;
		m_strTXData="FFFF010000";
		int len=String2Hex(m_strTXData,hexdata);
		m_ctrlComm.SetOutput(COleVariant(hexdata));
		}

		void CDianji3Dlg::Onstop() 
		{
		CByteArray hexdata;
		m_strTXData="FFFF020000";
		int len=String2Hex(m_strTXData,hexdata);
		m_ctrlComm.SetOutput(COleVariant(hexdata));	

		}


		void CDianji3Dlg::Onzhengzhuan() 
		{
		CByteArray hexdata;
		m_strTXData="FFFF030000";
		int len=String2Hex(m_strTXData,hexdata);
		m_ctrlComm.SetOutput(COleVariant(hexdata));	
		}


		void CDianji3Dlg::Onfanzhuan() 
		{CByteArray hexdata;
		m_strTXData="FFFF040000";
		int len=String2Hex(m_strTXData,hexdata);
		m_ctrlComm.SetOutput(COleVariant(hexdata));

		}

		void CDianji3Dlg::Onzengsu() 
		{
		CByteArray hexdata;
		m_strTXData="FFFF050096";
		int len=String2Hex(m_strTXData,hexdata);
		m_ctrlComm.SetOutput(COleVariant(hexdata));	
		}


		void CDianji3Dlg::Onjiansu() 
		{
		CByteArray hexdata;
		m_strTXData="FFFF060096";
		int len=String2Hex(m_strTXData,hexdata);
		m_ctrlComm.SetOutput(COleVariant(hexdata));	
			
		}

		BOOL CDianji3Dlg::OnEraseBkgnd(CDC* pDC)
		{
			CRect rc;
			GetClientRect(&rc);
/*			CBitmap bm;
			bm.LoadBitmap(IDB_BITMAP1);
			CDC dcMem;
			dcMem.CreateCompatibleDC(NULL);

			CBitmap* pOld = dcMem.SelectObject(&bm);
			CSize cs = bm.GetBitmapDimension();
			pDC->StretchBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,cs.cx, cs.cy,SRCCOPY);
*/
			CWnd *pWnd = GetDlgItem(IDC_PANEPICUTRE);
			pWnd->MoveWindow(0,0,rc.Width(),rc.Height());
			return CDialog::OnEraseBkgnd(pDC);
			
			return TRUE;
		}

void CDianji3Dlg::OnAppAbout()
{
// TODO: Add your command handler code here
	CAboutDlg dlg;
	dlg.DoModal();
}

void CDianji3Dlg::OnChangeStart()
{
CChangeDialog dlg;
	if(dlg.DoModal() == IDOK)
	{
		
		if(dlg.m_Hour||dlg.m_Minute<60||dlg.m_Second<60||dlg.m_100Second<100)
		{
		UpdateData(true);
		m_editHour=dlg.m_Hour;
		m_editMinute=dlg.m_Minute;
		m_editSecond=dlg.m_Second;
		m_editMsecond=dlg.m_100Second;
		UpdateData(false);

		}
		else
		{
			::AfxMessageBox("输入错误,请重新输入");
		}
	
	
		
	}
}

void CDianji3Dlg::OnChangeZero()
{
	if(m_bstart==true)
		AfxMessageBox("在计时,无法清零");
	else
	{
	m_editHour=m_hour=0;	
	m_editMinute=m_minute=0;
	m_editSecond=m_second=0; 
	m_editMsecond=m_msecond=0;
	}
	UpdateData(false);	
}

void CDianji3Dlg::OnDestroy()
{
	CDialog::OnDestroy();
	
	KillTimer(1);	
}

void CDianji3Dlg::OnExit()
{
if(m_bstart==true)
		AfxMessageBox("在计时,请稍后退出");
	else
		CDianji3Dlg::OnCancel();
}

void CDianji3Dlg::OnSound()
{
soundflag=!soundflag;
}

void CDianji3Dlg::OnStart()
{
	m_bstart=!m_bstart;
}

void CDianji3Dlg::OnTimer(UINT nIDEvent)
{
	if(m_bstart==true)
	{
		
		m_msecond=m_msecond+1;
		if(m_msecond>=100)
		{
			m_msecond=0;
			m_second=m_second+1;
			if(soundflag==true)
			MessageBeep((WORD)-1);

			
		}
		if(m_second>=60)
		{
			m_second=0;
			m_minute=m_minute+1;
		}
		if(m_minute>=60)
		{
			m_minute=0;
			m_hour=m_hour+1;
		}
		if(m_hour>=24)
		{
			m_second=0;
			m_msecond=0;
			m_minute=0;
			m_hour=0;
		}
		m_editMsecond=m_msecond;
		m_editSecond=m_second;
		m_editMinute=m_minute;
		m_editHour=m_hour;
		UpdateData(false);
	}
	
	CDialog::OnTimer(nIDEvent);
}

void CDianji3Dlg::OnUpdateSound(CCmdUI *pCmdUI)
{
	pCmdUI->SetRadio(soundflag);
}


⌨️ 快捷键说明

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