Смекни!
smekni.com

Проект текстового редактора (стр. 1 из 3)

СОДЕРЖАНИЕ

Постановка задачи

Краткие теоретические сведения

Результаты выполнения программы

Заключение

Литература

Листинг программы


ПОСТАНОВКА ЗАДАЧИ

Составить Win32 App проект простейший текстовый редактор, который позволяет выполнять операции редактирование текста, копирование и вставку из одного окна проекта в другое окно проекта. Использовать вызов диалогов сохранения и открытия файла, а также диалог выбора шрифта. Все диалоги применяются к тексту в редакторе.


КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Работа с функциями вызова стандартных диалогов производится следующим образом:

1. Объявляются переменные соответствующих структур:

staticCOLORREFtextColor;

// Переменные для стандартных диалогов "Open", "Saveas"

staticOPENFILENAMEofn;

staticcharszFile[MAX_PATH];

// Переменные для стандартного диалога "Color"

static CHOOSECOLOR cc; // common dialog box structure

static COLORREF acrCustClr[16]; // array of custom colors

// Переменные для стандартного диалога "Font"

static CHOOSEFONT chf;

static HFONT hFont;

static LOGFONT lf;

2. Инициализируются соответствующие структуры в обработчике события создания окна (окна диалога).

switch (uMsg)

{

case WM_CREATE:

// Инициализацияструктуры ofn

ofn.lStructSize = sizeof(OPENFILENAME);

ofn.hwndOwner = hWnd;

ofn.lpstrFile = szFile;

ofn.nMaxFile = sizeof(szFile);

// Инициализация структуры cc

cc.lStructSize = sizeof(CHOOSECOLOR);

cc.hwndOwner = hWnd;

cc.lpCustColors = (LPDWORD) acrCustClr;

cc.Flags = CC_FULLOPEN | CC_RGBINIT;

// Инициализацияструктуры chf

chf.lStructSize = sizeof(CHOOSEFONT);

chf.hwndOwner = hWnd;

chf.lpLogFont = &lf;

chf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;

chf.nFontType = SIMULATED_FONTTYPE;

break;

}

3. Вызывается соответствующая функция в обработчике событий нажатия кнопки вызова соответствующего диалога.

case WM_COMMAND:

switch (LOWORD(wParam))

{

case IDM_OPEN:

strcpy(szFile, "");

success = GetOpenFileName(&ofn);

if (success)

MessageBox(hWnd, ofn.lpstrFile, "Открываетсяфайл:", MB_OK);

else

MessageBox(hWnd, ESC_OF"GetOpenFileName",

"Отказ от выбора или ошибка", MB_ICONWARNING);

break;

case IDM_SAVE_AS:

strcpy(szFile, "");

success = GetSaveFileName(&ofn);

if (success)

MessageBox(hWnd, ofn.lpstrFile,

"Файлсохраняетсясименем:", MB_OK);

else

MessageBox(hWnd, ESC_OF"GetSaveFileName",

"Отказ от выбора или ошибка", MB_ICONWARNING);

break;

case IDM_BKGR_COLOR:

if (ChooseColor(&cc))

SetClassLong(hWnd, GCL_HBRBACKGROUND,

(LONG)CreateSolidBrush(cc.rgbResult));

break;

case IDM_TEXT_COLOR:

if (ChooseColor(&cc)) textColor = cc.rgbResult;

break;

case IDM_CHOOSE_FONT:

if(ChooseFont(&chf)) hFont = CreateFontIndirect(chf.lpLogFont);

break;

РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРОГРАММЫ



ЗАКЛЮЧЕНИЕ

В процессе разработки программы использовался в большом объеме теоретический материал ВУЗа и материал по программированию из учебников, вспомогательных электронных средств и средств Интернета, что способствовало закреплению наработанных навыков и умений в этих интересных областях знаний.

Полное тестирование программы показало что, программа реализована в полном объеме в соответствии с заданными требованиями и поставленной задачей. Полностью отлажена и проработана. Поставленная задача выполнена.

Программа построена на классе MFC для Win 32 приложений.


ЛИТЕРАТУРА

1. Д.Рихтер Создание эффективных Win32 приложений.

2. П. В. Румянцев Азбука программирования в WIN 32 API.

3. Ч. Петзолд. Программирование для Windows 95. Том 1.

4. Архипова Е.Н. Электронный курс по WIN 32 API.


ЛИСТИНГ ПРОГРАММЫ

Код модуля mein.cpp

// mein.cpp : implementation file

//

#include "stdafx.h"

#include "Menu.h"

#include "mein.h"

// mein dialog

IMPLEMENT_DYNAMIC(mein, CDialog)

mein::mein(CWnd* pParent /*=NULL*/)

: CDialog(mein::IDD, pParent)

{

}

mein::~mein()

{

}

void mein::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(mein, CDialog)

END_MESSAGE_MAP()

// mein message handlers

Кодмодуля menu.cpp

// Menu.cpp : Defines the class behaviors for the application.

//

#include "stdafx.h"

#include "Menu.h"

#include "MenuDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CMenuApp

BEGIN_MESSAGE_MAP(CMenuApp, CWinApp)

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

// CMenuApp construction

CMenuApp::CMenuApp()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

// The one and only CMenuApp object

CMenuApp theApp;

// CMenuApp initialization

BOOL CMenuApp::InitInstance()

{

// InitCommonControls() is required on Windows XP if an application

// manifest specifies use of ComCtl32.dll version 6 or later to enable

// visual styles. Otherwise, any window creation will fail.

InitCommonControls();

CWinApp::InitInstance();

// Standard initialization

// If you are not using these features and wish to reduce the size

// of your final executable, you should remove from the following

// the specific initialization routines you do not need

// Change the registry key under which our settings are stored

// TODO: You should modify this string to be something appropriate

// such as the name of your company or organization

SetRegistryKey(_T("Local AppWizard-Generated Applications"));

CMenuDlg dlg;

m_pMainWnd = &dlg;

INT_PTR nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

// TODO: Place code here to handle when the dialog is

// dismissed with OK

}

else if (nResponse == IDCANCEL)

{

// TODO: Place code here to handle when the dialog is

// dismissed with Cancel

}

// Since the dialog has been closed, return FALSE so that we exit the

// application, rather than start the application's message pump.

return FALSE;}

Кодмодуля nauti.cpp

// m_nauti.cpp : implementation file

//

#include "stdafx.h"

#include "Menu.h"

#include "m_nauti.h"

#include ".\m_nauti.h"

#include "MenuDlg.h"

#include <string>

using namespace std;

// m_nauti dialog

IMPLEMENT_DYNAMIC(m_nauti, CDialog)

m_nauti::m_nauti(CWnd* pParent /*=NULL*/)

: CDialog(m_nauti::IDD, pParent)

, m_pParent(pParent)

, m_nStartPos(0)

, strFind(_T(""))

, m_strText(_T(""))

, n_radio1(false)

, n_radio2(false)

, ddx_222(false)

{

}

m_nauti::~m_nauti()

{

}

void m_nauti::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Control(pDX, IDC_EDIT11, edit);

DDX_Control(pDX, IDC_BUTTON1, nauti_dalee);

DDX_Control(pDX, IDC_RADIO1, ddx_radio);

DDX_Radio(pDX, IDC_RADIO2, ddx_222);

}

BEGIN_MESSAGE_MAP(m_nauti, CDialog)

ON_EN_CHANGE(IDC_EDIT11, OnEnChangeEdit11)

ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)

ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)

ON_WM_DESTROY()

END_MESSAGE_MAP()

BOOL m_nauti::OnInitDialog()

{

CDialog::OnInitDialog();

//CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT11);

//pEdit->SetFocus();

//SetFocus();

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

// EXCEPTION: OCX Property Pages should return FALSE

}

// m_nauti message handlers

void m_nauti::OnEnChangeEdit11()// Едит---------------------------------

{

//CEdit *pmyEdit = (CEdit *)GetDlgItem(IDC_EDIT11);

//pmyEdit->SetFocus();

//SetFocus();

CString str;

edit.GetWindowText(str);

if(str.GetLength()>0)

{

nauti_dalee.ModifyStyle(WS_DISABLED,0);

nauti_dalee.Invalidate(FALSE);

}

else

{

nauti_dalee.ModifyStyle(0,WS_DISABLED);

nauti_dalee.Invalidate(FALSE);

}

}

void m_nauti::OnFind()//Галочкавниз--------------------------------------------

{

CButton *pBtnFind = (CButton *)GetDlgItem(IDC_BUTTON1);

// Получаемдоступкполямввода

CEdit *pEdit = (CEdit *)((CMenuDlg *)m_pParent)->GetDlgItem(IDC_EDIT1);

CEdit *pFind = (CEdit *)GetDlgItem(IDC_EDIT11);

// Получаем текст из полей ввода

pFind->GetWindowText(strFind);

if (!IsDlgButtonChecked(IDC_CHECK1))

{

m_strText.MakeLower();

strFind.MakeLower();

}

int nStart, nEnd;

int nFindPos;

pEdit->GetSel(nStart, nEnd);

m_nStartPos = nEnd;

if (n_radio2)

{

nFindPos = m_strText.Find(strFind);

n_radio2 = FALSE;

}

else

nFindPos = m_strText.Find(strFind, m_nStartPos);

if (nFindPos == -1)

{

if (!n_radio1)

MessageBox(_T("Не удается найти &bsol;"") + strFind + _T("&bsol;"")

,_T("Блокнот"), MB_OK | MB_ICONINFORMATION);

}

else

{

// Нашли - выделяемнайденное

pEdit->SetSel(nFindPos, nFindPos + strFind.GetLength());

// Определяем позицию, с которой надо продолжать поиск

m_nStartPos = nFindPos + strFind.GetLength();

}

}

void m_nauti::OnBnClickedButton1()//Найтидалее---------------------------

{

CButton *pBtnFind = (CButton *)GetDlgItem(IDC_BUTTON1);

// Получаемдоступкполямввода

CEdit *pEdit = (CEdit *)((CMenuDlg *)m_pParent)->GetDlgItem(IDC_EDIT1);

CEdit *pFind = (CEdit *)GetDlgItem(IDC_EDIT11);

CString strFind;

pEdit->GetWindowText(m_strText);

pFind->GetWindowText(strFind);

int nStart, nEnd;

int nFindPos;

if (IsDlgButtonChecked(IDC_RADIO2))

OnFind();

if (IsDlgButtonChecked(IDC_RADIO1))

{

if (!IsDlgButtonChecked(IDC_CHECK1))

{

m_strText.MakeLower();

strFind.MakeLower();

}

n_radio1 = TRUE;

n_radio2 = TRUE;

pEdit->GetSel(nStart, nEnd);

CString sz;

int nCountText = m_strText.GetLength();

int nCountFind = strFind.GetLength();

int n = m_strText.Delete(nStart, nCountText);

string strTmp = m_strText;

static const basic_string <char>::size_type npos = -1;

size_t ind = strTmp.rfind (strFind);

if (ind != npos )

pEdit->SetSel((int)ind, ind + nCountFind);

else

MessageBox(_T("Неудаетсянайти &bsol;"") + strFind + _T("&bsol;"")

,_T("Блокнот"), MB_OK | MB_ICONINFORMATION);

n_radio1 = FALSE;

n_radio2 = FALSE;

}

GetDlgItem(IDC_EDIT11)->SetFocus();

}

void m_nauti::OnBnClickedCancel()//Выход------------------------------

{

OnCancel();

// Сбрасываем указатель на дочернее окно в родительском окне

((CMenuDlg *)m_pParent)->m_pAddDlg = NULL;

// Уничтожаемдочернееокно

DestroyWindow();

}

void m_nauti::OnDestroy()//ОНдестрой--------------------------------------

{

CDialog::OnDestroy();

// Уничтожаемобъект

delete this;

}

Код модуля zamenit.cpp

// Zamenit.cpp : implementation file

//

#include "stdafx.h"

#include "Menu.h"

#include "Zamenit.h"

#include ".&bsol;zamenit.h"

#include "MenuDlg.h"

// Zamenit dialog

IMPLEMENT_DYNAMIC(Zamenit, CDialog)

Zamenit::Zamenit(CWnd* pParent /*=NULL*/)

: CDialog(Zamenit::IDD, pParent)

, m_pParentz(pParent)

, m_nStartPosR(0)

, m_bFlagRepl(false)

, m_bFlagReplAll(false)

, strText(_T(""))

, strFind(_T(""))

{

}

Zamenit::~Zamenit()

{

//m_pParentz = pParent;

}

void Zamenit::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(Zamenit, CDialog)

ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)

ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)

ON_EN_CHANGE(IDC_EDIT22, OnEnChangeEdit22)

ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)

ON_WM_DESTROY()

ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)

END_MESSAGE_MAP()

// Zamenit message handlers

void Zamenit::OnBnClickedButton1()//Найтидалее----------------------------

{

// Получаемдоступкполямввода

CEdit *pEdit = (CEdit *)(((CMenuDlg *)AfxGetMainWnd())->GetDlgItem(IDC_EDIT1));

CEdit *pFind = (CEdit *)GetDlgItem(IDC_EDIT22);

// Получаем текст из полей ввода

//CString strText, strFind;

pEdit->GetWindowText(strText);

pFind->GetWindowText(strFind);

if (!IsDlgButtonChecked(IDC_CHECK1))

{

strText.MakeLower();

strFind.MakeLower();

}

int nStart, nEnd;

int nFindPos;

pEdit->GetSel(nStart, nEnd);

m_nStartPosR = nEnd;

nFindPos = strText.Find(strFind, m_nStartPosR);

if (nFindPos == -1 && !m_bFlagReplAll)

{

MessageBox(_T("Неудаетсянайти &bsol;"") + strFind + _T("&bsol;"")

,_T("Блокнот"), MB_OK | MB_ICONINFORMATION);

}

else

{

// Нашли - выделяемнайденное

pEdit->SetSel(nFindPos, nFindPos + strFind.GetLength());

// Определяем позицию, с которой надо продолжать поиск

m_nStartPosR = nFindPos + strFind.GetLength();

}

m_bFlagRepl = TRUE;

}

void Zamenit::OnBnClickedButton2()//Заменить---------------------------

{

int nStart, nEnd;

//CEdit *pEdit = (CEdit *)((CMenuDlg *)m_pParent)->GetDlgItem(IDC_EDIT1);