Рисование текста с помощью GDI+

Я искал несколько дней, чтобы найти возможность отображать текст в моем приложении GDI+.

Я пытался использовать функцию DrawString() GDI+, но ссылка на MSDN не работает, так как не совпадает со списком параметров. Я использую Visual C++ 2010 Express.

Я изменил пример MSDN, чтобы он компилировался, например:

LinearGradientBrush* myBrush = new LinearGradientBrush(Rect(0,0,width,height),Color::Red, Color::Yellow, LinearGradientMode::LinearGradientModeHorizontal);
Font* myFont = new Font(hdc);
RectF rect = RectF(10,10,100,100);
graphics.DrawString(TEXT("Look at this text!"),100, myFont,rect,&StringFormat(0,0), myBrush);

Я также попробовал две другие функции:

TextOut(hdc,10,10,TEXT("Text"),6);
DrawText(hdc,TEXT("Text"),0,LPRECT(0),0);

Ни один из них не показывает текст на экране. Рисование линий, эллипсов и т.п. работает без проблем.

Почему описанная выше процедура рисования текста не работает? Кто-нибудь может привести рабочий пример?


person Toast    schedule 04.09.2011    source источник
comment
Почему вы говорите, что строка Look at this text! имеет длину 100 символов?   -  person Seth Carnegie    schedule 04.09.2011
comment
Поменял на 18, тоже не работает.   -  person Toast    schedule 04.09.2011
comment
У меня была проблема с компиляцией, и теперь по крайней мере работает функция textout. Но отрисовка текста не работает.   -  person Toast    schedule 04.09.2011
comment
Откуда вы получаете graphics? Кроме того, почему вы выделяете myBrush на new (я спрашиваю, потому что у вас может быть веская причина, я не снобист)?   -  person Seth Carnegie    schedule 04.09.2011


Ответы (2)


Вы делаете довольно классическую ошибку, не проверяя возвращаемое значение Graphics::DrawString(), это скажет вам, что вы сделали неправильно. Здесь скорее всего InvalidParameter. Также совершенно неясно, в каком контексте выполняется этот код, что лучше сделать внутри обработчика сообщений WM_PAINT, иначе вы никогда не увидите вывод. Также нет доказательств кода очистки, так как код сильно пропускает объекты.

Давайте работать с полным примером, начиная с шаблонного кода, сгенерированного шаблоном проекта Win32. Я знаю, что кое-что из этого уже работает, но другим может быть интересно прочитать этот ответ. Начните с предоставления необходимых #includes:

#include <assert.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment (lib, "gdiplus.lib")

Найдите функцию WinMain, нам нужно инициализировать GDI+:

// TODO: Place code here.
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;
Status st = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
assert(st == Ok);
if (st != Ok) return FALSE;

и в конце функции после цикла сообщений:

GdiplusShutdown(gdiplusToken);
return (int) msg.wParam;

Теперь найдите оконную процедуру (WndProc) и сделайте случай WM_PAINT похожим на этот:

case WM_PAINT: {
    hdc = BeginPaint(hWnd, &ps);
    Graphics gr(hdc);
    Font font(&FontFamily(L"Arial"), 12);
    LinearGradientBrush brush(Rect(0,0,100,100), Color::Red, Color::Yellow, LinearGradientModeHorizontal);
    Status st = gr.DrawString(L"Look at this text!", -1, &font, PointF(0, 0), &brush);
    assert(st == Ok);
    EndPaint(hWnd, &ps);
} break;

Что производит это:

введите здесь описание изображения

Измените этот код по своему усмотрению, утверждения избавят вас от неприятностей.

person Hans Passant    schedule 04.09.2011

MSDN — ваш друг (правда): Строка — пример кода: скомпилируйте и запустите и Рисование строки -- замените OnPaint() в предыдущем.

person SChepurin    schedule 04.09.2011