Delphi: Нарисуйте текст в форме подписи для перспективы с аэро как окна 7

лямбда-выражения

Func<int, int, int> add = (a, b) => (a + b);

неясные форматы строки

Console.WriteLine("{0:D10}", 2); // 0000000002

Dictionary<string, string> dict = new Dictionary<string, string> { 
    {"David", "C#"}, 
    {"Johann", "Perl"}, 
    {"Morgan", "Python"}
};

Console.WriteLine( "{0,10} {1, 10}", "Programmer", "Language" );

Console.WriteLine( "-".PadRight( 21, '-' ) );

foreach (string key in dict.Keys)
{
    Console.WriteLine( "{0, 10} {1, 10}", key, dict[key] );             
}
6
задан RRUZ 11 October 2009 в 06:15
поделиться

5 ответов

Рисование в неклиентской области приводит к автоматическому отключению стекла. Что делает MS Office, так это расширяет клиентскую область до границ. Рекомендации см. В разделе «Рисование в области ЧПУ со стеклом» этой статьи WPF . Боюсь, вам придется конвертировать вызовы API в Delphi самостоятельно.

4
ответ дан 17 December 2019 в 00:12
поделиться

Ключом является API DwmExtendFrameIntoClientArea

Вы должны объявить его и получить его следующим образом:

DwmExtendFrameIntoClientAreaFunc = function(destWnd: HWND; const pMarInset: PMargins): HRESULT; stdcall; 
@fDwmExtendFrameIntoClientArea := GetProcAddress(hDWMDLL, 'DwmExtendFrameIntoClientArea'); 

У вас также есть код, уже перенесенный сюда: Полупрозрачная Windows с Aero

Чтобы не было рамки, вы называете это так:

DWM_ExtendFrameIntoClientArea(Form1.Handle, -1, -1, -1, -1);

При всем этом не должно быть слишком сложно добиться того, чего вы хотите.

3
ответ дан 17 December 2019 в 00:12
поделиться

В Delphi 2009 TLabel имеет новое свойство под названием "GlowSize" ( см. Справку ). Эффект от установки положительного значения для этого свойства очень близок к тому, что вы, кажется, ищете (свечение вокруг текста метки).

0
ответ дан 17 December 2019 в 00:12
поделиться

Расширение рамки - это одно, а рисование тематического (светящегося) текста Vista - другое. С Canvas.TextOut или DrawText на выходе испорчена альфа, что даст тот эффект, который вы получили. Вам нужно использовать DrawThemeTextEx. Вот правильная процедура рисования текста на стекле:

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;
0
ответ дан 17 December 2019 в 00:12
поделиться

Спасибо за код DrawTextOnGlass. Но чтобы он работал как ожидалось, мне нужно было заменить b.handle b.canvas.handle в DrawThemeTextEx

0
ответ дан 17 December 2019 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: