A frame extension is one thing, and drawing Vista thematic (glowing) text is another. With Canvas.TextOut or DrawText, the output is confused with alpha, which will give the effect you got. You need to use DrawThemeTextEx. Here is the correct procedure for drawing text on glass:
uses Themes, UxTheme; procedure DrawTextOnGlass(Canvas: TCanvas; Text: String; R: TRect); var memoryHdc: HDC; b: TBitmap; dttOpts: TDTTOpts; DR: TRect; bf: TBlendFunction; begin b := TBitmap.Create; try memoryHdc := CreateCompatibleDC(Canvas.Handle); b.Handle := memoryHdc; b.HandleType := bmDIB; b.PixelFormat := pf32bit; b.SetSize(R.Right - R.Left, R.Top - R.Bottom); b.Canvas.Font := Canvas.Font; DR := R; OffsetRect(DR, -DR.Left, -DR.Top); Inflaterect(dr, -5, -5); b.Canvas.Brush.Color := clBlack; b.Canvas.FillRect(DR); dttOpts.dwSize := SizeOf(TDTTOpts); dttOpts.iGlowSize := 8; dttOpts.dwFlags := DTT_COMPOSITED or DTT_GLOWSIZE or DTT_TEXTCOLOR; DrawThemeTextEx(ThemeServices.Theme[teWindow], b.Handle, WP_CAPTION, CS_ACTIVE, Text, -1, DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_NOPREFIX, DR, dttOpts); if GetLastError <> 0 then RaiseLastOSError; bf.BlendOp := AC_SRC_OVER; bf.BlendFlags := 0; bf.SourceConstantAlpha := 255; bf.AlphaFormat := AC_SRC_ALPHA; AlphaBlend(Canvas.Handle, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top, b.Canvas.Handle, 0, 0, R.Right - R.Left, R.Bottom - R.Top, bf); finally b.Free; end; end;
MB.
source share