电子秤--快捷键版

来源:互联网 发布:开淘宝店必须要电脑吗 编辑:程序博客网 时间:2024/04/30 01:59

CommWizardDlg.cpp

// CommWizardDlg.cpp : implementation file//#include "stdafx.h"#include "CommWizard.h"#include "CommWizardDlg.h"#include "SettingDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifchar* getResult(char strlast[]);long char2long(char strres[]);char* getWeight(char result[]);//称重的一些数据char  res[8],result[30], weight[30]; long sum; /////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass 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// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_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_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCommWizardDlg dialogCCommWizardDlg::CCommWizardDlg(CWnd* pParent /*=NULL*/): CDialog(CCommWizardDlg::IDD, pParent){bSend = FALSE;bReceive = FALSE;m_nPort = 1;m_strSettings = _T("2400,n,8,1");m_strSendString = _T("");m_nTime = 1000;m_nInputMode = 1;//{{AFX_DATA_INIT(CCommWizardDlg)m_strReceive = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCommWizardDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCommWizardDlg)DDX_Control(pDX, IDC_RECEIVE, m_ctrlReceive);DDX_Control(pDX, IDC_SEND, m_ctrlSend);DDX_Control(pDX, IDC_TYPE, m_ctrlDataType);DDX_Text(pDX, IDC_EDIT_RECEIVE, m_strReceive);DDX_Control(pDX, IDC_COMMCTRL, m_Com);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCommWizardDlg, CDialog)//{{AFX_MSG_MAP(CCommWizardDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_RECEIVE, OnReceive)ON_BN_CLICKED(IDC_SEND, OnSend)ON_BN_CLICKED(IDC_SETTINGS, OnSettings)ON_CBN_SELCHANGE(IDC_TYPE, OnSelchangeType)ON_BN_CLICKED(IDC_CLEAR, OnClear)ON_BN_CLICKED(IDC_MANUALSEND, OnManualsend)ON_WM_TIMER()//手动添加ON_MESSAGE(WM_HOTKEY,OnHotKey)//}}AFX_MSG_MAPON_EN_CHANGE(IDC_EDIT_RECEIVE, &CCommWizardDlg::OnEnChangeEditReceive)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCommWizardDlg message handlersBOOL CCommWizardDlg::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 dialogSetIcon(m_hIcon, TRUE);// Set big iconSetIcon(m_hIcon, FALSE);// Set small icon// TODO: Add extra initialization here//UnregisterHotKey(GetSafeHwnd(), m_HotKeyID);//AfxMessageBox("取消了快捷键");//   CDialog::OnCancel();m_HotKeyID = 0;    ::RegisterHotKey(GetSafeHwnd(),m_HotKeyID,MOD_CONTROL,VK_SPACE); //定义ctrl + 空格m_ctrlDataType.AddString(_T("按ASCII码"));m_ctrlDataType.AddString(_T("按2进制"));m_ctrlDataType.AddString(_T("按16进制"));m_ctrlDataType.SetCurSel(m_nInputMode);return TRUE;  // return TRUE  unless you set the focus to a control}void CCommWizardDlg::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 CCommWizardDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags//  the minimized window.HCURSOR CCommWizardDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CCommWizardDlg::OnReceive() {// TODO: Add your control notification handler code herem_Com.GetInput();//先预读缓冲区以清除残留数据bReceive = !bReceive;if(bReceive)m_ctrlReceive.SetWindowText(_T("停止接收"));elsem_ctrlReceive.SetWindowText(_T("开始接收"));}void CCommWizardDlg::OnSend() {// TODO: Add your control notification handler code herebSend = !bSend;if(bSend){m_ctrlSend.SetWindowText(_T("停止发送"));SetTimer(1,m_nTime,NULL);//时间为1000毫秒}else{m_ctrlSend.SetWindowText(_T("自动发送"));KillTimer(1);  //取消定时}}void CCommWizardDlg::OnSettings() {// TODO: Add your control notification handler code hereCSettingDlg setDlg;setDlg.nPort = m_nPort;setDlg.nTime = m_nTime;setDlg.strSettings = m_strSettings;setDlg.strSendString = m_strSendString;if(setDlg.DoModal() == IDOK){m_nPort = setDlg.nPort;m_nTime = setDlg.nTime;m_strSettings = setDlg.strSettings;m_strSendString = setDlg.strSendString;}OpenPort();}void CCommWizardDlg::OnSelchangeType() {// TODO: Add your control notification handler code herem_nInputMode = m_ctrlDataType.GetCurSel();}void CCommWizardDlg::OnClear() {// TODO: Add your control notification handler code herem_strReceive = _T("");}BEGIN_EVENTSINK_MAP(CCommWizardDlg, CDialog)    //{{AFX_EVENTSINK_MAP(CCommWizardDlg)ON_EVENT(CCommWizardDlg, IDC_COMMCTRL, 1 /* OnComm */, OnOnCommCommctrl, VTS_NONE)//}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CCommWizardDlg::OnOnCommCommctrl() {// TODO: Add your control notification handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.CString strtemp;if(bReceive){if(m_Com.GetCommEvent()==2)     //事件值为2表示接收缓冲区内有字符{m_strReceive = "";  //清空对话框variant_inp = m_Com.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);      //字符型if(m_nInputMode == 2)strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔else strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放m_strReceive = m_strReceive + strtemp;    //加入接收编辑框对应字符串    }int flag = 0;CString m_strRes;m_strRes = "";if(flag < 2){m_strRes += m_strReceive;flag++;} else {flag = 0;}//将CString类型的转化为char型int strLength = m_strRes.GetLength() + 1;            char *pValue = new char[strLength];            strncpy(pValue, m_strRes, strLength);//将最后的重量传给对话框显示m_strReceive = getWeight(getResult(pValue));//m_strReceive += "\r\n";//UpdateData();//把数据粘贴到剪贴板        CString source=m_strReceive;if( OpenClipboard() ){HGLOBAL clipbuffer;        char * buffer;        EmptyClipboard();        clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);        buffer = (char*)GlobalLock(clipbuffer);        strcpy(buffer, LPCSTR(source));        GlobalUnlock(clipbuffer);        SetClipboardData(CF_TEXT,clipbuffer);        CloseClipboard();}}}UpdateData(FALSE);           //更新编辑框内容}void CCommWizardDlg::OpenPort(){if(m_Com.GetPortOpen())m_Com.SetPortOpen(FALSE);m_Com.SetCommPort(m_nPort);       //选择com1if( !m_Com.GetPortOpen())m_Com.SetPortOpen(TRUE);//打开串口elseAfxMessageBox("cannot open serial port");m_Com.SetSettings(m_strSettings); //波特率2400,无校验,8个数据位,1个停止位m_Com.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件m_Com.SetInputMode(1);m_Com.SetInputLen(0);  //设置当前接收区数据长度为0m_Com.GetInput();//先预读缓冲区以清除残留数据}void CCommWizardDlg::OnManualsend() {// TODO: Add your control notification handler code hereCString strSend;if(m_nInputMode > 1){CByteArray hexdata;int len=String2Hex(m_strSendString ,hexdata);m_Com.SetOutput(COleVariant(hexdata));}elsem_Com.SetOutput(COleVariant(m_strSendString));//发送数据}void CCommWizardDlg::OnTimer(UINT nIDEvent) {// TODO: Add your message handler code here and/or call defaultOnManualsend();CDialog::OnTimer(nIDEvent);}int CCommWizardDlg::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];if(hstr==' '){i++;continue;}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;}//这是一个将字符转换为相应的十六进制值的函数//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1char CCommWizardDlg::ConvertHexChar(char ch) {if((ch>='0')&&(ch<='9'))return ch-0x30;else if((ch>='A')&&(ch<='F'))return ch-'A'+10;else if((ch>='a')&&(ch<='f'))return ch-'a'+10;else return (-1);}void CCommWizardDlg::OnEnChangeEditReceive(){// TODO:  如果该控件是 RICHEDIT 控件,它将不// 发送此通知,除非重写 CDialog::OnInitDialog()// 函数并调用 CRichEditCtrl().SetEventMask(),// 同时将 ENM_CHANGE 标志“或”运算到掩码中。// TODO:  在此添加控件通知处理程序代码CEdit   *pBt   =   (CEdit*)GetDlgItem(IDC_EDIT_RECEIVE);     int   i   =   pBt-> GetLineCount();     pBt-> LineScroll(i,0); }//在取消按钮的事件函数中加入:void CCommWizardDlg::OnCancelHotKey(){    UnregisterHotKey(GetSafeHwnd(), m_HotKeyID);AfxMessageBox("取消了快捷键");    CDialog::OnCancel();}//处理截到的组合键,并处理:long CCommWizardDlg::OnHotKey(WPARAM wParam,LPARAM lParam) //wParam一般为热键消息的ID{//AfxMessageBox("快捷键截获成功!");//Sleep(500);//    keybd_event(VK_LWIN,0,0,0); //   keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0);keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);   keybd_event(VK_CONTROL,0,0,0);    keybd_event('V',0,0,0);    keybd_event('V',0,KEYEVENTF_KEYUP,0);keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);    return 0;}//得到中间的有效字符串char* getResult(char strlast[]){int len = strlen(strlast);int i, j = 0;for(i = 0; i < len; i++){while(strlast[i] != '+' && strlast[i] != '\0') i++;i++;while(strlast[i] != '+' && strlast[i] != '\0'){result[j++] = strlast[i++];}result[j] = '\0';break;}return result;}//字符串转long型long char2long(char* strres){sum = 0;printf("strres = %s\n", strres);int len = strlen(strres);for(int i = 0; i < len; i++){long temp = strres[i] - 48;sum = sum * 10 + temp;}printf("\n");return sum;}//得到最终重量的字符表达式char* getWeight(char result[]){int j = 0;for(int k=0; k<4; k++){if(result[k] == '0') continue; //去掉开头的0weight[j++] = result[k];}if(j == 0) weight[j++] = '0'; //如果前面4位都是0,则自动添加一个0weight[j++] = '.';weight[j++] = result[4];weight[j++] = result[5];weight[j] = '\0';return weight;}


CommWizardDlg.h

// CommWizardDlg.h : header file////{{AFX_INCLUDES()#include "mscomm.h"//}}AFX_INCLUDES#if !defined(AFX_COMMWIZARDDLG_H__7AA90EC4_0429_4FD9_8932_F02710DFFDC7__INCLUDED_)#define AFX_COMMWIZARDDLG_H__7AA90EC4_0429_4FD9_8932_F02710DFFDC7__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define VK_S 83 //如果自定义快捷键的话,注意ID和编码要对应/////////////////////////////////////////////////////////////////////////////// CCommWizardDlg dialogclass CCommWizardDlg : public CDialog{// Constructionpublic:char CCommWizardDlg::ConvertHexChar(char ch);int  String2Hex(CString str, CByteArray &senddata);void OpenPort();CCommWizardDlg(CWnd* pParent = NULL);// standard constructorint m_HotKeyID; //为你自己定义的一个hot key的ID值,在整个程序唯一afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam); //定义快捷键捕捉函数BOOL bSend;BOOL bReceive;int m_nInputMode;intm_nPort;CStringm_strSettings;CStringm_strSendString;intm_nTime;// Dialog Data//{{AFX_DATA(CCommWizardDlg)enum { IDD = IDD_COMMWIZARD_DIALOG };CButtonm_ctrlReceive;CButtonm_ctrlSend;CComboBoxm_ctrlDataType;CStringm_strReceive;CMSCommm_Com;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCommWizardDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CCommWizardDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnReceive();afx_msg void OnSend();afx_msg void OnSettings();afx_msg void OnSelchangeType();afx_msg void OnClear();afx_msg void OnOnCommCommctrl();afx_msg void OnManualsend();afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnCancelHotKey();DECLARE_EVENTSINK_MAP()//}}AFX_MSGDECLARE_MESSAGE_MAP()public:afx_msg void OnEnChangeEditReceive();};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_COMMWIZARDDLG_H__7AA90EC4_0429_4FD9_8932_F02710DFFDC7__INCLUDED_)


 

原创粉丝点击