2011-09-04 49 views
4

我已经搜索了几天,现在可以在我的GDI +应用程序中找到显示文本的可能性。使用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); 

他们没有显示在屏幕上的文本。画线,椭圆等没有问题。

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

+0

为什么你说字符串“看这个文本!”是100个字符长? –

+0

我把它改为18,但它也不起作用。 – Toast

+0

我有一个编译问题,现在至少textout函数工作。但是drawtext不起作用。 – Toast

回答

13

你正在做一个相当经典的错误,不检查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

你认为合适的修改此代码时,声称将让你摆脱困境。