Рисование текста с помощью GDI + - PullRequest
5 голосов
/ 04 сентября 2011

Я искал несколько дней, чтобы найти возможность отображать текст в моем приложении 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);

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

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

Ответы [ 2 ]

15 голосов
/ 04 сентября 2011

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

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

#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;

, который производит это:

enter image description here

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

0 голосов
/ 04 сентября 2011

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

...