如何限制MFC的EDIT控件只能粘帖数字
用MFC做了一个基本的计算器程序,运算功能实现了,但是始终无法实现“支持剪切板的复制、粘贴功能,只允许复制、粘贴数字”这个作业要求,请达人我想想办法,要给出相应的代码...
用MFC做了一个基本的计算器程序,运算功能实现了,但是始终无法实现“支持剪切板的复制、粘贴功能,只允许复制、粘贴数字”这个作业要求,请达人我想想办法,要给出相应的代码
展开
3个回答
展开全部
这是MyEdit.h文件
//////////////////////////////////////////////////////////////////////////
#if !defined(AFX_MYEDIT_H__7729332B_3168_4D56_8147_8D0FF66C4D29__INCLUDED_)
#define AFX_MYEDIT_H__7729332B_3168_4D56_8147_8D0FF66C4D29__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyEdit.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CMyEdit window
class CMyEdit : public CEdit
{
// Construction
public:
CMyEdit();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyEdit)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMyEdit();
// Generated message map functions
protected:
//{{AFX_MSG(CMyEdit)
afx_msg void OnChange();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MYEDIT_H__7729332B_3168_4D56_8147_8D0FF66C4D29__INCLUDED_)
//////////////////////////////////////////////////////////////////////////
这是MyEdit.cpp文件
//////////////////////////////////////////////////////////////////////////
// MyEdit.cpp : implementation file
//
#include "stdafx.h"
#include "MyEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyEdit
CMyEdit::CMyEdit()
{
}
CMyEdit::~CMyEdit()
{
}
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
//{{AFX_MSG_MAP(CMyEdit)
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMyEdit::OnChange()
{
CString strTemp;
GetWindowText(strTemp);
int len = strTemp.GetLength();
for (int i = 0; i < len; i ++)
{
if (strTemp.GetAt(i) < '0' || strTemp.GetAt(i) > '9')
{
if (strTemp.GetAt(i)!= '.')
{
strTemp = strTemp.Left(i);
SetWindowText(strTemp);
SetSel(i,i,TRUE);
return;
}
}
}
}
//////////////////////////////////////////////////////////////////////////
把你的Edit控件关联一个CMyEdit变量,这话你懂不?为一个控件关联变量,先关联CEdit变量,再手动把CEdit修改为CMyEdit。关联变量后会在你的对话框程序里面的DoDataExchange函数里面添加变量和控件的映射,比如 DDX_Control(pDX, IDC_EDIT1, m_qq);IDC_EDIT1控件ID,m_qq CMyEdit变量
实现原理是CMyEdit从CEdit派生出来的,它对EN_CHANGE消息进行拦截处理,就是OnChange函数,我现在编写的代码处理情况是只要不是数字,我就不让它在编辑框里,你可以自己编写特定的代码进行更好的处理,比如过滤掉字符,而不是删除全部
//////////////////////////////////////////////////////////////////////////
#if !defined(AFX_MYEDIT_H__7729332B_3168_4D56_8147_8D0FF66C4D29__INCLUDED_)
#define AFX_MYEDIT_H__7729332B_3168_4D56_8147_8D0FF66C4D29__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyEdit.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CMyEdit window
class CMyEdit : public CEdit
{
// Construction
public:
CMyEdit();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyEdit)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMyEdit();
// Generated message map functions
protected:
//{{AFX_MSG(CMyEdit)
afx_msg void OnChange();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MYEDIT_H__7729332B_3168_4D56_8147_8D0FF66C4D29__INCLUDED_)
//////////////////////////////////////////////////////////////////////////
这是MyEdit.cpp文件
//////////////////////////////////////////////////////////////////////////
// MyEdit.cpp : implementation file
//
#include "stdafx.h"
#include "MyEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyEdit
CMyEdit::CMyEdit()
{
}
CMyEdit::~CMyEdit()
{
}
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
//{{AFX_MSG_MAP(CMyEdit)
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMyEdit::OnChange()
{
CString strTemp;
GetWindowText(strTemp);
int len = strTemp.GetLength();
for (int i = 0; i < len; i ++)
{
if (strTemp.GetAt(i) < '0' || strTemp.GetAt(i) > '9')
{
if (strTemp.GetAt(i)!= '.')
{
strTemp = strTemp.Left(i);
SetWindowText(strTemp);
SetSel(i,i,TRUE);
return;
}
}
}
}
//////////////////////////////////////////////////////////////////////////
把你的Edit控件关联一个CMyEdit变量,这话你懂不?为一个控件关联变量,先关联CEdit变量,再手动把CEdit修改为CMyEdit。关联变量后会在你的对话框程序里面的DoDataExchange函数里面添加变量和控件的映射,比如 DDX_Control(pDX, IDC_EDIT1, m_qq);IDC_EDIT1控件ID,m_qq CMyEdit变量
实现原理是CMyEdit从CEdit派生出来的,它对EN_CHANGE消息进行拦截处理,就是OnChange函数,我现在编写的代码处理情况是只要不是数字,我就不让它在编辑框里,你可以自己编写特定的代码进行更好的处理,比如过滤掉字符,而不是删除全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那个控件本身就有只写数字的功能,就在属性的第二页。最左边,最下边那个就是。根本就不用代码。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
void CCListIconDlg::OnChangeEdit1()
{
CString strTemp;
CEdit* edit1 = ((CEdit*)(GetDlgItem(IDC_EDIT1)));
edit1->GetWindowText(strTemp);
int len = strTemp.GetLength();
for (int i = 0; i < len; i ++)
{
if (strTemp.GetAt(i) < '0' || strTemp.GetAt(i) > '9')
{
if (strTemp.GetAt(i)!= '.')
{
strTemp = strTemp.Left(i);
edit1->SetWindowText(strTemp);
edit1->SetSel(i,i,TRUE);
return;
}
}
}
}//不明白Hi一下
void CCListIconDlg::OnChangeEdit1()
{
CString strTemp;
CEdit* edit1 = ((CEdit*)(GetDlgItem(IDC_EDIT1)));
edit1->GetWindowText(strTemp);
int len = strTemp.GetLength();
for (int i = 0; i < len; i ++)
{
if (strTemp.GetAt(i) < '0' || strTemp.GetAt(i) > '9')
{
if (strTemp.GetAt(i)!= '.')
{
strTemp = strTemp.Left(i);
edit1->SetWindowText(strTemp);
edit1->SetSel(i,i,TRUE);
return;
}
}
}
}//不明白Hi一下
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询