Здавалка
Главная | Обратная связь

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



В следующем примере показано, как создать и выбрать шрифт с заданными характеристиками. Далее в левом нижнем углу окна приложения с различными наклоном, цветами фона и текста 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);

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.