MFC 求帮助

独自等待945 2017-08-03 03:52:34
在MFC中,我需要在第一列某一行(24行)输入15位的字母和数值组成的字符串,然后和之前的其他行里面的数据进行比较,如果数据相等提示错误,如果不等而且是16位的数字在进行其他操作,但是我这边程序我即使输入15位的数字后还是报错,有没有大神指导下。
const DWORD MyCodeGroup[24] = {IDC_Code1,IDC_Code2,IDC_Code3,IDC_Code4,IDC_Code5,IDC_Code6,IDC_Code7,IDC_Code8,IDC_Code9,IDC_Code10,IDC_Code11,IDC_Code12,IDC_Code13,IDC_Code14,IDC_Code15,IDC_Code16,IDC_Code17,IDC_Code18,IDC_Code19,IDC_Code20,IDC_Code21,IDC_Code22,IDC_Code23,IDC_Code24};

BOOL CsolderpasteDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN/*VK_SPACE*/ )
{
for(int i=0;i<24;i++)
{
GetFocus()->GetDlgCtrlID()==MyCodeGroup[i];
sizeof(m_Code[i]);
int nRepeatCount = 0;
for (int j = 0; j <24; j++)
{
if (m_Code[j] ==m_Code[i])
{
nRepeatCount++;
}
}
//if(GetFocus()->GetDlgCtrlID()==MyCodeGroup[i])
if(sizeof(m_Code[i])==16&&nRepeatCount == 1)
{ UpdateData(TRUE);
SYSTEMTIME st;
GetLocalTime(&st);
m_STime[i].Format(_T("%4d-%2d-%2d %2d:%2d:%2d"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
m_TTime[i].Format(_T("%4d-%2d-%2d %2d:%2d:%2d"),st.wYear,st.wMonth,st.wDay,st.wHour+4,st.wMinute,st.wSecond);
UpdateData(FALSE);
int ret2 = ((CEdit*)GetDlgItem(MyCodeGroup[i]))->SetReadOnly(TRUE);
int ret1 = ((CEdit*)GetDlgItem(MySTIMEGroup[i]))->SetReadOnly(TRUE);
int ret0 = ((CEdit*)GetDlgItem(MyTTIMEGroup[i]))->SetReadOnly(TRUE);
GetNextDlgTabItem(GetFocus())->SetFocus();
break;
}
else
{
AfxMessageBox(_T("请确认输入的数值是否有误!"));
break;
}
//return TRUE;
}

}
return CDialogEx::PreTranslateMessage(pMsg);
}
...全文
135 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
独自等待945 2017-08-04
  • 打赏
  • 举报
回复
引用 12 楼 name_zhou 的回复:
if(sizeof(m_Code[i])==16&&nRepeatCount == 1) 如果是判断输入长度的话,不应该是用sizeof,应该m_Code的类型是CString,可以用CString的GetLength()方法
if(m_Code[i].GetLength()==16&&nRepeatCount == 1) 改为GetLength还是 不行 if(m_Code[i].GetLength()==16&&nRepeatCount == 1) 好心累。新手哪里都碰壁
name_zhou 2017-08-04
  • 打赏
  • 举报
回复
if(sizeof(m_Code[i])==16&&nRepeatCount == 1) 如果是判断输入长度的话,不应该是用sizeof,应该m_Code的类型是CString,可以用CString的GetLength()方法
独自等待945 2017-08-04
  • 打赏
  • 举报
回复
但是我光标是只要按回车就直接
引用 10 楼 zgl7903 的回复:
重载OnCommand, 处理 EN_KILLFOCUS

BOOL CDlg3Dlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{
  // TODO: Add your specialized code here and/or call the base class
  UINT uNotify = HIWORD(wParam);
  UINT uID = LOWORD(wParam);
  
  if(uNotify == EN_KILLFOCUS)
  {
    for(int i=0; i<_countof(uIDCCode); i++)
    {
      if(uID != uIDCCode[i])
        continue;
      
      CEdit *pEdit = (CEdit *)GetDlgItem(uID);  
      if(pEdit == NULL)
        continue;
      
      CString szItem;
      pEdit->GetWindowText(szItem);
      //添加判断和处理
      
    }
  }
  
  return CDialog::OnCommand(wParam, lParam);
}
还是不行
zgl7903 2017-08-04
  • 打赏
  • 举报
回复
重载OnCommand, 处理 EN_KILLFOCUS

BOOL CDlg3Dlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{
  // TODO: Add your specialized code here and/or call the base class
  UINT uNotify = HIWORD(wParam);
  UINT uID = LOWORD(wParam);
  
  if(uNotify == EN_KILLFOCUS)
  {
    for(int i=0; i<_countof(uIDCCode); i++)
    {
      if(uID != uIDCCode[i])
        continue;
      
      CEdit *pEdit = (CEdit *)GetDlgItem(uID);  
      if(pEdit == NULL)
        continue;
      
      CString szItem;
      pEdit->GetWindowText(szItem);
      //添加判断和处理
      
    }
  }
  
  return CDialog::OnCommand(wParam, lParam);
}
独自等待945 2017-08-04
  • 打赏
  • 举报
回复
[quote=引用 8 楼 zgl7903 的回复:] 用个循环是不是更简单些
static const UINT uIDCCode[] =
{
  IDC_Code1, IDC_Code2, xxxxx
};
for(int i=0; i<min(_countof(uIDCCode), _countof(m_Code)); i++)
{
  DDX_Text(pDX, uIDCCode[i], m_Code[i]); 
}
[/quote 好的。谢谢。那请问怎么实现我这24个控件输入的值的判定呢?我需要输入一个控件时就去比较是否跟之前的重复,而且如果输入的值只能是15位的数值和字母的组合?这个要怎么设计呢?
zgl7903 2017-08-04
  • 打赏
  • 举报
回复
用个循环是不是更简单些
static const UINT uIDCCode[] =
{
  IDC_Code1, IDC_Code2, xxxxx
};
for(int i=0; i<min(_countof(uIDCCode), _countof(m_Code)); i++)
{
  DDX_Text(pDX, uIDCCode[i], m_Code[i]); 
}
独自等待945 2017-08-04
  • 打赏
  • 举报
回复
DDX_Text(pDX, IDC_Code1, m_Code[0]); DDX_Text(pDX, IDC_Code11, m_Code[10]); DDX_Text(pDX, IDC_Code12, m_Code[11]); DDX_Text(pDX, IDC_Code13, m_Code[12]); DDX_Text(pDX, IDC_Code14, m_Code[13]); DDX_Text(pDX, IDC_Code15, m_Code[14]); DDX_Text(pDX, IDC_Code16, m_Code[15]); DDX_Text(pDX, IDC_Code17, m_Code[16]); DDX_Text(pDX, IDC_Code18, m_Code[17]); DDX_Text(pDX, IDC_Code19, m_Code[18]); DDX_Text(pDX, IDC_Code10, m_Code[9]); DDX_Text(pDX, IDC_Code2, m_Code[1]); DDX_Text(pDX, IDC_Code20, m_Code[19]); DDX_Text(pDX, IDC_Code21, m_Code[20]); DDX_Text(pDX, IDC_Code22, m_Code[21]); DDX_Text(pDX, IDC_Code23, m_Code[22]); DDX_Text(pDX, IDC_Code24, m_Code[23]); DDX_Text(pDX, IDC_Code3, m_Code[2]); DDX_Text(pDX, IDC_Code4, m_Code[3]); DDX_Text(pDX, IDC_Code5, m_Code[4]); DDX_Text(pDX, IDC_Code6, m_Code[5]); DDX_Text(pDX, IDC_Code7, m_Code[6]); DDX_Text(pDX, IDC_Code8, m_Code[7]); DDX_Text(pDX, IDC_Code9, m_Code[8]);
独自等待945 2017-08-04
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
什么叫 (sizeof(m_Code[i])==16 ? m_Code 定义 ?
m_code【i】我是定义24控件的关联变量,我是新手不知道这样可以吗?谢谢指导 DDX_Text(pDX, IDC_Code1, m_Code[0]); DDX_Text(pDX, IDC_Code11, m_Code[10]); DDX_Text(pDX, IDC_Code12, m_Code[11]); DDX_Text(pDX, IDC_Code13, m_Code[12]); 。。。。。。。。
name_zhou 2017-08-04
  • 打赏
  • 举报
回复
引用 13 楼 qq_37111420 的回复:
[quote=引用 12 楼 name_zhou 的回复:] if(sizeof(m_Code[i])==16&&nRepeatCount == 1) 如果是判断输入长度的话,不应该是用sizeof,应该m_Code的类型是CString,可以用CString的GetLength()方法
if(m_Code[i].GetLength()==16&&nRepeatCount == 1) 改为GetLength还是 不行 if(m_Code[i].GetLength()==16&&nRepeatCount == 1) 好心累。新手哪里都碰壁[/quote] m_Code[i]的数据有更新吗?要先UpdateData(TRUE)更新成当前输入的数据,不然获取到的是旧的数据
schlafenhamster 2017-08-03
  • 打赏
  • 举报
回复
什么叫 (sizeof(m_Code[i])==16 ? m_Code 定义 ?
独自等待945 2017-08-03
  • 打赏
  • 举报
回复
if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN/*VK_SPACE*/ ) { for(int i=0;i<24;i++) { if(GetFocus()->GetDlgCtrlID()==MyCodeGroup[i]) { sizeof(m_Code[i]); int nRepeatCount = 0; for (int j = 0; j <24; j++) { if (m_Code[j] ==m_Code[i]) { nRepeatCount++; } } //if(GetFocus()->GetDlgCtrlID()==MyCodeGroup[i]) if(sizeof(m_Code[i])==16&&nRepeatCount == 1) { UpdateData(TRUE); SYSTEMTIME st; GetLocalTime(&st); m_STime[i].Format(_T("%4d-%2d-%2d %2d:%2d:%2d"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); m_TTime[i].Format(_T("%4d-%2d-%2d %2d:%2d:%2d"),st.wYear,st.wMonth,st.wDay,st.wHour+4,st.wMinute,st.wSecond); UpdateData(FALSE); int ret2 = ((CEdit*)GetDlgItem(MyCodeGroup[i]))->SetReadOnly(TRUE); int ret1 = ((CEdit*)GetDlgItem(MySTIMEGroup[i]))->SetReadOnly(TRUE); int ret0 = ((CEdit*)GetDlgItem(MyTTIMEGroup[i]))->SetReadOnly(TRUE); GetNextDlgTabItem(GetFocus())->SetFocus(); break; } else { AfxMessageBox(_T("请确认输入的数值是否有误!")); break; } } } } 我把程序改成这样了还是一样呢?有没有大神指导下我
schlafenhamster 2017-08-03
  • 打赏
  • 举报
回复
if(GetFocus()->GetDlgCtrlID()==MyCodeGroup[i]) dosomething;
独自等待945 2017-08-03
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
GetFocus()->GetDlgCtrlID()==MyCodeGroup[i]; ??
这步我是想说确认下我现在聚焦在哪个控件上,现在是在哪个控件上输入的 。
schlafenhamster 2017-08-03
  • 打赏
  • 举报
回复
GetFocus()->GetDlgCtrlID()==MyCodeGroup[i]; ??

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧