使用GDI +绘制文本

时间:2011-09-04 12:27:40

标签: c++ windows winapi gdi+ visual-c++-2010-express

我已经搜索了几天,以便找到在我的GDI +应用程序上显示文本的可能性。

我尝试使用GDI +的DrawString()函数,但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 个答案:

答案 0 :(得分:15)

你犯了相当经典的错误,就是不检查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;

产生这个:

enter image description here

根据需要修改此代码,断言可以帮助您摆脱困境。

答案 1 :(得分:0)

MSDN是你的朋友(真实的东西): Drawing a Line - 代码示例:编译并运行 和 Drawing a String - 替换上一个中的OnPaint()。