6

我已经搜索了几天,以找到在我的 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);

它们都没有在屏幕上显示文本。画线、椭圆等可以毫无问题地工作。

为什么上面的文本绘图例程不起作用?任何人都可以提供一个工作示例吗?

4

2 回答 2

18

您犯了一个相当经典的错误,即不检查 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;

产生这个:

在此处输入图像描述

按照您认为合适的方式修改此代码,断言将使您摆脱麻烦。

于 2011-09-04T14:11:22.643 回答
1

MSDN 是你的朋友(真实的东西): 画一条线- 代码示例:编译并运行并 绘制一个字符串- 替换上一个中的 OnPaint()。

于 2011-09-04T13:24:13.323 回答