Скачиваний:
29
Добавлен:
01.05.2014
Размер:
6.7 Кб
Скачать
// PolibiyDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Polibiy.h"
#include "PolibiyDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CPolibiyDlg dialog

CPolibiyDlg::CPolibiyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPolibiyDlg::IDD, pParent)
   , table()
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPolibiyDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_OUTPUT, outputEdit);
   DDX_Control(pDX, IDC_LATIN, isLatin);
   DDX_Control(pDX, IDC_CYRILLIC, isCyrillic);
   DDX_Control(pDX, IDC_ENCRYPT, isEncryption);
   DDX_Control(pDX, IDC_DECRYPT, isDecryption);
   DDX_Control(pDX, IDC_INPUT, inputEdit);
}

BEGIN_MESSAGE_MAP(CPolibiyDlg, CDialog)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
   ON_WM_DRAWITEM()
   ON_BN_CLICKED(IDC_LATIN, &CPolibiyDlg::OnBnClickedLatin)
   ON_BN_CLICKED(IDC_ENCRYPT, &CPolibiyDlg::OnBnClickedEncrypt)
   ON_BN_CLICKED(IDC_CYRILLIC, &CPolibiyDlg::OnBnClickedCyrillic)
   ON_BN_CLICKED(IDC_DECRYPT, &CPolibiyDlg::OnBnClickedDecrypt)
   ON_EN_CHANGE(IDC_INPUT, &CPolibiyDlg::OnEnChangeInput)
END_MESSAGE_MAP()


// CPolibiyDlg message handlers

BOOL CPolibiyDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
   table.Create(NULL, SS_OWNERDRAW, CRect(180, 20, 330, 160), this);
   table.ShowWindow(SW_SHOWNORMAL);
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here
   table.SetRowHeight(20);
   int h = table.SetRowNumber(6);
   table.SetColWidth(35);
   int w = table.SetColNumber(5);
   table.MoveWindow(180, 20, w, h);
   OnBnClickedLatin();
   isEncryption.SetCheck(true);
   latinAlphabet = _T("ABCDEFGHIKLMNOPQRSTUVWXYZ");
   cyrillicAlphabet = _T("АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЭЮЯ");
   cyrillicAlphabetLower = _T("абвгдежзиклмнопрстуфхцчшщьыэюя");
   CString str;
   for (int i=0; i<25; i++)
   {
      str.FormatMessage(_T("%1!d!"), (i/5+1)*10+i%5+1);
      latinForward.SetAt(latinAlphabet[i], str);
   } 
   str = _T("24");
   latinForward.SetAt('J', str);
   for (int i=0; i<30; i++)
   {
      str.FormatMessage(_T("%1!d!"), (i/5+1)*10+i%5+1);
      cyrillicForward.SetAt(cyrillicAlphabet[i], str);
	  cyrillicForward.SetAt(cyrillicAlphabetLower[i], str);
   }
   str = _T("21");
   cyrillicForward.SetAt('Ё', str);
   cyrillicForward.SetAt('ё', str);
   str = _T("24");
   cyrillicForward.SetAt('Й', str);
   cyrillicForward.SetAt('й', str);
   str = _T("61");
   cyrillicForward.SetAt('Ъ', str);
   cyrillicForward.SetAt('ъ', str);
   latinBackward.resize(5);
   for (int i=0; i<5; i++)
   {
	   latinBackward.at(i).resize(5);
	   for (int j=0; j<5; j++) latinBackward.at(i).at(j) = latinAlphabet[i*5+j];
   }
   cyrillicBackward.resize(6);
   for (int i=0; i<6; i++)
   {
	   cyrillicBackward.at(i).resize(5);
	   for (int j=0; j<5; j++) 
		   cyrillicBackward.at(i).at(j) = cyrillicAlphabet[i*5+j];
   }
	return TRUE;  // return TRUE  unless you set the focus to a control
}


void CPolibiyDlg::OnPaint()
{
	CDialog::OnPaint();
}


void CPolibiyDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
   table.DrawItem(lpDrawItemStruct);

   //CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CPolibiyDlg::ConfigLatinTable()
{
   table.SetRowNumber(5);
   latinAlphabet = _T("ABCDEFGHIKLMNOPQRSTUVWXYZ");
   for (int i=0; i<25; i++)
      table.SetItemText(i/5+1, i%5+1, latinAlphabet.Mid(i, 1));
   table.SetItemText(2, 4, _T("IJ"));
}

void CPolibiyDlg::ConfigCyrillicTable()
{
   table.SetRowNumber(6);
   cyrillicAlphabet = _T("АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЭЮЯ");
   for (int i=0; i<30; i++)
      table.SetItemText(i/5+1, i%5+1, cyrillicAlphabet.Mid(i, 1));
   table.SetItemText(2, 1, _T("ЕЁ"));
   table.SetItemText(2, 4, _T("ИЙ"));
   table.SetItemText(6, 1, _T("ЬЪ"));
}

CString CPolibiyDlg::Encrypt(const CString &Text, 
                             const CMap<wchar_t,wchar_t,CString,CString> &map)
{
   CString res = _T("");
   CString temp;
   for (int i=0; i<Text.GetLength(); i++)
   {
      if (map.Lookup(Text[i], temp)) res += temp;
      else res += Text[i];
   }
   return res;
}

CString CPolibiyDlg::Decrypt(const CString &CryptText, 
							 const vector <vector <wchar_t> > &Table)
{
   CString res = _T("");
   int rows = Table.size();
   int cols = Table.at(0).size();
   int curRow, curCol;
   int symbolRecognized = 0;
   int pos = 0;
   while (pos < CryptText.GetLength())
   {
	   symbolRecognized = 0;
	   if (swscanf_s(CryptText.Mid(pos, 1).GetBuffer(),_T("%d"),&curRow)==1)
	   {
		   if (curRow > 0 && curRow <= rows)
		   {
			   if (swscanf_s(CryptText.Mid(pos+1, 1).GetBuffer(),_T("%d"),&curCol)==1)
			   {
				   if (curCol > 0 && curCol <= cols)
				   {
					   res += Table.at(curRow-1).at(curCol-1);
					   symbolRecognized = 1;
				   }
			   }
		   }
	   }
	   if (!symbolRecognized)
	   {
		   res += CryptText.Mid(pos, 1);
		   pos++;
	   }
	   else pos+=2;
   }
   return res;
}

void CPolibiyDlg::OnBnClickedLatin()
{
   if (isLatin.GetCheck()==BST_UNCHECKED)
   {
      isLatin.SetCheck(BST_CHECKED);
      isCyrillic.SetCheck(BST_UNCHECKED);
      ConfigLatinTable();
      Invalidate();
   }
}

void CPolibiyDlg::OnBnClickedCyrillic()
{
   if (isCyrillic.GetCheck()==BST_UNCHECKED)
   {
      isCyrillic.SetCheck(BST_CHECKED);
      isLatin.SetCheck(BST_UNCHECKED);
      ConfigCyrillicTable();
      Invalidate();
   }
}

void CPolibiyDlg::OnBnClickedEncrypt()
{
   if (isEncryption.GetCheck()==BST_UNCHECKED)
   {
      isEncryption.SetCheck(BST_CHECKED);
      isDecryption.SetCheck(BST_UNCHECKED);
	   inputEdit.SetWindowText(NULL);
	   outputEdit.SetWindowText(NULL);
   }
}

void CPolibiyDlg::OnBnClickedDecrypt()
{
   if (isDecryption.GetCheck()==BST_UNCHECKED)
   {
      isDecryption.SetCheck(BST_CHECKED);
      isEncryption.SetCheck(BST_UNCHECKED);
	   inputEdit.SetWindowText(NULL);
	   outputEdit.SetWindowText(NULL);
   }
}

void CPolibiyDlg::OnEnChangeInput()
{
   CString temp;
   inputEdit.GetWindowTextW(temp);
   if (isLatin.GetCheck()==BST_CHECKED)
   {
      if (isEncryption.GetCheck()==BST_CHECKED)
		  outputEdit.SetWindowTextW(Encrypt(temp.MakeUpper(), latinForward));
      else outputEdit.SetWindowTextW(Decrypt(temp, latinBackward));
   }
   else
   {
      if (isEncryption.GetCheck()==BST_CHECKED)
         outputEdit.SetWindowTextW(Encrypt(temp.MakeUpper(), cyrillicForward));
      else outputEdit.SetWindowTextW(Decrypt(temp, cyrillicBackward));
   }
}
Соседние файлы в папке Polibiy