估计是这里错了,盒子:http://bbs.2ccc.com/topic.asp?topicid=512036 procedure TTextLayoutGDIPlus.DoRenderLayout; var I: Integer; LRegion: TRegion; LScale: Single; LHFont: HFONT; begin if (FStringFormat = nil) or (FGraphics = nil) then Exit;
FreeAndNil(FGPFont); if LayoutCanvas <> nil then LScale := TCanvasGdiPlus(LayoutCanvas).FFontScale else LScale := 1; LHFont := CreateFont(-Round(Font.Size * LScale), 0, 0, 0, FontWeightToWinapi(Font.StyleExt.Weight), DWORD(not Font.StyleExt.Slant.IsRegular), DWORD(TFontStyle.fsUnderline in Font.StyleExt.SimpleStyle), DWORD(TFontStyle.fsStrikeOut in Font.StyleExt.SimpleStyle), 0, 0, 0, 0, 0, PChar(Font.Family)); try FGPFont := TGPFont.Create(GetDC(0), LHFont); finally DeleteObject(LHFont); end; if FGPFont = nil then FGPFont := TGPFont.Create(TCanvasGdiPlus(LayoutCanvas).FGPFamily, Font.Size * LScale, vgStyleToGPStyle(Font.StyleExt), UnitPoint); //Word wrap and trimming if WordWrap then FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags and not StringFormatFlagsNoWrap) else FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or StringFormatFlagsNoWrap); case Trimming of TTextTrimming.None: FStringFormat.SetTrimming(StringTrimmingNone); TTextTrimming.Character: FStringFormat.SetTrimming(StringTrimmingEllipsisCharacter); TTextTrimming.Word: FStringFormat.SetTrimming(StringTrimmingEllipsisWord); end; if RightToLeft then FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or StringFormatFlagsDirectionRightToLeft); case HorizontalAlign of TTextAlign.Center: FStringFormat.SetAlignment(StringAlignmentCenter); TTextAlign.Leading: FStringFormat.SetAlignment(StringAlignmentNear); TTextAlign.Trailing: FStringFormat.SetAlignment(StringAlignmentFar); end; case VerticalAlign of TTextAlign.Center: FStringFormat.SetLineAlignment(StringAlignmentCenter); TTextAlign.Leading: FStringFormat.SetLineAlignment(StringAlignmentNear); TTextAlign.Trailing: FStringFormat.SetLineAlignment(StringAlignmentFar); end; //Measuring text size LRegion := MeasureRange(0, Max(Text.Length, 1)); if Length(LRegion) > 0 then begin for I := 1 to High(LRegion) do LRegion[0].Union(LRegion[I]); FLeft := LRegion[0].Left; FTop := LRegion[0].Top; FWidth := LRegion[0].Width; FHeight := LRegion[0].Height; end; end;
if FGPFont = nil then FGPFont := TGPFont.Create(TCanvasGdiPlus(LayoutCanvas).FGPFamily, Font.Size * LScale, vgStyleToGPStyle(Font.StyleExt), UnitPoint); //Word wrap and trimming if WordWrap then FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags and not StringFormatFlagsNoWrap) else FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or StringFormatFlagsNoWrap); case Trimming of TTextTrimming.None: FStringFormat.SetTrimming(StringTrimmingNone); TTextTrimming.Character: FStringFormat.SetTrimming(StringTrimmingEllipsisCharacter); TTextTrimming.Word: FStringFormat.SetTrimming(StringTrimmingEllipsisWord); end; if RightToLeft then FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or StringFormatFlagsDirectionRightToLeft); case HorizontalAlign of TTextAlign.Center: FStringFormat.SetAlignment(StringAlignmentCenter); TTextAlign.Leading: FStringFormat.SetAlignment(StringAlignmentNear); TTextAlign.Trailing: FStringFormat.SetAlignment(StringAlignmentFar); end; case VerticalAlign of TTextAlign.Center: FStringFormat.SetLineAlignment(StringAlignmentCenter); TTextAlign.Leading: FStringFormat.SetLineAlignment(StringAlignmentNear); TTextAlign.Trailing: FStringFormat.SetLineAlignment(StringAlignmentFar); end; //Measuring text size LRegion := MeasureRange(0, Max(Text.Length, 1)); if Length(LRegion) > 0 then begin for I := 1 to High(LRegion) do LRegion[0].Union(LRegion[I]); FLeft := LRegion[0].Left; FTop := LRegion[0].Top; FWidth := LRegion[0].Width; FHeight := LRegion[0].Height; end; end;
----------------------------------------------
-
procedure TForm20.Button1Click(Sender: TObject); var DC: HDC; i: integer; begin for i := 0 to 10000 do begin DC := GetDC(0); ReleaseDC(0, DC); end; end; 我测试了,如果执行ReleaseDC,则任务管理器中gdi对象正常,不执行ReleaseDC,就会建立9998个对象,结果:Win10不自动释放gdi对象.
----------------------------------------------
-我的博客