Программные средства отладки

При создании приложения на базе MFC в него можно включить определенные инструкции, используемые только во время его отладки. Их использование замедляет выполнение программы. Цель использования: получение дополнительных сообщений, которые облегчают процесс отладки. При создании окончательной версии приложения эти операторы следует удалить.

Режим компиляции приложения должен быть Debug (отладочный), т.к. инструкции – специальные функции и макросы библиотеки MFC, работающие только в отладочном режиме. Кроме того, в отладочной версии приложения Visual C++ с помощью директивы #define определяется константа _DEBUG, используемая в директивах условной компиляции и в макросах отладки.

Макрос ASSERT (BOOLexpression). Данный макрос используется для проверки некоторых логических условий, которые должны выполняться в данной точке программы. Его работа заключается в следующем: если логическое выражение BOOLexpression, передаваемое ему в качестве аргумента, имеет значение FALSE, выполнение приложения прерывается и на экран выводится окно сообщения, показанное на рис. П 5.2. В данном окне указывается имя файла и номер строки, в которой произошла ошибка.

Программные средства отладки - student2.ru

Рис. П 5.2

Нажатие кнопки «Повтор» позволяет перейти в текст программы для ее дальнейшей отладки, причем текущая точка останова устанавливается на строку соответствующего макроса ASSERT. В противном же случае ничего не происходит, и программа выполняется дальше.

Макрос TRACE (exp) служит для вывода диагностических сообщений. Синтаксис макроса TRACE аналогичен синтаксису функции printf. Здесь exp –переменное число параметрических аргументов, т.е. макрос позволяет выводить сообщения с любым числом параметрических аргументов. Под параметрическим аргументом понимается идентификатор переменной, значение которой должно быть преобразовано в текстовую строку в соответствии с указанным форматом. Помимо макроса TRACE существуют TRACE1, TRACE2 и TRACE3. Число в имени макроса указывает на количество параметрических аргументов в нем. Макросы TRACE0, TRACE1, TRACE2 и TRACE3 созданы исключительно с целью экономии места в сегменте данных. Все макросы TRACE посылают свои сообщения в поток afxDump.

Для посылки сообщения могут быть использованы и обычные функции вывода, однако они будут работать и в окончательной версии, что бывает нежелательно.

Пример вывода сообщения о возникновении ошибки в файле:

TRACE2("\n Ошибка номер: %d в файле %s \n", nError, szFileName);

Следующий пример иллюстрирует работу данного макроса:

. . .

int a = 5;

char s[] = ”Minsk”;

TRACE(“\n a = %d, s = %s \n”, a, s);

. . .

В поле среды OutPut получим

a=5, s=Minsk

В окончательной версии приложения Release, в которой константа _DEBUG не определена, макросы ASSERT и TRACE не выполняют никаких действий. Это позволяет оставлять их в тексте программы. В случае же необходимости контроля некоторых логических условий и в рабочей области вместо ASSERT необходимо использовать макрос VERIFY (BOOLexpression), который работает точно так же, но в рабочей версии проекта.



Некоторые возможности графической подсистемы

Основные понятия

В операционной системе Windows для создания программ с использованием графики существует интерфейс программирования приложений API (Application programming interface).

Графическая информация в Windows обрабатывается в основном функциями GDI (Graphics Device interface), представляющими собой единый унифицированный интерфейс устройств (средств) отображения.

Поскольку к ЭВМ может быть подключено множество различных устройств отображения, одной из основных задач GDI является поддержка аппаратно-независимой графики.

Все графические устройства отображения делятся на растровые и векторные устройства. Большинство устройств, подключаемых к ЭВМ – растровые, т.е. представляют графические образы как шаблон точек (видеоадаптеры, матричные и лазерные принтеры). Группа векторных устройств, отображающих графические образы с использованием линий, в основном состоит из плоттеров.

Контекст устройства

Работа GDI базируется на понятии контекст устройства (DC – device context), абстрагирующего свойства реальных устройств, к которым в первую очередь относятся экран, принтер и битовый образ в памяти. Контекст является внутренним объектом Windows, и доступ к нему осуществляется с помощью функций API. Контекст идентифицируется его описателем, имеющим тип HDC (handle DC). Практически каждой функции GDI необходим этот параметр.

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

Контекст сопоставляется системой с каждым изображаемым элементом (чаще всего – окном) и может быть получен прикладной программой, после чего можно обращаться к нему с единым набором функций, причем поведение контекста будет одинаковым независимо от того, с каким устройством он связан.

Примитивы GDI

Основные типы графических объектов часто называют «примитивами». К ним относятся:

– прямые (отрезки) и кривые; GDI поддерживает прямые линии, прямоугольники, эллипсы (включая окружности), дуги и сплайны Безье; более

сложные кривые могут быть изображены как ломаные линии, состоящие из коротких прямых, определяющих кривые; линии рисуются с использованием графического объекта пера, выбранного в контексте устройства;

– закрашенные области; если набор прямых и кривых линий ограничивает со всех сторон некоторую область, то она может быть закрашена с использованием кисти, выбранной в контексте устройства;

– битовые шаблоны (растровые шаблоны, растровые образы) – это двухмерный массив бит, соответствующий пикселам устройства отображения (базовый инструмент растровой графики); битовые образы используются для отображения сложных изображений (значки, курсоры мыши, кнопки панели инструментов);

– текст, отличающийся от других объектов графики. Так как типов текста много и структуры данных, используемые для описания шрифтов (объектов GDI), а также получения информации о них – самые большие среди других структур данных в Windows, поддержка текста – часто наиболее сложная часть в системах компьютерной графики.

Пример вывода текста

Чтобы легче было разобраться в некоторых аспектах работы с графикой в среде Windows, рассмотрим программу, создающую окно, в котором выводится текст «Hello, Windows !» [34].

В тексте программы свыше 80 строк, большая часть из которых является надстройкой и будет повторяться почти в каждой программе для Windows.

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static char szAppName[] = "Hello" ;

HWND hwnd ;

MSG msg ;

WNDCLASSEX wndclass ;

wndclass.cbSize = sizeof (wndclass) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;

wndclass.lpfnWndProc = WndProc ;

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName = szAppName ;

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;

RegisterClassEx (&wndclass) ;

hwnd = CreateWindow (szAppName,

"First Example",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL, NULL,

hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0)) {

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc ;

PAINTSTRUCT ps ;

RECT rect ;

switch (iMsg) {

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

GetClientRect (hwnd, &rect) ;

DrawText (hdc, "Hello, Windows !", -1, &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY :

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, iMsg, wParam, lParam);

}

В программе создается стандартное окно (рис. П 6.1), в центре рабочей области которого выводится текст «Hello, Windows !».

Это окно имеет все свойства Windows: можно захватить указателем мыши заголовок окна и перемещать его по всему экрану, можно изменить размеры окна, можно развернуть и увеличить его до размеров всего экрана, можно свернуть или завершить программу кнопкой закрытия окна.

Программные средства отладки - student2.ru

Рис. П 6.1. Результат программы Hello

Рассмотрим действия данной программы.

Стандартные функции Windows

В программе используются функции, описанные в различных заголовочных файлах из стандартной библиотеки windows.h:

LoadIcon – загружает значок (Icon) для использования в программе;

LoadCursor – загружает курсор (Cursor) мыши;

GetStockObject – получает графический объект – кисть (Stock);

RegisterClassEx – регистрирует класс окна;

CreateWindow – создает окно на основе класса окна;

ShowWindow – выводит окно на экран;

UpdateWindow – заставляет окно перерисовать свое содержимое;

GetMessage – получает сообщение из очереди сообщений;

TranslateMessage – преобразует некоторые сообщения, полученные с помощью клавиатуры;

DispatchMessage – отправляет сообщение оконной процедуре;

BeginPaint – инициирует начало процесса рисования окна;

GetClientRect – получает размер рабочей области окна;

DrawText – выводит на экран строку текста;

EndPaint – прекращает рисование окна;

PostQuitMessage – вставляет сообщение «Завершить» в очередь сообщений;

DefWindowProc – выполняет обработку сообщений по умолчанию.

Наши рекомендации