簡體   English   中英

使用GDI +繪制文本

[英]Drawing Text with 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);

他們都沒有在屏幕上顯示文字。 繪圖線,橢圓等工作沒有問題。

為什么上面的文字繪圖例程不起作用? 任何人都能提供一個有效的例子嗎?

你正在犯這個相當經典的錯誤,就是不檢查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;

產生這個:

在此輸入圖像描述

根據需要修改此代碼,斷言將使您免於麻煩。

MSDN是你的朋友(真實的事情): 繪制一行代碼示例:編譯並運行和繪制字符串 - 替換前一個中的OnPaint()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM