Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа 11 / Kardano / KardanoDlg
.cpp// 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