лямбда-выражения
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] );
}
Рисование в неклиентской области приводит к автоматическому отключению стекла. Что делает MS Office, так это расширяет клиентскую область до границ. Рекомендации см. В разделе «Рисование в области ЧПУ со стеклом» этой статьи WPF . Боюсь, вам придется конвертировать вызовы API в Delphi самостоятельно.
Ключом является 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);
При всем этом не должно быть слишком сложно добиться того, чего вы хотите.
В Delphi 2009 TLabel имеет новое свойство под названием "GlowSize" ( см. Справку ). Эффект от установки положительного значения для этого свойства очень близок к тому, что вы, кажется, ищете (свечение вокруг текста метки).
Расширение рамки - это одно, а рисование тематического (светящегося) текста 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;
Спасибо за код DrawTextOnGlass. Но чтобы он работал как ожидалось, мне нужно было заменить b.handle
b.canvas.handle
в DrawThemeTextEx