В следующем примере показано, как создать и выбрать шрифт с заданными характеристиками. Далее в левом нижнем углу окна приложения с различными наклоном, цветами фона и текста 10 раз выводится один и тот же текст.
Листинг 3.6. Пример вывода текста.
#include <windows.h>
#include <tchar.h>
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
TCHAR szClass[] = TEXT("TextOutClass");
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
HWND hwnd;
hInstance = hInst;
if (!RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE;
hwnd = CreateWindow(szClass, TEXT("Вывод текста"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0,0, hInstance, NULL);
if (!hwnd) return FALSE;
while(GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
return msg.wParam;
}
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc;
wc.hInstance = hInstance;
wc.lpszClassName = szName;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(brBackground +1);
wc.lpszMenuName = NULL;
return (RegisterClass(&wc)!= 0);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
TCHAR szFont[]= TEXT("Какой-либо текст");
|
|
static short cyClient;
switch (msg)
{
case WM_SIZE: { cyClient = HIWORD(lParam); return 0; }
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
static LOGFONT lf;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfPitchAndFamily = DEFAULT_PITCH;
_tcscpy(lf.lfFaceName, TEXT("Times New Roman"));
lf.lfHeight = 20;
lf.lfWeight = FW_BOLD;
for(int i=0; i<10; i++)
{
lf.lfOrientation = lf.lfEscapement = i*100;
HFONT hNFont = CreateFontIndirect(&lf);
HFONT hOFont = (HFONT)SelectObject(hdc, hNFont);
SetTextColor(hdc, RGB(i*15, i*20, i*25));
SetBkColor(hdc, RGB(255-i*15, 255-i*20, 255-i*25));
TextOut(hdc, 0, cyClient-30, szFont, _tcslen(szFont));
SelectObject(hdc, hOFont);
DeleteObject(hNFont);
}
EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY: { PostQuitMessage(0); return 0; }
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
В ветви обработки сообщения WM_PAINT создают логический шрифт с именем lf:
static LOGFONT lf;
и задают значения его полей. Слово static гарантирует, что изначально все поля инициированы нулем.
Далее определяют значения тех полей, которые описывают нужные характеристики шрифта. Причем часть полей определяют в теле цикла для разных значений i:
lf.lfOrientation = lf.lfEscapement = i*100;
При i = 9 угол наклона базовой линии шрифта будет равен 90 градусам.
После задания нужных характеристик логического шрифта создают шрифт и выбирают его в контекст отображения:
hNFont = CreateFontIndirect(&lf);
hOFont=(HFONT)SelectObject(hdc, hNFont);
Затем устанавливают цвет вывода текста и цвет фона операции вывода:
SetTextColor(hdc, RGB(i*15, i*20, i*25));
SetBkColor(hdc, RGB(255-i*15, 255-i*20, 255-i*25));
Этим завершают процедуру установки атрибутов контекста отображения. Теперь можно вывести текст:
TextOut(hdc, 0, cyClient-30, szFont, strlen(szFont));
Шрифт hNFont больше не нужен. Поэтому в контекст выбираем предыдущий шрифт и удаляем шрифт hNFont:
SelectObject(hdc.hOFont);
DeleteObject(hNFont);
Освобождают контекст отображения:
EndPaint(hwnd, &ps);