Para incluir si la letra es negrita o itálica:
Código Delphi
[-]function GdiPlusTextOut(Dc: HDC; x, y: Integer; stext: string): Integer;
var
TempDc: HDC;
oldbit, hbit: HBITMAP;
fam: IgpFontFamily;
f: IgpFont;
tm: TTextMetric;
oldfont, newfont: HFONT;
lf: TLogFont;
graphics: IgpGraphics;
r: TGpRectF;
w, h: Integer;
curalign, curstretch, asc, desc: Integer;
style: TgpFontStyle;
begin
Result:= 0;
oldfont:= GetCurrentObject(Dc, OBJ_FONT);
if oldfont = 0 then
exit;
if GetObject(oldfont, sizeof(TLogFont), @lf) = 0 then
exit;
newfont:= CreateFontIndirect(lf);
if newfont = 0 then
exit;
style:= [];
if lf.lfWeight = FW_BOLD then
style:= style + [FontStyleBold];
if lf.lfItalic <> 0 then
style:= style + [FontStyleItalic];
if lf.lfUnderline <> 0 then
style:= style + [FontStyleUnderline];
TempDc:= CreateCompatibleDC(DC);
fam:= tgpfontfamily.Create(lf.lfFaceName);
graphics:= TgpGraphics.Create(Dc);
f:= TGpFont.Create(Dc, newfont);
GetTextMetrics(Dc, tm);
curstretch:= SetStretchBltMode(Dc, COLORONCOLOR);
try
r:= graphics.MeasureString(stext, f, TGpPointF.Create(X, Y));
w:= Ceil(r.Width);
h:= tm.tmHeight;
hbit:= CreateCompatibleBitmap(Dc, w, h);
oldbit:= SelectObject(TempDc, hbit);
oldfont:= SelectObject(TempDc, newfont);
curalign:= SetTextAlign(TempDC, TA_LEFT or TA_TOP);
try
PatBlt(TempDc, 0, 0, w, h, WHITENESS);
SetTextColor(TempDc, GetTextColor(Dc));
SetBkMode(TempDc, TRANSPARENT);
TextOut(TempDc, 0, 0, PChar(stext), Length(stext));
asc:= Round(F.Size * fam.GetCellAscent(style) /
fam.GetEmHeight(style));
desc:= Round(F.Size * fam.GetCellDescent(style) /
fam.GetEmHeight(style));
TransparentBlt(Dc, x, y, w, asc + desc, TempDc, 0, tm.tmAscent - asc,
w, asc + desc, $FFFFFF);
Result:= asc + desc;
finally
SetTextAlign(TempDc, curalign);
SelectObject(TempDC, oldfont);
DeleteObject(newfont);
SelectObject(TempDc, oldbit);
DeleteObject(hbit);
end;
finally
graphics:= nil;
f:= nil;
fam:= nil;
SetStretchBltMode(Dc, curstretch);
DeleteDC(TempDc);
end;
end;