Вывод текста в окно. Контекст отображения

Для вывода текста в окно нельзя использовать функции стандартной библиотеки, поскольку эти

функции ориентированы на консольный вывод. Windows и параллельно работающие программы должны совместно использовать экран, для этого они создают перекрывающие и перемещающие окна. Windows следит за перемещением окон и извещает приложения о необходимости перерисовки окна. В этом случае в очередь приложений записывается сообщение с кодом WN_PAINT. Приложение разрабатывается таким образом, чтобы весь вывод в окно осуществлялся при обработке сообщения WM_PAINT. Изображение, созданное при обработке других сообщений будет закрашено. Если логика работы приложения требует изменить содержимое окна в другой точке программы, то в этом случае необходимо вызвать функцию UpdateWindow(HWND hwnd) и передать ей идентификатор окна.

Контекст отображений. Приложения должны хранить информацию о своем текущем состоянии, пользуясь которой функция окна может в любой момент перерисовать свое окно.

Структура данных, описывающая состояния окна, называется контекстом отображения. В этой структуре находятся отображения окна, такие как: цвет фона, цвет текста, толщина и вид линий и т.д. Контекст отображения используется функциями интерфейса графических устройств GDI, которые являются подмножеством WINAPI32. Перед выводом в окно приложение должно создать контекст отображения. Windows заполнит структуру значениями по умолчанию. Приложение может переопределять отдельные значения полей. После окончания вывода, приложение должно вызвать функцию, освобождающую контекст. С этой целью при обработке сообщений используются BeginPaint и EndPaint. При обработке других сообщений используются GetDC и ReleaseDC.

Функция вывода текста в окно:

1) BOOL TextOut(HDC hdc, int xstart, int ystart, LPCSTR string, int len); // hdc – контекст отображения.

2) Int WINAPI DrawText(HDC hdc, LPCSTR string, int len, RECTFAR *r, UNIT format);

3) COLOREF WINAPI SetTextColor(HDC, COLOREF);

Пример функции:

HDC hdc, PAINTSTRUCT ps;

switch (msg)

{

case WM_PAINT:

{

hdc = BeginPaint(hwnd, &ps);

TextOut(hdc, 10, 20, “Сообщение”, 18);

EndPaint(hwnd, &ps);

return 0;

}

break;

case WM_LBUTTONDOWN:

{

hdc = GetDC(hwnd);

TextOut(hdc, 30, 40, “Сообщение”, 24);

ReleaseDC(hwnd, hdc);

return 0;

}

}

Стили окна. Приложение, использующее предопределенные в Windows стили окна.

Стиль окна уточняет внешний вид и поведение отдельного окна. Существует 3 основных стиля:

перекрывающийся, временный и дочерний.

1) Перекрывающийся – используется в качестве главного окна приложения. Имеет заголовок и

рамку. Дополнительно может иметь системное меню, кнопки изменения размера и сворачивания в пиктограмму. Приложение может создавать несколько перекрывающийся окон, одно из которых может содержать другое. Если окно-хозяин сворачивается в пиктограмму, то все окна, которыми он владеет, становятся невидимыми. При уничтожении окна автоматически уничтожаются и все принадлежащие ему окна. Окно, не имеющее владельца, располагается в любом месте экрана и имеет любые размеры. Подчиненные окна всегда располагаются на поверхности окна владельца. Координаты создаваемых перекрывающихся окон указываются по отношению ко всему экрану.

2) Временные – используются для вывода информационных сообщений. Они могут не иметь

заголовка. Все свойства, связанные с владельцем и расположением на экране перекрывающихся окон справедливы и для временных.

3) Дочерние - используются для создания органов управления, таких как кнопки и переключатели. В отличие от перекрывающийся окон, дочерние окна не имеют изначально ни рамки, ни заголовка. Дочерние окна сами рисуют все, что в них изображается. Они всегда располагаются на поверхности окна-родителя. Дочерние окна не выходят за пределы родительского окна и перемещаются вместе с ним. При создании дочернего окна начало системы координат находится в левом верхнем углу окна-родителя.

Таблица стилей.

1) Стандартный стиль перекрывающихся окон:

WS_OVERLAPPERDWINDOW = WS_OVERLAPPED;

WS_CAPTION;

WS_SYSMENU;

WS_THICKFRAME;

WS_MINIMIZBOX;

WS_MAXIMIZBOX;

2) Стандартный стиль всплывающего окна:

WS_POPUPWINDOW = WS_POPUP;

WS_VORDER;

WS_SYSMENU;

WS_CHILD – базовый стиль дочернего окна.

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

Button – кнопка;

Edit – текстовый редактор;

Static – надпись;

Listbox – список;

Scrollbar – полоса прокрутки;

Combobox;

Пример: Приложение, создающее в своем окне однострочный редактор текста и кнопку с надписью “OK”. После ввода текста и нажатия кнопки на экране появляется сообщение, состоящее из введенного текста. До функции WinMain определяем именованные константы:

#define ID_EDIT 1;

#define ID_BUTTON 2;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)

{

static HWND hEdit;

static HWND hButton;

switch (msg)

{

case WM_CREATE:

{

hEdit = CreateWindow(“edit”, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 30, 30, 300, 30, hwnd, (HMENU)ID_EDIT, NULL);

hButton = CreateWindow(“button”, NULL, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 50, 50, 100, 100, hwnd, (HMENU)ID_BUTTON, NULL);

return 0;

}

break;

case WM_SETFOCUS:

{

SetFocus(hEdit);

return 0;

}

break;

case WM_COMMAND:

{

if (wp == ID_EDIT)

if (HIWORD(lp) == EN_ERRSPACE)

MessageBox(hwnd, “мало памяти”, “”, MB_OK);

else if (wp == ID_BUTTON)

{

BYTE chBuff[80];

WORD Text;

*(WORD*) chBuff = sizeif(chBuff); // запись в первое слово буфера его // размера в байтах

cbText – SendMessage(hEdit, EM_GETLINE, 0, (LPSTR)chBuff);

chBuff[cbText] = ‘\0’;

MessageBox(hwnd, chBuff, “”, MB_OK);

return 0;

}

}
}

}

Стиль Описание
BS_3STATE Переключатель с 3ия состояниями: включено, выключено, неактивно.
BS_AUTO3STATE 3 состояния: состоянии переключаются автоматически.
BS_AUTOCHECKBOX Состояния меняются автоматически.
BS_AUTORADIOBUTTON Состояния меняются автоматически.
BS_CHECKBOX 2 состояния: включено/выключено.
BS_DEFPUSHBUTTON Командная кнопка.
BS_GROUPBOX Прямоугольная область с заголовком.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: