C++ MFC实现基于RFID读写器的上位机软件
运行和测试环境
Windows 10
Visual Studio 2013
msado15.dll(工程自带)
ZM124U.dll(工程自带)
RFID读写器ZM124U
理论支持全部Win32运行环境
参考内容
代码实现
软件框架
在消息响应函数OnInitDialog()中完成整个框架的内容设置,包括插入Tab选项卡标签,关联对话框,调整大小和设置默认选项卡
BOOL CUpperMonitorDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
// 1. 插入Tab选项卡标签
TCITEM tcItemDebugger;
tcItemDebugger.mask = TCIF_TEXT;
tcItemDebugger.pszText = _T("调试助手");
m_MainMenu.InsertItem(0, &tcItemDebugger);
TCITEM tcItemAppdev;
tcItemAppdev.mask = TCIF_TEXT;
tcItemAppdev.pszText = _T("应用开发");
m_MainMenu.InsertItem(1, &tcItemAppdev);
// 2. 关联对话框,将TAB控件设为选项卡对应对话框的父窗口
m_MenuDebugger.Create(IDD_DEBUGGER, GetDlgItem(IDC_TAB));
m_MenuAppdev.Create(IDD_APPDEV, GetDlgItem(IDC_TAB));
// 3. 获取TAB控件客户区大小,用于调整选项卡对话框在父窗口中的位置
CRect rect;
m_MainMenu.GetClientRect(&rect);
rect.top += 22;
rect.right -= 3;
rect.bottom -= 2;
rect.left += 1;
// 4. 设置子对话框尺寸并移动到指定位置
m_MenuDebugger.MoveWindow(&rect);
m_MenuAppdev.MoveWindow(&rect);
// 5. 设置默认选项卡,对选项卡对话框进行隐藏和显示
m_MenuDebugger.ShowWindow(SW_SHOWNORMAL);
m_MenuAppdev.ShowWindow(SW_HIDE);
m_MainMenu.SetCurSel(0);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
在消息响应函数OnSelchangeTab()中完成选项卡切换,其实内容都一直存在,只是把非该选项卡的内容隐藏了,把该选项卡的内容显示出来,仅此而已
void CUpperMonitorDlg::OnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult) {
*pResult = 0;
// 获取当前点击选项卡标签下标
int cursel = m_MainMenu.GetCurSel();
// 根据下标将相应的对话框显示,其余隐藏
switch(cursel) {
case 0:
m_MenuDebugger.ShowWindow(SW_SHOWNORMAL);
m_MenuAppdev.ShowWindow(SW_HIDE);
break;
case 1:
m_MenuDebugger.ShowWindow(SW_HIDE);
m_MenuAppdev.ShowWindow(SW_SHOWNORMAL);
break;
default:
break;
}
}
调用ZM12xUE API
首先需要在工程中include相应的文件,就是已经封装好的ZM124U.lib和ZM124U.h
#pragma comment(lib, "./libs/ZM124U.lib")
#include "./libs/ZM124U.h"
然后就可以当作已经实现的函数一样,直接调用即可。库函数的传入参数和返回值全部都可以在上面的参考文件中找到,返回值一般使用IFD_OK足够了。下面以打开设备为例,展示一下如何使用
void CDebugger::OnBnClickedBtnopendevice() {
if(IDD_PowerOn() == IFD_OK) {
// 更新状态栏,成功
isDeviceOpen = true;
((CEdit*)GetDlgItem(IDC_EDITSTATUS))->SetWindowTextW(_T("开启设备成功"));
}
else {
// 更新状态栏,失败
isDeviceOpen = false;
((CEdit*)GetDlgItem(IDC_EDITSTATUS))->SetWindowTextW(_T("开启设备失败"));
}
}
类型转换
unsigned char转CString
这部分和printf函数相似,就是使用CString.Format()函数把它转换为相应的内容,然后拼接到最终的CString对象中。大多数类型转CString都可以使用这种方法,说明CString封装得好。CString.Format()函数的第一个参数的写法类似于printf的输出时的写法。详看MSDN上面的说明。
CString uid, temp;
unsigned char buff[1024];
uid.Empty();
for(int i = 0; i < buff_len; i++) {
// 将获得的UID数据(1 byte)转为16进制
temp.Format(_T("%02x"), buff[i]);
uid += temp;
}
CString转int / long
前提CString的内容是数字。使用函数_ttoi(CString) | _ttol(CString)即可,如需转unsigned char类型,再使用强制转换类型即可
CString mecNum;
int mecNumInt = _ttoi(mecNum);
long mecNumLong = _ttol(mecLong);