6

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);

他にも2つの機能を試しました:

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 に答える