从CEdit派生一个新类模拟Edit的ES_PASSWORD风格

#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);
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值