2011-09-04 85 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

你認爲合適的修改此代碼時,聲稱將讓你擺脫困境。