#if !defined(AFX_PASSWORDEDIT_H__3F7BD24B_4C2C_45D3_B048_1FA7C12CD111__INCLUDED_)
#define AFX_PASSWORDEDIT_H__3F7BD24B_4C2C_45D3_B048_1FA7C12CD111__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// PasswordEdit.h : header file
//
/
// CPasswordEdit window
class CPasswordEdit : public CEdit
{
protected:
CString szEditString;
TCHAR szPasswordChar;
public:
TCHAR GetPasswordChar() const;
void SetPasswordChar( TCHAR ch );
// Construction
public:
CPasswordEdit();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPasswordEdit)
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CPasswordEdit();
// Generated message map functions
protected:
//{{AFX_MSG(CPasswordEdit)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_PASSWORDEDIT_H__3F7BD24B_4C2C_45D3_B048_1FA7C12CD111__INCLUDED_)
// PasswordEdit.cpp : implementation file
//
#include "stdafx.h"
#include "PasswordEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CPasswordEdit
CPasswordEdit::CPasswordEdit() : szPasswordChar(_T('*'))
{
}
CPasswordEdit::~CPasswordEdit()
{
}
TCHAR CPasswordEdit::GetPasswordChar() const
{
return szPasswordChar;
}
void CPasswordEdit::SetPasswordChar( TCHAR ch )
{
szPasswordChar = ch;
}
BEGIN_MESSAGE_MAP(CPasswordEdit, CEdit)
//{{AFX_MSG_MAP(CPasswordEdit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CPasswordEdit message handlers
LRESULT CPasswordEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
case(WM_KEYDOWN):
{
switch(wParam)
{
case(VK_DELETE):
{
int nStart=-1, nEnd=-1;
GetSel(nStart, nEnd);
szEditString.Delete(nStart, max(1, nEnd-nStart));
TRACE(_T("%s\n"), szEditString);
break;
}
default:
{
break;
}
}
break;
}
case(WM_CHAR):
{
int nStart=-1, nEnd=-1;
GetSel(nStart, nEnd);
switch(wParam)
{
case(VK_BACK): //back space
{
if(nStart==0 && nEnd==0)
break;
szEditString.Delete((nEnd > nStart)? nStart : nStart-1,
max(1, nEnd - nStart));
break;
}
case(VK_DELETE)://delte
{
if(nStart < szEditString.GetLength()-1)
{
szEditString.Delete(nStart+1, 1);
}
break;
}
default:
{
if(_istprint(wParam))
{
if(nEnd > nStart)
{
szEditString.Delete(nStart, nEnd - nStart);
}
szEditString.Insert(nStart, (TCHAR)wParam);
wParam = GetPasswordChar(); //
}
else
{
return 0;
}
break;
}
}
TRACE(_T("%s\n"), szEditString);
break;
}
case(WM_SETTEXT):
{
szEditString = (LPCTSTR)lParam;
int iMaxLen = szEditString.GetLength();
static CString szShowString;
szShowString.Empty();
for(int i=0; i<iMaxLen; i++)
szShowString += GetPasswordChar();
lParam = (LPARAM)(LPCTSTR)szShowString;
break;
}
case(WM_GETTEXT):
{
int iMaxLen = min(wParam-1, _tcslen(szEditString));
LPTSTR lpBuffer = (LPTSTR)lParam;
for(int i=0; i<iMaxLen; i++)
*lpBuffer++ = szEditString[i];
*lpBuffer = _T('\0');
break;
}
case(WM_PASTE):
{
CString szPasteStr;
if(OpenClipboard())
{
if(IsClipboardFormatAvailable(CF_TEXT)) //ANSI
{
HANDLE hGlobal = GetClipboardData(CF_TEXT);
LPCSTR lpStr = (LPCSTR)GlobalLock(hGlobal);
{
#if (defined UNICODE) || (defined _UNICODE)
LPWSTR wcharBuff = NULL;
int ccwcharLen = 0;
MultiByteToWideChar(CP_ACP, 0, lpStr, -1, NULL, &ccwcharLen);
wcharBuff = new WCHAR[ccwcharLen + 1];
MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wcharBuff, &ccwcharLen);
wcharBuff[ccwcharLen] = 0;
szPasteStr = wcharBuff;
#else
szPasteStr = lpStr;
#endif
}
GlobalUnlock(hGlobal);
}
else if(IsClipboardFormatAvailable(CF_UNICODETEXT)) //UNICODE
{
HANDLE hGlobal = GetClipboardData(CF_TEXT);
LPCWSTR lpStr = (LPCWSTR)GlobalLock(hGlobal);
{
#if (defined UNICODE) || (defined _UNICODE)
szPasteStr = lpStr;
#else
LPSTR charBuff = NULL;
int cccharLen = 0;
WideCharToMultiByte(CP_ACP, 0, lpStr, -1, NULL, 0, NULL, NULL);
charBuff = new CHAR[cccharLen + 1];
WideCharToMultiByte(CP_ACP, 0, lpStr, -1, charBuff, cccharLen, NULL, NULL);
charBuff[cccharLen] = 0;
szPasteStr = charBuff;
#endif
}
GlobalUnlock(hGlobal);
}
CloseClipboard();
}
if(!szPasteStr.IsEmpty())
{
int iMaxLen = szPasteStr.GetLength();
for(int i=0; i<iMaxLen; i++)
PostMessage(WM_CHAR, szPasteStr[i], 0);
}
return 0;
}
default:
{
break;
}
}
return CEdit::WindowProc(message, wParam, lParam);
}