Ознакомление с историей изобретение языка программирования C. Рассмотрение компонентов программы Блокнот. Проектирование основных кнопок окна, строки заголовка, меню верхнего уровня, панели инструментов для меню второго уровня и статусной панели.
Аннотация к работе
Чтобы создать меню верхнего уровня, нужно его тоже спроектировать на листе бумаги и тщательно продумать, какой пункт меню какие подпункты должен содержать и нарисовать схему меню. {0,IDP_Save, TBSTATE_ENABLED,TBSTYLE_BUTTON, 0, NULL}, {1,IDP_Open, TBSTATE_ENABLED,TBSTYLE_BUTTON, 0, NULL}, {2,IDP_Print,TBSTATE_ENABLED,TBSTYLE_BUTTON, 0, NULL} Окно для редактирования считается дочерним окном для программы и создается при помощи функции, но с названием CREATEWINDOWEXW и присваивается переменной edit. edit = CREATEWINDOWEXW (WS_EX_CLIENTEDGE, LRICHEDIT50W", L"",WS_VISIBLE|WS_CHILD|ES_MULTILINE, 10, 10, 300, 300, HWND, (HMENU)10, HINSTANCE, NULL); Метка IDM_Enable_Disable переключает меню выход, метки case IDP_Open и IDP_Save предназначены для открытия и сохранения текстового файла, метка IDP_Print соответственно для распечатки документов. "Включить или отключить выход", "Выйти из программы", "О программе", "Меню Файл", "","","","","","","","","","","", "Меню Правка", "Меню Вставка", "Меню Формат", "Меню Справка", "Пустой блокнот.
Введение
программа блокнот панель меню
Язык C был изобретен и реализован Дэнисом Ритчи в операционной системе Unix. Этот язык был разработан на основе более старого языка BCPL, созданного в свое время Мартином Ричардсом. В свою очередь развитие языка B привело к созданию в 1970 году языка C. Стандарт ANSI был окончательно принят в декабре 1989 года и впервые опубликован в начале 1990 года. Этот стандарт был окончательно принят организацией ISO.
Любая программа на C состоит из одной или нескольких функций. Функции в C служат для реализации отдельных исполнителей. Обязательно должна быть определена единственная главная функция main, именно с нее начинается выполнение программы. Именно она выполняет всю работу, обращаясь при необходимости к другим функциям. Язык Си разрабатывался как замена или дополнение языка Assembler` а для задач системного программирования. На этом языке была написана первая мультиплатформенная ОС UNIX.
1. Необходимое программное обеспечение
В качестве программного обеспечения используется студия Microsoft Visual C 6.0, стандартная виндоузовская программа Paint, а также программа Help&Manual для создания файла справки.
2. Основные файлы, используемые в проекте
Pr5.cpp - основной файл программы;
Pr5.res - файл ресурсов;
Resource.h - заголовочный файл ресурсов;
Toolbar.bmp - графический файл, изображающий панель для меню второго уровня;
Pr5.hlp - файл справки о программе.
3. Проектирование программы
Сначала программа Текстовый Редактор Блокнот проектируется на листе бумаги.
Первый этап проектирования программы. Нужно продумать, из каких компонентов будет состоять программа. Окно должно иметь три основные кнопки и иметь возможность изменяться в размере. Также основными компонентами окна должны быть: строка заголовка, меню верхнего уровня, панель инструментов для меню второго уровня и статусная панель.
Рисунок 1.
Чтобы создать меню верхнего уровня, нужно его тоже спроектировать на листе бумаги и тщательно продумать, какой пункт меню какие подпункты должен содержать и нарисовать схему меню. Пункт с названием "О программе" тоже должен быть но для простоты его действие не прописывается.
Второй этап проектирования программы. Нужно продумать и нарисовать программу со всеми составляющими ее компонентами, включая меню второго уровня с пиктограммами (Сохранить, открыть и печать), статусную панель и саму рабочую область, в качестве которой используется элемент richedit. Макет этой программы приведен на рисунке 3.
Рисунок 2.
Рисунок 3.
В первую очередь программно создается само окно. Для этого нужно подключить библиотеку windows.h и объявить главную функцию программы WINMAIN() а также оконную функцию WNDPROC(). Эта функция также называется оконной процедурой. Она связана с циклом обработки сообщений через обратный вызов CALLBACK. Любая программа начинается писаться с функции WINMAIN, то есть с основной функции программы под Microsoft Windows. Для более простых компиляторов она имеет структуру WINAPI. Функция начинается с объявления структуры типа класса WNDCLASS, создания переменной w и ее инициализации. Затем для более подробного описания окна через эту переменную нужное число раз вызываются поля (методы класса) и этим методам присваиваются нужные значения. После описания окна через функцию ветвления происходит регистрация окна с возвращением значения 1, а иначе - 0. Затем после инициализации нужно функцией CREATEWINDOW создавать как само окно, так и все дочерние окна. Функция CREATEWINDOW имеет такие параметры как класс окна, заголовок окна, константы для подробного описания окна через логический оператор ИЛИ, координаты окна по осям x и y относительно точки находящейся в верхнем углу слева, размеры окна (длину и ширину), взаимосвязи с дочерними окнами, если они имеются и главный дескриптор окна HINSTANCE а также редко используемые параметры.
Затем нужно отобразить окно при помощи функции SHOWWINDOW и по необходимости его обновить (функция UPDATEWINDOW), но для этого нужно осуществить проверку через функцию ветвления if(), создано ли окно. Если окно не создано, то функция возвращает нулевое значение. После отображения окна в программе идет главный цикл обработки сообщений (MESSAGELOOP). В этом цикле содержится функция GETMESSAGE, которая считывает сообщение, в рамках диапазона фильтрации, из очереди сообщений прикладной задачи и оставляет управление другим прикладным задачам, если сообщений нет или если следующим сообщением является WM_PAINT или WM_TIMER. Она имеет параметры: Msg: принимающая структура TMSG, Wnd: Окно назначения сообщений или 0 для всех окон в прикладной задаче. MSGFILTERMIN: Нуль в случае отсутствия фильтрации или wm_KEYFIRST только для клавиатуры или wm_MOUSEFIRST только для мыши. MSGFILTERMIAX Нуль в случае отсутствия фильтрации или wm_KEYLAST только для клавиатуры или wm_MOUSELAST только для мыши. Также в основном цикле программы содержится функция TRANSLATEMESSAGE для перевода комбинаций сообщений и перенаправления их в очередь сообщений (громадный switch) и функция DISPATCHMESSAGE для осуществления всех взаимосвязей между двумя основными функциями программы. Основная функция программы должна возвращать значение msg.WPARAM, то есть младшее слово Windows-сообщений. Затем идет функция WNDPROC. Она при помощи функции обратного вызова CALLBACK взаимосвязана с циклом обработки сообщений и имеет структуру LRESULT. Основным содержимым этой функции является очередь сообщений. Метки case можно писать в любом порядке. Основными метками являются метки связанные с закрытием окна WM_CLOSE и WM_DESTROY. В метке default jgbcsdftncz любое сообщение, которое не обрабатывает оконная процедура. Оно отправляется на обработку в функцию DEFWINDOWPROC.
Далее создается меню верхнего уровня, то есть основное меню программы. Для наипростейшего создания этого меню в первую очередь нужно объявить константы в качестве глобальных констант, а также все глобальные переменные типа HMENU. Затем функцию CREATEPOPUPMENU необходимо присвоить переменным самого меню, например HFILEMENU. Далее в самой очереди сообщений прописывается сами элементы меню с помощью функции APPENDMENU() через ветвление if. Также нужно присоединить меню к главной панели управления и к самому окну тоже при помощи функции APPENDMENU(). Класс UNDO предназначен для пункта меню Отмена, он прописывается в качестве глобальной переменной. Этот класс называется стеком.
После создания меню верхнего уровня создается статусная панель. Для ее создания объявляются переменные двух типов HWND и UINT и правильного закрепления, то есть чтобы она могла менять размеры в зависимости от изменения размеров окна как вручную, так и автоматически. Так же для создания этой панели нужно подключить библиотеку commctrl.h и написать функцию HSTATUSWINDOW типа HWND. Затем переменной HSTATUSWINDOW присваивается функция с названием CREATESTATUSWINDOW создающая эту панель и конструкция if: HSTATUSWINDOW = CREATESTATUSWINDOW(WS_CHILD|WS_VISIBLE,"Блокнот Ярослава",HWND, wld);
На следующем этапе создаются акселераторы, то есть "горячие" клавиши. Для этого нужно создать переменные типа HACCEL и ACCEL, а также в цикле обработки прописать своего рода конструкцию, то есть if(!TRANSLATEACCELERATOR(HWND,HACCEL,&Msg)), а также все функции для работы с акселераторами.
Для более полного описания функции работы с акселераторами используется следующая структура: TBBUTTON buttons[3] =
Далее нужно к меню верхнего уровня присоединить меню второго уровня. Для этого нужно панель управления для данного меню прорисовать в программе PAINT и создать файл с названием toolbar.bmp.
Она присоединяется при помощи специального файла ресурсов "resource.h", структуры MAKEINRESOURE и других функций. Также она описывается следующей структурой: INITCOMMONCONTROLSEX icx;
Самым важным этапом в проектировании программы является создание основного элемента управления, то есть самого текстового поля. Для этого необходимо подключить библиотеку richedit.h а также подключить специальную lib-библиотеку. В шестой студии она называется Msftedit.dll. Также нужна константа с названием _RICHEDIT_VER 0x0200. Она объявляется через ключевое слово #define. Окно для редактирования считается дочерним окном для программы и создается при помощи функции, но с названием CREATEWINDOWEXW и присваивается переменной edit. edit = CREATEWINDOWEXW (WS_EX_CLIENTEDGE, LRICHEDIT50W", L"",WS_VISIBLE|WS_CHILD|ES_MULTILINE, 10, 10, 300, 300, HWND, (HMENU)10, HINSTANCE, NULL);
… if (!edit)
{
MESSAGEBOX (HWND,"e","e",MB_OK);
return 0;
}
Затем нужно прописать само меню верхнего уровня в метках case. Оно прописывается в самой оконной процедуре, то есть в очереди сообщений. Чтобы прописать метку, имеющую название созданной константы, необходимо сначала создать метку с названием WM_COMMAND и в нее вставить отдельный switch с параметром LOWORD(wparam) и в нем прописывать метки-константы для меню верхнего уровня. Метка IDM_Enable_Disable переключает меню выход, метки case IDP_Open и IDP_Save предназначены для открытия и сохранения текстового файла, метка IDP_Print соответственно для распечатки документов. В меню "Правка" входят такие метки как: IDP_Undo, IDP_Cut, IDP_Copy, IDP_Paste и IDP_Find. В меню "Вставка" входят следующие метки: IDP_Datetime, IDP_Symbol, IDP_Alpha, IDP_Sigma=19 и IDP_Omega. В меню "Формат" входит метка IDP_Font, а в меню "Справка" - IDP_Help. Метка WM_Notifi используется в качестве вспомогательной метки для отмены действия а также она взаимосвязана с классом Undo.
4. Описание меню верхнего уровня
Для того, чтобы прописать все подпункты меню верхнего уровня, нужно в первую очередь создать конструкцию с меткой WM_COMMAND, имеющую вид: … case WM_COMMAND: { switch(LOWORD(WPARAM))
{
// Все метки меню и подменю
… … …
}
}
…
Каждое меню или подменю описывается в своей метке case.
Меню Файл.
Это меню состоит из пунктов: Открыть, Сохранить, Печать, Включить/выключить выход, Выход.
Каждый подпункт меню описывается соответствующим классом, встроенным в саму библиотеку данного компилятора case IDP_Open: {
Меню Правка. Это меню состоит из подпунктов: Отменить, Вырезать, Копировать, Вставить, Найти. Для отмены последнего действия используется класс Undo, который называется стеком. Метка IDP_Undo ссылается на этот класс через указатель-ссылку. case IDP_Undo: { char * m = undo.removecopy();
SETWINDOWTEXT(edit, m);
UPDATEWINDOW(edit);
delete [] m;
} break;
case IDP_Cut: SENDMESSAGE(edit,WM_CUT,0,0);
break;
case IDP_Copy: SENDMESSAGE(edit,WM_COPY,0,0);
break;
case IDP_Paste: SENDMESSAGE(edit,WM_PASTE,0,0);
break;
case IDP_Find: { find.HINSTANCE=HINST;
find.LSTRUCTSIZE=sizeof(find);
find.HWNDOWNER=HWND;
find.Flags=FR_DOWN|FR_NOMATCHCASE;
find.LPSTRFINDWHAT=str;
find.WFINDWHATLEN=200;
find.LPSTRREPLACEWITH=NULL;
find.WREPLACEWITHLEN=0;
find.LCUSTDATA=0;
find.LPFNHOOK=NULL;
find.LPTEMPLATENAME=NULL;
poisk=FINDTEXT(&find);
} break;
Меню Вставка. Это меню состоит из основных пунктов: Дата и время и Символ. Пункт "Символ" состоит из трех подпунктов, которые по отдельности прописываются в очереди сообщений (IDP_Alpha, IDP_Sigma, IDP_Omega). Таймер в данной программе используется для самой вставки даты и времени. case IDP_Datetime: { int size = GETWINDOWTEXTLENGTH(edit);
char * m = new char [size 100];
GETWINDOWTEXT(edit, m, size 1);
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
char* txt=asctime(timeinfo);
strcpy(m size, txt);
//SENDMESSAGE(edit,WM_SETTEXT,(WPARAM)txt,0);
SETWINDOWTEXT(edit, m);
delete[] m;
} break;
case IDP_Alpha: //Вставка символа "Альфа"
{
CHARRANGE cr;
cr.CPMIN=-1;
cr.CPMAX=-1;
//Становится в конец Richedit
SENDMESSAGE(edit,EM_EXSETSEL,0,(LPARAM)&cr);
wchar_t str[] = L"0x0391";
SENDMESSAGE(edit,EM_REPLACESEL,0,(LPARAM)str);
} break;
case IDP_Sigma: //Вставка символа "Сигма" break;
case IDP_Omega: //Вставка символа "Омега" break;
Меню Формат. Это меню состоит из одного пункта Шрифт, то есть IDP_Font. Это меню состоит из двух основных структур - логического и встроенного шрифтов (т.е. LOGFONT и CHOOSEFONT), а также из множества функций для работы со шрифтом. В качестве справочника, для этих целей используется сайт с названием msdn.microsoft.com. case IDP_Font: {
Меню Справка. Для простоты решения задачи, проектируется меню содержащее только один пункт с названием Вызов справки. Второй пункт в данном проекте не используется. Пункт "Вызов справки" описан следующим образом: case IDP_Help: WINHELP(HWND,"myhelp.hlp", HELP_CONTENTS, 0);
break;
Для описания всех вложенных меню используется следующая конструкция: case WM_MENUSELECT: if(((UINT)HIWORD(WPARAM)==0xffff)&((HMENU)LPARAM==0))