主要要重寫哪些函數﹐給點意見
解决方案 »
- 打开一个对话框,再关闭该对话框,用任务管理器观察GDI对象数,发现每次必增加4。
- 求一个C++项目源码,很简单的
- 又杯具了,无语的静态链接库。Directx的链接库
- VC++读取一行的几百兆的计事本数据
- CListCtrl 添加一个复选框 怎么使得添加到第二列 或者其它列?
- 关于CreateFile函数的用法
- 初学问题100分:关于static控件
- CRecordSet::GetFieldValue()调用时出错“无效的描述符索引”
- Windows 2000的一个小问题
- 各位:你们是怎样调试网络程序的?我感觉自己象纺织工一样,来回在两台机子之间穿梭
- 请问这段代码是什么意思?
- 在IE中,ActiveX控件可以打开本地文件?控件是签名过的。
{
public:
NewMaskEdit();
virtual ~NewMaskEdit(); void SetWindowText(LPCTSTR lpszString); void setText(LPCTSTR pszText);
CString getText(); void setMask(LPCTSTR pszMask, char cPlaceHolder = '_');
CString getMask(); //{{AFX_VIRTUAL(NewMaskEdit)
//}}AFX_VIRTUALprotected: char m_cPlaceHolder;
CString m_strMaskText; CString m_strSaveText; bool m_bLastKeyWasDelete;
bool m_bLastKeyWasBackspace; bool isMaskChar(int nPos); int gotoNextEntryChar(int nPos); bool getReplacementChar(int nPos, char cWant, char& cGet); //{{AFX_MSG(NewMaskEdit)
afx_msg void OnUpdate();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG DECLARE_MESSAGE_MAP()
};inline CString NewMaskEdit::getMask()
{
return m_strMaskText;
}
//#include "stdafx.h"
#include "NewMaskEdit.h"#include <ctype.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifNewMaskEdit::NewMaskEdit()
{
m_bLastKeyWasDelete = false;
m_bLastKeyWasBackspace = false; m_cPlaceHolder = '_';
}NewMaskEdit::~NewMaskEdit()
{
}void NewMaskEdit::setMask(LPCTSTR pszMask, char cPlaceHolder)
{
m_strMaskText = pszMask; m_strSaveText.Empty(); int nIndex = 0;
while (nIndex < m_strMaskText.GetLength())
{
if (isMaskChar(nIndex))
m_strSaveText += m_strMaskText[nIndex];
else
m_strSaveText += m_cPlaceHolder; nIndex++;
} CWnd::SetWindowText(m_strSaveText);
}void NewMaskEdit::SetWindowText(LPCTSTR pszText)
{
setText(pszText);
}void NewMaskEdit::setText(LPCTSTR pszText)
{
CString strText(pszText); m_strSaveText.Empty(); int nMaskIndex = 0;
int nTextIndex = 0; while (nMaskIndex < m_strMaskText.GetLength())
{
if (!isMaskChar(nMaskIndex))
{
if (nTextIndex < strText.GetLength())
m_strSaveText += strText[nTextIndex++];
else
m_strSaveText += m_cPlaceHolder;
}
else
m_strSaveText += m_strMaskText[nMaskIndex]; nMaskIndex++;
} CWnd::SetWindowText(m_strSaveText);
}CString NewMaskEdit::getText()
{
CString strText; int nMaskIndex = 0;
while (nMaskIndex < m_strMaskText.GetLength())
{
if (!isMaskChar(nMaskIndex))
strText += m_strSaveText[nMaskIndex]; nMaskIndex++;
}
return strText;
}
BEGIN_MESSAGE_MAP(NewMaskEdit, CEdit)
//{{AFX_MSG_MAP(NewMaskEdit)
ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// NewMaskEdit message handlersbool NewMaskEdit::isMaskChar(int nPos)
{
ASSERT(nPos < m_strMaskText.GetLength()); return (m_strMaskText[nPos] != '#' &&
m_strMaskText[nPos] != '?'); // Add new masks as needed
}bool NewMaskEdit::getReplacementChar(int nPos, char cWant, char& cGet)
{
if (nPos >= m_strMaskText.GetLength())
return false; switch (m_strMaskText[nPos])
{
case '#':
if (0 == isdigit(cWant))
return false; cGet = cWant;
break; case '?':
if (0 == isalpha(cWant))
return false; cGet = cWant;
break; // Add new masks as needed default:
cGet = m_strMaskText[nPos];
break;
}
return true;
}int NewMaskEdit::gotoNextEntryChar(int nPos)
{
if (m_bLastKeyWasBackspace)
{
nPos--; while (nPos >= 0 && isMaskChar(nPos))
nPos--; nPos++;
}
else
{
while (nPos < m_strMaskText.GetLength() && isMaskChar(nPos))
nPos++;
}
return nPos;
}void NewMaskEdit::OnUpdate()
{
int nStart, nEnd;
GetSel(nStart, nEnd); CString strEditText;
GetWindowText(strEditText); if (strEditText == m_strSaveText)
return; if (m_bLastKeyWasBackspace)
{
m_strSaveText.SetAt(nStart, isMaskChar(nStart) ? m_strMaskText[nStart] : m_cPlaceHolder); CWnd::SetWindowText(m_strSaveText);
int nNext = gotoNextEntryChar(nStart);
SetSel(nNext, nNext);
}
else if (m_bLastKeyWasDelete)
{
m_strSaveText.SetAt(nStart, isMaskChar(nStart) ? m_strMaskText[nStart] : m_cPlaceHolder); CWnd::SetWindowText(m_strSaveText);
int nNext = gotoNextEntryChar(nStart + 1);
SetSel(nNext, nNext);
}
else
{
if (nStart - 1 < 0)
return; char cWanted = strEditText[nStart - 1]; char cReplace = 0; if (getReplacementChar(nStart - 1, cWanted, cReplace))
{
if (m_strSaveText.GetLength() < nStart)
m_strSaveText.GetBufferSetLength(nStart); m_strSaveText.SetAt(nStart - 1, cReplace);
m_strSaveText.ReleaseBuffer();
} CWnd::SetWindowText(m_strSaveText);
int nNext = gotoNextEntryChar(nStart);
SetSel(nNext, nNext);
}
}void NewMaskEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
m_bLastKeyWasDelete = (VK_DELETE == nChar);
m_bLastKeyWasBackspace = (VK_BACK == nChar);
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}