VS2017-VC++校验和计算小工具
運(yùn)行界面如下:
輸入格式要求:必須是ascii代表數(shù)字的字符(0-F,大小寫不限),必須成雙,可以有空格。
主要代碼:
CMFCApplicationBleApAnalogDlg::CMFCApplicationBleApAnalogDlg(CWnd* pParent /*=nullptr*/)
?? ?: CDialogEx(IDD_MFCAPPLICATIONBLEAPANALOG_DIALOG, pParent)
?? ?, m_edit1_data(_T(""))
?? ?, m_edit2_data(_T(""))
{
?? ?m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCApplicationBleApAnalogDlg::DoDataExchange(CDataExchange* pDX)
{
?? ?CDialogEx::DoDataExchange(pDX);
?? ?DDX_Text(pDX, IDC_EDIT1, m_edit1_data);
?? ?DDX_Text(pDX, IDC_EDIT2, m_edit2_data);
?? ?DDX_Control(pDX, IDC_RADIO1, m_radio1);
?? ?DDX_Control(pDX, IDC_RADIO2, m_radio2);
}
BEGIN_MESSAGE_MAP(CMFCApplicationBleApAnalogDlg, CDialogEx)
?? ?ON_WM_SYSCOMMAND()
?? ?ON_WM_PAINT()
?? ?ON_WM_QUERYDRAGICON()
?? ?ON_BN_CLICKED(IDC_CLEAR_1, &CMFCApplicationBleApAnalogDlg::OnBnClickedClear1)
?? ?ON_BN_CLICKED(IDC_COMPUTER_OK, &CMFCApplicationBleApAnalogDlg::OnBnClickedComputerOk)
?? ?ON_BN_CLICKED(IDC_CLEAR_2, &CMFCApplicationBleApAnalogDlg::OnBnClickedClear2)
END_MESSAGE_MAP()
// CMFCApplicationBleApAnalogDlg 消息處理程序
BOOL CMFCApplicationBleApAnalogDlg::OnInitDialog()
{
?? ?CDialogEx::OnInitDialog();
?? ?// 將“關(guān)于...”菜單項(xiàng)添加到系統(tǒng)菜單中。
?? ?// IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。
?? ?ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
?? ?ASSERT(IDM_ABOUTBOX < 0xF000);
?? ?CMenu* pSysMenu = GetSystemMenu(FALSE);
?? ?if (pSysMenu != nullptr)
?? ?{
?? ??? ?BOOL bNameValid;
?? ??? ?CString strAboutMenu;
?? ??? ?bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
?? ??? ?ASSERT(bNameValid);
?? ??? ?if (!strAboutMenu.IsEmpty())
?? ??? ?{
?? ??? ??? ?pSysMenu->AppendMenu(MF_SEPARATOR);
?? ??? ??? ?pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
?? ??? ?}
?? ?}
?? ?// 設(shè)置此對(duì)話框的圖標(biāo)。 ?當(dāng)應(yīng)用程序主窗口不是對(duì)話框時(shí),框架將自動(dòng)
?? ?// ?執(zhí)行此操作
?? ?SetIcon(m_hIcon, TRUE);?? ??? ??? ?// 設(shè)置大圖標(biāo)
?? ?SetIcon(m_hIcon, FALSE);?? ??? ?// 設(shè)置小圖標(biāo)
?? ?// TODO: 在此添加額外的初始化代碼
?? ?m_radio1.EnableWindow(TRUE);
?? ?m_radio2.EnableWindow(TRUE);
?? ?m_radio1.SetCheck(TRUE);
?? ?return TRUE; ?// 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE
}
void CMFCApplicationBleApAnalogDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
?? ?if ((nID & 0xFFF0) == IDM_ABOUTBOX)
?? ?{
?? ??? ?CAboutDlg dlgAbout;
?? ??? ?dlgAbout.DoModal();
?? ?}
?? ?else
?? ?{
?? ??? ?CDialogEx::OnSysCommand(nID, lParam);
?? ?}
}
// 如果向?qū)υ捒蛱砑幼钚』粹o,則需要下面的代碼
// ?來(lái)繪制該圖標(biāo)。 ?對(duì)于使用文檔/視圖模型的 MFC 應(yīng)用程序,
// ?這將由框架自動(dòng)完成。
void CMFCApplicationBleApAnalogDlg::OnPaint()
{
?? ?if (IsIconic())
?? ?{
?? ??? ?CPaintDC dc(this); // 用于繪制的設(shè)備上下文
?? ??? ?SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
?? ??? ?// 使圖標(biāo)在工作區(qū)矩形中居中
?? ??? ?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;
?? ??? ?// 繪制圖標(biāo)
?? ??? ?dc.DrawIcon(x, y, m_hIcon);
?? ?}
?? ?else
?? ?{
?? ??? ?CDialogEx::OnPaint();
?? ?}
}
//當(dāng)用戶拖動(dòng)最小化窗口時(shí)系統(tǒng)調(diào)用此函數(shù)取得光標(biāo)
//顯示。
HCURSOR CMFCApplicationBleApAnalogDlg::OnQueryDragIcon()
{
?? ?return static_cast<HCURSOR>(m_hIcon);
}
?
void CMFCApplicationBleApAnalogDlg::OnBnClickedClear1()
{
?? ?m_edit1_data.Empty();//發(fā)送后清空輸入框
?? ?UpdateData(false);//更新編輯框內(nèi)容
}
void CMFCApplicationBleApAnalogDlg::OnBnClickedComputerOk()
{
?? ?int i;
?? ?int count;
?? ?int dataLen;
?? ?CString m_SendData;
?? ?CByteArray m_Array;
?? ?unsigned char checkSum;
?? ?unsigned char dataArray[128];
?? ?unsigned char hexArray[128];
?? ?UpdateData(true);//更新變量?jī)?nèi)容
?? ?count = m_edit1_data.GetLength();
?? ?m_Array.RemoveAll();
?? ?m_Array.SetSize(count+1);
?? ?dataLen = 0;
?? ?for(i=0; i<count; i++)
?? ?{
?? ??? ?if (((m_edit1_data[i] >= '0' && m_edit1_data[i] <= '9')) ||
?? ??? ??? ?((m_edit1_data[i] >= 'A' && m_edit1_data[i] <= 'Z')) ||
?? ??? ??? ?((m_edit1_data[i] >= 'a' && m_edit1_data[i] <= 'z')))
?? ??? ?{
?? ??? ??? ?m_Array.SetAt(dataLen, m_edit1_data[i]);
?? ??? ??? ?dataLen++;
?? ??? ?}?? ??? ?
?? ?}
?? ?if(dataLen < 2)//ascii format!
?? ?{
?? ??? ?AfxMessageBox(_T("數(shù)據(jù)輸入錯(cuò)誤"));
?? ??? ?return;
?? ?}
?? ?if(dataLen % 2 == 0)
?? ?{
?? ??? ?
?? ?}
?? ?else
?? ?{
?? ??? ?AfxMessageBox(_T("數(shù)據(jù)輸入錯(cuò)誤"));
?? ??? ?return;
?? ?}
?? ?
?? ?for (i = 0; i < dataLen; i++)
?? ?{
?? ??? ?dataArray[i] = m_Array[i];
?? ?}
?? ?unsigned char hexLen = 0;
?? ?for (i = 0; i < dataLen; i += 2)
?? ?{
?? ??? ?hexArray[hexLen++] = AsciiToHex(dataArray+i);
?? ?}?? ?
?? ?//checkSum = BleGetCheckSum(hexArray +1, dataLen/2-1);
?? ?checkSum = BleGetCheckSum(hexArray + 0, dataLen / 2 - 0);
?? ?HexToAscii(checkSum, &dataArray[i]);
?? ?dataLen += 2;
?? ?m_SendData = "";
?? ?for(i=0; i<dataLen; i++)
?? ?{
?? ??? ?CString tempStr;
?? ??? ?if (i % 2 == 0 && i > 0)
?? ??? ?{
?? ??? ??? ?m_SendData = m_SendData + _T(" ");
?? ??? ?}
?? ??? ?tempStr.Format(_T("%c"), dataArray[i]);
?? ??? ?m_SendData = m_SendData + tempStr;
?? ?}
?? ?m_edit2_data = m_SendData;
?? ?UpdateData(false);//更新編輯框內(nèi)容
}
void CMFCApplicationBleApAnalogDlg::OnBnClickedClear2()
{
?? ?m_edit2_data.Empty();//發(fā)送后清空輸入框
?? ?UpdateData(false);//更新編輯框內(nèi)容
}
?
unsigned char CMFCApplicationBleApAnalogDlg::BleGetCheckSum(unsigned char *bleDataArray, unsigned int dataLen)
{
?? ?unsigned int i;
?? ?unsigned char checkSum = 0x00;
?? ?if (m_radio1.GetCheck())
?? ?{
?? ??? ?for (i = 0; i < dataLen; i++)
?? ??? ?{
?? ??? ??? ?checkSum = checkSum ^ bleDataArray[i];
?? ??? ?}
?? ?}
?? ?else
?? ?{
?? ??? ?for (i = 0; i < dataLen; i++)
?? ??? ?{
?? ??? ??? ?checkSum = checkSum + bleDataArray[i];
?? ??? ?}
?? ?}
?? ?return checkSum;
}
?
unsigned char CMFCApplicationBleApAnalogDlg::GetAscii(unsigned char halfHexValue)
{
?? ?unsigned char asciiValue;
?? ?if (halfHexValue < (9+1))
?? ?{
?? ??? ?asciiValue = 0x30 + halfHexValue;
?? ?}
?? ?else
?? ?{
?? ??? ?asciiValue = 'A' + (halfHexValue-10);
?? ?}
?? ?return asciiValue;
}
void CMFCApplicationBleApAnalogDlg::HexToAscii(unsigned char hexValue, unsigned char *ascii)
{
?? ?unsigned char high;
?? ?unsigned char low;
?? ?high?? ?= (hexValue >> 4) & 0x0F;
?? ?low?? ??? ?= (hexValue >> 0) & 0x0F;
?? ?ascii[0] = GetAscii(high);
?? ?ascii[1] = GetAscii(low);
}
?
unsigned char CMFCApplicationBleApAnalogDlg::AsciiToHalfHex(unsigned asciiByte)
{
?? ?unsigned halfHex;
?? ?if((asciiByte >= '0' && asciiByte <= '9'))
?? ?{
?? ??? ?halfHex = asciiByte-0x30;
?? ??? ?return halfHex;
?? ?}
?? ?if ((asciiByte >= 'A' && asciiByte <= 'Z'))
?? ?{
?? ??? ?halfHex = 0x0A+(asciiByte-'A');
?? ??? ?return halfHex;
?? ?}
?? ?if ((asciiByte >= 'a' && asciiByte <= 'z'))
?? ?{
?? ??? ?halfHex = 0x0A + (asciiByte - 'a');
?? ??? ?return halfHex;
?? ?}
?? ?return 0x00;
}
?
unsigned char CMFCApplicationBleApAnalogDlg::AsciiToHex(unsigned char *asciiArray)
{
?? ?unsigned halfHexHigh;
?? ?unsigned halfHexLow;
?? ?halfHexHigh = AsciiToHalfHex(asciiArray[0]);
?? ?halfHexLow?? ?= AsciiToHalfHex(asciiArray[1]);
?? ?return (halfHexHigh << 4) | halfHexLow;
}
完整工程下載地址:https://download.csdn.net/download/qinrenzhi/10915321
?
總結(jié)
以上是生活随笔為你收集整理的VS2017-VC++校验和计算小工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32下载程序时的一个奇怪现象
- 下一篇: C++操作剪贴板