c ++ - Tegningstekst med GDI +

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har søgt i nogle dage nu for at finde en mulighed for at vise tekst på mit GDI + -program.


Jeg forsøgte at bruge funktionen DrawString() af GDI +, men referencen på MSDN virker ikke, da den ikke stemmer overens med parameterlisten. Jeg bruger Visual C ++ 2010 Express.


Jeg har ændret MSDN-eksemplet for at få det til at kompilere, sådan:


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


Jeg har også forsøgt to andre funktioner:


TextOut(hdc,10,10,TEXT("Text"),6);
DrawText(hdc,TEXT("Text"),0,LPRECT(0),0);


Ingen af ​​dem viser en tekst på skærmen. Tegningslinjer, ellipser mm fungerer uden problemer.


Hvorfor virker ikke ovenstående tekst-tegning rutine arbejde? Kan nogen give et fungerende eksempel?

Bedste reference


Du gør den ret klassiske fejl ved ikke at kontrollere returværdien af ​​Graphics :: DrawString (), det vil fortælle dig, hvad du gjorde forkert. InvalidParameter er ret sandsynligt her. Det er også helt uklart, i hvilken sammenhæng denne kode kører, det er bedre at være inde i WM\_PAINT-meddelelseshåndteringen, eller du vil aldrig se udgangen. Der er heller ikke noget tegn på oprydningskode, da koden lækker objekter dårligt.


Lad os arbejde ud fra et komplet eksempel fra kedepladekode genereret af Win32 Project-skabelonen. Jeg ved, at jeg har fået noget af dette allerede, men det kan være interessant for andre at læse dette svar. Start med at give den nødvendige #includes:


#include <assert.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment (lib, "gdiplus.lib")


Find WinMain-funktionen, vi skal initialisere GDI +:


// TODO: Place code here.
GdiplusStartupInput gdiplusStartupInput;
ULONG\_PTR           gdiplusToken;
Status st = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
assert(st == Ok);
if (st != Ok) return FALSE;


og i slutningen af ​​funktionen efter meddelelsessløjfen:


GdiplusShutdown(gdiplusToken);
return (int) msg.wParam;


Find nu vinduesproceduren (WndProc) og lav WM\_PAINT-sagen ligner denne:


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;


Hvilket producerer dette:


Indtast billedbeskrivelse her


Modificer denne kode, som du finder passende, hævder du, at hævelserne holder dig ude af problemer.

Andre referencer 1


MSDN er din ven (sand ting):
Tegning af en linje - kodeeksempel: kompilere og køre
og
Tegning af en streng - erstatt OnPaint () i den foregående. [8] [9]