СОДЕРЖАНИЕ
Постановка задачи
Краткие теоретические сведения
Результаты выполнения программы
Заключение
Литература
Листинг программы
ПОСТАНОВКА ЗАДАЧИ
Составить 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("Не удается найти \"") + strFind + _T("\"")
,_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("Неудаетсянайти \"") + strFind + _T("\"")
,_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 ".\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("Неудаетсянайти \"") + strFind + _T("\"")
,_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);