如何使用像Windows 7这样的aero在vista的标题栏中绘制文本(使用onClick事件)?
alt text http://img529.imageshack.us/img529/3643/immaginembl.jpg
delphi.about.com上的示例无法在带有aero的Vista上运行。你有什么想法吗?
感谢所有人。
抱歉我的英语不好。
答案 0 :(得分:4)
在非客户区域中绘图会导致玻璃自动禁用。 MS Office所做的是扩展客户区域以覆盖边界。查看this WPF article的“在玻璃的NC区域绘图”部分以获取建议。你不得不自己将API调用转换为Delphi,我担心。
答案 1 :(得分:3)
关键是API DwmExtendFrameIntoClientArea
你应该声明它,然后像这样:
DwmExtendFrameIntoClientAreaFunc = function(destWnd: HWND; const pMarInset: PMargins): HRESULT; stdcall;
@fDwmExtendFrameIntoClientArea := GetProcAddress(hDWMDLL, 'DwmExtendFrameIntoClientArea');
您还可以在此处移植代码:Translucent Windows with Aero
如果没有框架,请将其称为:
DWM_ExtendFrameIntoClientArea(Form1.Handle, -1, -1, -1, -1);
所有这一切都不应该难以达到你想要的效果。
答案 2 :(得分:0)
在Delphi 2009中,TLabel有一个名为“GlowSize”的新属性(see help)。为此属性设置正值的效果非常接近您所寻找的(标签文本周围的光晕)。
答案 3 :(得分:0)
扩展框架是一回事,绘制Vista主题(发光)文本是另一回事。使用Canvas.TextOut或DrawText,输出已经搞砸了alpha,这将产生你得到的效果。您需要使用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;
答案 4 :(得分:0)
感谢DrawTextOnGlass代码。但是为了按预期工作,我需要替换b.handle
中的b.canvas.handle
DrawThemeTextEx
答案 5 :(得分:0)
你需要一次调用DwmSetWindowAttribute,之后一切都很简单。查看这篇文章,尤其是评论:) http://delphihaven.wordpress.com/2010/04/22/setting-up-a-custom-title-bar-reprise/