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