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

#include "stdafx.h"
#include "Kardano.h"
#include "KardanoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif



CKardanoDlg::CKardanoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CKardanoDlg::IDD, pParent)
   , size(6)
   , table()
   , kardanoSquare()
   , rotation(1)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CKardanoDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_SIZE_SPIN, sizeSpin);
   DDX_Text(pDX, IDC_SIZE_VAL, size);
   DDV_MinMaxInt(pDX, size, 4, 16);
   DDX_Control(pDX, IDC_INPUT, input);
   DDX_Control(pDX, IDC_ENCRYPT, encryptButton);
   DDX_Control(pDX, IDC_DECRYPT, decryptButton);
   DDX_Control(pDX, IDC_REGENERATE, regenerateButton);
   DDX_Control(pDX, IDC_ROTATE, rotateButton);
   DDX_Control(pDX, IDC_EDIT1, output);
}

BEGIN_MESSAGE_MAP(CKardanoDlg, CDialog)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
   ON_NOTIFY(UDN_DELTAPOS, IDC_SIZE_SPIN, &CKardanoDlg::OnDeltaposSizeSpin)
   ON_WM_DRAWITEM()
   ON_BN_CLICKED(IDC_REGENERATE, &CKardanoDlg::OnBnClickedRegenerate)
   ON_EN_CHANGE(IDC_INPUT, &CKardanoDlg::OnEnChangeInput)
   ON_BN_CLICKED(IDC_ENCRYPT, &CKardanoDlg::OnBnClickedEncrypt)
   ON_BN_CLICKED(IDC_DECRYPT, &CKardanoDlg::OnBnClickedDecrypt)
   ON_BN_CLICKED(IDC_ROTATE, &CKardanoDlg::OnBnClickedRotate)
END_MESSAGE_MAP()


// CKardanoDlg message handlers

BOOL CKardanoDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

   OnBnClickedEncrypt();
   sizeSpin.SetRange(4, 16);
   RECT t;
   output.GetWindowRect(&t);
   tableTop = t.bottom-20;
   table.Create(NULL, SS_OWNERDRAW, CRect(20, 100, 200, 300), this);
   table.SetRowHeight(20);
   table.SetColWidth(20);
   table.SetHHeaderVisibility(false);
   table.SetVHeaderVisibility(false);
   table.ShowWindow(SW_SHOWNORMAL);
   int h = table.SetRowNumber(size);
   int w = table.SetColNumber(size);
   table.MoveWindow(23, tableTop, w, h);
   kardanoSquare.SetSize(size);
   kardanoSquare.Generate();
   UpdateTableView();

	return TRUE;  // return TRUE  unless you set the focus to a control
}

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

void CKardanoDlg::OnDeltaposSizeSpin(NMHDR *pNMHDR, LRESULT *pResult)
{
   LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
   pNMUpDown->iDelta*=2;
   int temp = pNMUpDown->iPos + pNMUpDown->iDelta;
   if (temp >= 4 && temp <= 16 && encryptButton.GetCheck()==BST_CHECKED)
   {
      size = temp;
      UpdateData(false);
      int h = table.SetRowNumber(size);
      int w = table.SetColNumber(size);
      kardanoSquare.SetSize(size);
      OnEnChangeInput();
      table.MoveWindow(23, tableTop, w, h);
      RECT windSize;
      GetWindowRect(&windSize);
      windSize.bottom = windSize.top + tableTop + 40 + h;
      MoveWindow(&windSize);
      *pResult = 0;
   }
   else *pResult = 1;
}

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

void CKardanoDlg::UpdateTableView()
{
   table.ClearHighlights();
   for (int i=0; i<size; i++)
      for (int j=0; j<size; j++)
         if (kardanoSquare.GetValue(i, j) == rotation) table.HighlightItem(i+1, j+1);
   Invalidate();
}
void CKardanoDlg::OnBnClickedRegenerate()
{
   kardanoSquare.Generate();
   OnEnChangeInput();
}

void CKardanoDlg::Encrypt(const CString &PlainText)
{
   int curRotation = 0;
   int cur = 0;
startAgain:
   curRotation++;
   for (int i=0; i<size; i++)
      for (int j=0; j<size; j++)
      {
         if (kardanoSquare.GetValue(i, j) == curRotation)
         {
            table.SetItemText(i+1, j+1, PlainText.Mid(cur, 1));
            cur++;
            if (curRotation < cur/((size*size)/4)+1) goto startAgain;
         }
      }
}

void CKardanoDlg::Decrypt(const CString &CryptText)
{
   for (int i=0; i<CryptText.GetLength(); i++)
      table.SetItemText(i/size+1, i%size+1, CryptText.Mid(i, 1));
}

void CKardanoDlg::OnEnChangeInput()
{
   CString temp;
   input.GetWindowTextW(temp);
   if (encryptButton.GetCheck() == BST_CHECKED)
   {
      Encrypt(temp.Left(size*size));
      int l = temp.GetLength();
      rotation = l/((size*size)/4)+1;
      if (rotation > 4) 
      {
         output.SetWindowTextW(ExtractTextLinesFromSquare());
         rotation = 4;
      }
      else output.SetWindowTextW(NULL);
   }
   else
   {
      Decrypt(temp.Left(size*size));
      rotation = rand()%4+1;
      output.SetWindowTextW(ExtractText());
   }
   UpdateTableView();
}

void CKardanoDlg::OnBnClickedEncrypt()
{
   if (encryptButton.GetCheck()==BST_UNCHECKED)
   {
      encryptButton.SetCheck(BST_CHECKED);
      decryptButton.SetCheck(BST_UNCHECKED);
      regenerateButton.EnableWindow(true);
      rotateButton.EnableWindow(false);
   }
}

void CKardanoDlg::OnBnClickedDecrypt()
{
   if (decryptButton.GetCheck()==BST_UNCHECKED)
   {
      decryptButton.SetCheck(BST_CHECKED);
      encryptButton.SetCheck(BST_UNCHECKED);
      input.SetWindowTextW(NULL);
      table.ClearItemsText();
      regenerateButton.EnableWindow(false);
      rotateButton.EnableWindow(true);
      Invalidate();
   }
}

void CKardanoDlg::OnBnClickedRotate()
{
   rotation = (rotation==4) ? 1 : rotation+1;
   output.SetWindowTextW(ExtractText());
   UpdateTableView();
}

CString CKardanoDlg::ExtractTextLinesFromSquare()
{
   CString res = _T("");
   for (int i=1; i<=size; i++)
      for (int j=1; j<=size; j++)
         res += table.GetItemText(i, j);
   return res;
}

CString CKardanoDlg::ExtractText()
{
   CString res = _T("");
   int curRotation = rotation;
   for (int k=1; k<=4; k++)
   {
      for (int i=0; i<size; i++)
         for (int j=0; j<size; j++)
            if (kardanoSquare.GetValue(i, j)==curRotation) 
               res += table.GetItemText(i+1, j+1);
      curRotation = (curRotation==4) ? 1 : curRotation+1;
   }
   return res;
}
Соседние файлы в папке Kardano