Для вывода текста в окно нельзя использовать функции стандартной библиотеки, поскольку эти
функции ориентированы на консольный вывод. 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 | Прямоугольная область с заголовком. |