Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > GlassFrame + PageControl: прозрачные заголовки.


Автор: TheTipTop 25.10.2011, 16:22
Здравствуйте.

Делаю приложение, в котором вкладки PageControl должны располагаться на "стекле". Но есть одна небольшая, но очень неприятная проблема - сквозь текст просвечивает все, что находится под ним - эффекты стекла, нижние окна или рабочий стол. На скрине хорошо видно, как портит текст лежащая на рабочем столе папка.

С расположенными на стекле TLabel помогает установка GlowSize, но в данном случае использование функции DrawThemeTextEx с GlowSize не дает нормального результата. Прозрачность у текста присутствует всегда, независимо от его цвета. Кто-нибудь знает, в какую сторону копать?

Delphi 2010, Win7.

Автор: TheTipTop 28.10.2011, 13:08
Сам спросил - сам ответил smile 
Достаточно добавить промежуточное изображение BMP, отрисовать текст на нем и скопировать полученное изображение на вкладку.
Функция-прослойка для отображения текста выглядит так:

Код

procedure DrawGlassText(Canvas: TCanvas; GlowSize: Integer; var Rect: TRect;
  var Text: UnicodeString; Format: DWORD); overload;
var
  DTTOpts: TDTTOpts;
  Color: TColor;
  BMP: TBitMap;
  RectBMP: TRect;
begin
  if GetWinVersion < wvWinVista then
  begin
    DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), Rect, Format);
    Exit;
  end;
  ZeroMemory(@DTTOpts, SizeOf(DTTOpts));
  DTTOpts.dwSize := SizeOf(DTTOpts);
  DTTOpts.dwFlags := DTT_COMPOSITED or DTT_TEXTCOLOR;
  DTTOpts.iTextShadowType := TST_NONE;
  DTTOpts.iBorderSize := 0;
  DTTOpts.fApplyOverlay := True;
  if Format and DT_CALCRECT = DT_CALCRECT then
    DTTOpts.dwFlags := DTTOpts.dwFlags or DTT_CALCRECT;
  Color := ColorToRGB(Canvas.Font.Color);
  DTTOpts.crText := Color;
  if GlowSize > 0 then
  begin
    DTTOpts.dwFlags := DTTOpts.dwFlags or DTT_GLOWSIZE;
    DTTOpts.iGlowSize := GlowSize;
  end;
  BMP := TBitMap.Create;
  BMP.PixelFormat := pf32bit;
  BMP.Width := Rect.Right - Rect.Left;
  BMP.Height := Rect.Bottom - Rect.Top;
  RectBMP := Classes.Rect(0, 0, BMP.Width, BMP.Height);
  BMP.Canvas.Brush := Canvas.Brush;
  BMP.Canvas.FillRect(RectBMP);
  with ThemeServices.GetElementDetails(teEditTextNormal) do
    DrawThemeTextEx(ThemeServices.Theme[teEdit], BMP.Canvas.Handle, Part,
      State, PWideChar(Text), Length(Text), Format, @RectBMP, DTTOpts);
  RectBMP := Classes.Rect(0, BMP.Height, BMP.Width, 0);
  Canvas.CopyRect(Rect, BMP.Canvas, RectBMP);
  BMP.Free;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)