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