
- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
20.6. Ресурсы Windows
Для уменьшения объема основного модуля программы данные некоторых объектов Windows, используемых в программе, помещаются в отдельный файл, который называется файлом ресурсов. Объекты Windows, описания которых хранятся в файле ресурсов, называются ресурсами. К ресурсам относят диалоговые панели, меню, панели инструментов, акселераторы (горячие клавиши), строки, иконки, курсоры, рисунки в формате bmp.
Файл ресурсов представляет собой текстовый файл и имеет тип *.rc. Возможны два способа редактирования файла ресурсов: при помощи простейшего текстового редактора или специального графического редактора ресурсов. Для редактирования файла ресурсов в текстовом редакторе пользователь должен знать язык описания ресурсов.
Приведем пример описания диалоговой панели, в которую включены строка заголовка, системное меню, кнопка:
/////////////////////////////////////////////////////////////////////////////
//
//Dialog
//
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Заголовок окна"
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "OK1",IDC_OK,123,23,32,16,BS_CENTER | BS_VCENTER
END
/////////////////////////////////////////////////////////////////////////////
Графический редактор ресурсов упрощает процесс редактирования файла ресурсов, так как не требует знания языка описания ресурсов. Редактор входит в состав инструментальной среды для разработки программ для Windows, при этом пользователь выполняет редактирование ресурса визуально, а текст rc-файла среда формирует автоматически.
Компиляция файла ресурсов выполняется специальным компилятором, в результате компиляции создается файл *.res.
Каждый ресурс имеет имя или идентификатор. Имя ресурса представляет собой строку и записывается в двойных кавычках, например, "Menu1". Идентификатор ресурса сопоставляется с некоторым числовым значением и записывается в файл resource.h. Приведем строчку из этого файла, в которой объявляется идентификатор диалоговой панели IDD_DIALOG1 (идентификаторы ресурсов принято записывать прописными буквами):
#define IDD_DIALOG1 100
Когда в программу добавляется новый ресурс или объект Windows, среда Visual C++ автоматически редактирует файл resource.h.
Файл resource.h подключается к каждому модулю, использующему ресурсы.
20.7. Взаимодействие прикладной программы и устройств в Windows
В операционной системе Windows запрещены операции, непосредственно передающие информацию внешним устройствам компьютера; этот запрет распространяется также и на графические устройства, например, монитор, принтер. Информация для графического устройства передается так называемому контексту устройства. Контекст устройства DC (Device Context) используется для логического представления в программе какого-либо внешнего графического устройства. Контекст устройства хранит информацию о пере, кисти, шрифте, растровом изображении, в соответствии с которой происходит формирование изображения, передаваемого дальше на графическое устройство. Контекст устройства может быть не связан с физическим устройством – данные из контекста могут быть адресованы логическим устройствам, например, метафайл Windows – совокупность структур, в которых хранится изображение в формате, зависимом от конкретного устройства; bitmap – совокупность точек растра, образующих изображение.
Контекст устройства представляет собой выделенную область оперативной памяти размером 64 кбайт; в программах, использующих библиотеку Win32 API, контекст устройства доступен через дескриптор контекста устройства HDC. Прежде чем использовать контекст, его надо запрашивать. Когда программа запрашивает контекст, операционная система передает ей дескриптор (хэндл) контекста устройства, т. е. адрес размещения контекста в оперативной памяти. По завершении работы с контекстом устройства его надо освободить.
В интерфейс Win32 API включены:
контекст дисплея, используемый для графических операций на мониторе;
контекст принтера, поддерживающий графические операции на принтере;
контекст в памяти, поддерживающий графические операции над растровыми изображениями;
информационный контекст, обеспечивающий чтение данных с графических устройств.
Рассмотрим наиболее часто используемый контекст дисплея, так как любые операции рисования в окнах, перерисовка окон при их перекрытии, свертывании, развертывании выполняются в контексте дисплея.
Существуют два варианта контекста дисплея.
Общий контекст – единый контекст для всех окон приложения, используется в приложениях, не очень интенсивно работающих с экраном, например, в диалоговых приложениях.
Приватный контекст – создается для отдельного окна, используется в приложениях, интенсивно работающих с экраном, таких как настольные издательские системы и графические редакторы.
Для перерисовки окна, соответствующей сообщению WM_PAINT, дескриптор контекста дисплея создается с помощью функции BeginPaint(); после завершения перерисовки контекст освобождается функцией EndPaint().
Для рисования на поверхности окна при получении любого другого сообщения, кроме WM_PAINT, контекст дисплея создается функцией GetDC() или GetDCEx(); освобождение контекста выполняется функциями ReleaseDC() или ReleaseDCEx().
Если приложение использует общий контекст дисплея, то все окна используют один и тот же контекст поочередно. Общий контекст обязательно следует освобождать после завершения графических операций в окне, так как многократное выделение общего контекста без его освобождения приводит к переполнению памяти. Следует помнить также, что после освобождения контекста все изменения, внесенные в него, теряются.
Если приложение использует приватный контекст, то получить дескриптор контекста можно так же, как и в случае общего контекста, однако освобождать его не надо. Система сама освобождает контекст при закрытии окна.
Выбор варианта контекста дисплея происходит при создании класса главного окна. Для выбора приватного контекста при заполнении структуры типа WNDCLASS (WNDCLASSEX) следует указать стиль окна CS_OWNDC, иначе приложение будет использовать общий контекст.
Стиль окна, использующего приватный контекст, задается следующим образом:
WinExam1.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
Оконная процедура обеспечивает обработку трех сообщений: WM_CREATE, WM_COMMAND и WM_DESTROY. Последнее сообщение посылается при завершении работы программы. Сообщение WM_CREATE посылается при создании окна. Сообщение WM_COMMAND программа получает при выборе пользователем команды меню или при нажатии кнопок. В нашем примере в окне размещены две кнопки. Создание кнопок происходит с помощью функции CreateWindow() при инициализации окна, т. е. во время обработки сообщения WM_CREATE.
Получение дескриптора контекста дисплея выполняется при обработке сообщения WM_COMMAND, возникающего при нажатии одной из кнопок, размещенных в окне, для этого используется функция GetDC():
#include "windows.h"
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst=hInstance;
//Создание класса главного окна
WNDCLASSEX WinExam1;
WinExam1.cbSize=sizeof(WNDCLASSEX);
WiExam1.style=CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
WinExam1.lpfnWndProc=WndProc;
WinExam1.cbClsExtra=0;
WinExam1.cbWndExtra=0;
WinExam1.hInstance=hInst;
WinExam1.hIcon=LoadIcon(hInst, IDI_APPLICATION);
WinExam1.hCursor=LoadCursor(hInst,
IDC_APPSTARTING);
WinExam1.hbrBackground=HBRUSH(COLOR_WINDOW+1);
WinExam1.lpszMenuName=NULL;
WinExam1.lpszClassName="Examp1Win";
WinExam1.hIconSm=LoadIcon(hInst,
IDI_APPLICATION);
//Регистрация класса главного окна
RegisterClassEx(&WinExam1);
//Создание главного окна
HWND hWnd1=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
"Examp1Win","Child windows 1",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,
0,NULL,NULL,hInst,NULL);
//Отображение главного окна
ShowWindow(hWnd1, SW_SHOW);
//Цикл обработки сообщений
MSG Msg;
while (GetMessage(&Msg,(HWND)NULL,0,0))
{
DispatchMessage(&Msg);
}
return 0;
}
//Оконная процедура обработки сообщений
LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,
WPARAM wParam,LPARAM lParam)
{
HDC dc;
switch (Msg)
{
case WM_CREATE:
//Создаем две кнопки
CreateWindow("BUTTON","Первая кнопка",
WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
0,0,160,20,hWnd,0,hInst,NULL);
CreateWindow("BUTTON","Вторая кнопка",
WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
0,25,160,20,hWnd,(HMENU)1,hInst,NULL);
break;
//Обработка сообщений - уведомлений
case WM_COMMAND:
dc=GetDC(hWnd); //Получение контекста дисплея
switch(LOWORD(wParam))
{
case 0: //Пришло сообщение от первой кнопки
TextOut(dc,170,0,"Нажата первая кнопка",20);
break;
case 1:
TextOut(dc,170,0,"Нажата вторая кнопка",20);
break;
};
break;
case WM_DESTROY:
//Сообщаем системе о завершении программы
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
return 0;