【问题标题】:Delphi: Draw a text in a caption form for vista with aero like windows 7Delphi:在 Windows 7 中使用 aero 为 vista 以标题形式绘制文本
【发布时间】:2010-11-13 04:26:31
【问题描述】:

如何在 vista 上的标题栏中绘制文本(带有 onClick 事件),如 Windows 7 一样?

alt text http://img529.imageshack.us/img529/3643/immaginembl.jpg

delphi.about.com 的示例不适用于带有 Aero 的 Vista。你有什么想法吗?

谢谢大家。

对不起,我的英语不好。

【问题讨论】:

  • 你的英语有什么不好?

标签: delphi aero nonclient


【解决方案1】:

在非客户区域绘图会导致玻璃自动禁用。 MS Office 所做的是扩展客户区域以覆盖边界。查看this WPF article 的“用玻璃在 NC 区域绘图”部分以获取建议。恐怕您必须自己将 API 调用转换为 Delphi。

【讨论】:

【解决方案2】:

关键是APIDwmExtendFrameIntoClientArea

你应该这样声明它并得到它:

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);

有了这一切,实现你想要的应该不难。

【讨论】:

  • 谢谢。 .. DWM_ExtendFrameIntoClientArea(Form3.Handle, -1, -1, -1, -1); Canvas.TextOut(80,10,'文本客户区'); Canvas.TextOut(80,-8,'文本非客户区');产生这个结果:img11.imageshack.us/img11/697/immaginetxz.jpg 我在哪里犯错了?非常感谢
【解决方案3】:

在 Delphi 2009 中,TLabel 有一个名为“GlowSize”的新属性 (see help)。为这个属性设置一个正值的效果非常接近您想要的效果(标签文本周围的光晕)。

【讨论】:

  • 与 Windows Vista/7 产生的真实发光相比,这个 GlowSize 属性产生了非常难看的结果。
  • 这个 gloomsize 属性没有做任何事情,除了告诉 Vista 做什么。
【解决方案4】:

您需要一次调用 DwmSetWindowAttribute,之后一切都变得非常简单。检查这篇文章,尤其是 cmets :) http://delphihaven.wordpress.com/2010/04/22/setting-up-a-custom-title-bar-reprise/

【讨论】:

    【解决方案5】:

    扩展框架是一回事,绘制 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;
    

    【讨论】:

    • 这对我不起作用,它给出“调用操作系统功能失败”?
    • 我想知道为什么在没有任何 IF 语句的情况下调用 RaiseLastOsError?
    • 我在 delphi 7 上,我在哪里可以找到 TDTTOpts?
    • Delphi 7 没有足够的主题支持单独与 Win7 + glass 一起工作,但您可能可以在野外找到一些第三方“主题和 aero”代码。最简单的方法是升级你古老的 Delphi 7。
    【解决方案6】:

    感谢 DrawTextOnGlass 代码。但要按预期工作,我需要将 b.handle b.canvas.handle 替换为 DrawThemeTextEx

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多