CEdit只允许十六进制的数据输入

网上说的大部分方法是重载CEdit,重写OnChar函数,在历遍进行数据判断,如果只实现这一个功能完全不必重载CEdit,只需重写PreTranslateMessage函数即可,函数添加方法,选中对话框类,右键属性在重载的函数中找。实现方法如下:

BOOL CWindowsRouterDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_CHAR)
{

//检查控件是否是当前焦点
if(GetDlgItem(IDC_EDIT6)==GetFocus()||
GetDlgItem(IDC_EDIT7)==GetFocus())
{

//检查Ctrl组合键
short nks = GetKeyState(VK_CONTROL);


if (nks & 0x8000)
{
return CDialog::PreTranslateMessage(pMsg);
}

//检查输入的内容
if ((pMsg->wParam >= 0x30 && pMsg->wParam <=  0x39) ||
(pMsg->wParam  >= 'a' && pMsg->wParam  <= 'f') ||
(pMsg->wParam  >= 'A' && pMsg->wParam  <= 'F') ||
(pMsg->wParam  == 0x08) ||
(pMsg->wParam  == 0x20))
{
return CDialog::PreTranslateMessage(pMsg);

else
{
MessageBeep(-1);
pMsg->wParam=NULL;
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}

可以使用CEdit类的SetWindowText函数将十六进制格式的字符串显示到edit control上。 具体步骤如下: 1. 在对应的对话框类中定义CEdit类型的变量来操作edit control。 例如: ```c++ class CMyDialog : public CDialogEx { public: CMyDialog(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CMyDialog(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MY_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 afx_msg void OnBnClickedButtonOpen(); afx_msg void OnBnClickedButtonSend(); afx_msg void OnBnClickedButtonClear(); afx_msg LRESULT OnReceiveData(WPARAM wParam, LPARAM lParam); // 串口数据接收消息处理函数 protected: CEdit m_editReceive; // ... }; ``` 在这个例子中,可以看到定义了一个名为m_editReceive的CEdit类型的变量,用于操作接收数据edit control。 2. 接收串口数据,并转化为十六进制格式的字符串。 通常使用异步操作来接收串口数据,可以在Create函数后使用SetCommMask来设置需要的事件,如EV_RXCHAR,表示有数据接收事件。可以在OnReceiveData消息处理函数中将接收到的数据转化为十六进制格式的字符串。 这里使用一个名为HexToStr的函数来将十六进制格式的数据转化为字符串。 ```c++ LRESULT CMyDialog::OnReceiveData(WPARAM wParam, LPARAM lParam) { DWORD dwRead; BYTE szTemp[4096] = { 0 }; CString strText, strTemp; if (wParam == ID_COM_PORT) //串口事件 { if (lParam & EV_RXCHAR) //有字符接收 { if (ReadFile(m_hComm, szTemp, sizeof(szTemp), &dwRead, nullptr)) { strTemp = HexToStr(szTemp, dwRead); // 将接收到的数据转化为十六进制格式的字符串 strText = m_editReceive.GetText(); // 获取edit control的显示内容 strText += strTemp; // 将新接收到的数据添加到显示内容后面 m_editReceive.SetWindowText(strText); // 将新的显示内容设置到edit control中 } } } return 0; } ``` 3. 实现HexToStr函数。 HexToStr函数可以将字节数组转化为十六进制格式的字符串。 ```c++ CString HexToStr(BYTE* pData, DWORD dwLength) { CString strResult; for (DWORD i = 0; i < dwLength; i++) { CString strHex; strHex.Format(_T("%02X"), pData[i]); strResult += strHex + _T(" "); // 格式化为十六进制格式的字符串 } return strResult; } ``` 4. 在界面的初始化函数OnInitDialog中设置edit control的显示格式。 可以在OnInitDialog函数中使用SetLimitText设置edit control的最大字符数,使用SetReadOnly设置edit control为只读,防止用户修改。 ```c++ BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 m_editReceive.SetLimitText(10240); // 设置最大字符数 m_editReceive.SetReadOnly(TRUE); // 设置只读 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值