6

Windows 7 のような aero を使用して、Vista のキャプション バーに (onClick イベントを使用して) テキストを描画するにはどうすればよいですか?

代替テキスト http://img529.imageshack.us/img529/3643/imaginembl.jpg

delphi.about.comの例は、 Aero を使用する Vista では機能しません。あなたはなにか考えはありますか?

ありがとうございます。

私の悪い英語でごめんなさい。

4

6 に答える 6

4

非クライアント領域で描画すると、ガラスが自動的に無効になります。MS Office が行うことは、国境をカバーするためにクライアント リージョンを拡張することです。提案については、この WPF 記事の「ガラスを使用した NC 領域での描画」セクションを参照してください。残念ながら、API 呼び出しを Delphi に自分で変換する必要があります。

于 2009-07-22T21:11:35.773 に答える
3

キーは API DwmExtendFrameIntoClientArea です

それを宣言して、次のように取得する必要があります。

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

また、コードは既にここに移植されています: Aero を使用した半透明の Windows

フレームがない場合は、次のように呼び出します。

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

これらすべてがあれば、あなたが望むものを達成するのは難しくありません。

于 2009-07-23T05:34:44.983 に答える
0

DwmSetWindowAttributeを1回呼び出す必要があります。その後は、すべてが非常に簡単です。この記事と特にコメントを確認してください:) http://delphihaven.wordpress.com/2010/04/22/setting-up-a-custom-title-bar-reprise/

于 2010-11-22T20:35:42.413 に答える
0

フレームを拡張することと、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;
于 2009-11-18T15:57:07.430 に答える
0

Delphi 2009 では、TLabel に「GlowSize」という新しいプロパティがあります(ヘルプを参照)。このプロパティに正の値を設定した場合の効果は、探しているもの (ラベルのテキストの周りの輝き) に非常に近いものになります。

于 2009-07-24T20:23:51.073 に答える
0

DrawTextOnGlass コードをありがとう。しかし、期待どおりに動作するには、次のように置き換える必要がありましb.handle b.canvas.handleDrawThemeTextEx

于 2010-05-31T17:59:31.820 に答える