4


4

私はVistaが最初にリリースされたときに何年か前にこのことについて質問しましたが、問題を決して解決せず、後で検討するためのものとしてそれを保留にしました。

見栄えを良くするために多大な努力をしたスプラッシュスクリーンがあります。 32bppのアルファブレンディングPNGです。 デスクトップコンポジションがオフになっているときに、Windows XPまたはVistaでうまく機能するコードがいくつかあります(必要に応じて調べてください)。 しかし、Vistaの下では、透明部分はすべて黒くなっています。

だから、私の質問はこれです:誰もがデスクトップのコンポジションを有効にしてもしなくても動作する方法でスプラッシュスクリーンとして32bppのアルファブレンドされたPNGを表示することができたのですか? 必要に応じて、無料で、あるいはその他の方法で、サードパーティ製のコンポーネントを使用することに害はありません。

理想的には、これはDelphi 7で機能します。

更新:以下の答え(非常にうまくいっている)のほかに、私はTMS TAdvSmoothSplashScreenコンポーネントがやや複雑であれば非常によくこのタスクを扱うことを発見しました。

2 Answer


6


Tim、私はVista / D2007で 'Windows Classic’テーマを選択して試してみました。

デルファイのアルファブレンドスプラッシュスクリーン - パート2 http://melander.dk/articles/alphasplash2/2/

私が見ることができる黒い背景はありません…​ それはまだ素晴らしく見えます。


6


Bob Sのリンク先の記事に正しい答えがあります。 その記事はあなたが実際に必要とするかなりの追加の情報を含んでいるので、ここで私がそれを通して作成するフォーム/ユニットがあります(あなたがGraphicExライブラリhttp://www.soft-gems.net/Graphics.phpを必要とすることに注意してください。ここから]:

ユニットSplash2Form。

インタフェース

Windows、メッセージ、SysUtils、バリアント、クラス、グラフィック、コントロール、フォーム、ダイアログ、ExtCtrls、GraphicExを使用します。

type TSplash2 = class(TForm)private {Private declarations}プロシージャPreMultiplyBitmap(Bitmap:TBitmap);パブリックコンストラクタCreate(Owner:TComponent);オーバーライド。 {パブリック宣言}手続きCreateParams(var Params:TCreateParams);オーバーライド;実行する終わり;

var Splash2:TSplash 2;

実装

{$ R * .dfm}

{TSplash2}

コンストラクタTSplash2.Create(所有者:TComponent);継承し始めます。 Brush.Style:= bsClear;終わり;

procedure TSplash2.CreateParams(var Params:TCreateParams);継承し始めます。終わり;

プロシージャTSplash2.Execute; var exStyle:DWORD; BitmapPos:TPoint。 BitmapSize:TSize。 BlendFunction:TBlendFunction; PNG:TPNGグラフィック。ストリーム:TResourceStream。 begin //ウィンドウの階層化を有効にするexStyle:= GetWindowLongA(Handle、GWL_EXSTYLE); (exStyleおよびWS_EX_LAYERED = 0)の場合、SetWindowLong(Handle、GWL_EXSTYLE、exStyle、またはWS_EX_LAYERED)。

PNG:= TPNGGraphic.Create;やってみる

Stream:= TResourceStream.Create(HInstance、 'SPLASH'、RT_RCDATA); PNG.LoadFromStream(Stream)を試してください。最後にStream.Free。終わり;

PreMultiplyBitmap(PNG)。

ClientWidth:= PNG.Width; ClientHeight:= PNG.Height;

BitmapPos:= Point(0、0); BitmapSize.cx:= ClientWidth; BitmapSize.cy:= ClientHeight;

//アルファブレンディングパラメータを設定します。BlendFunction.BlendOp:= AC_SRC_OVER; BlendFunction.BlendFlags:= 0; BlendFunction.SourceConstantAlpha:= 255; BlendFunction.AlphaFormat:= AC_SRC_ALPHA;

// ... そして行動! UpdateLayeredWindow(Handle、0、nil、@BitmapSize、PNG.Canvas.Handle、@BitmapPos、0、@BlendFunction、ULW_ALPHA);

見せる;

いよいよPNG。終わり;終わり;

procedure TSplash2.PreMultiplyBitmap(Bitmap:TBitmap); var Row、Col:整数。 p:PRGBQuad。 PreMult:バイトの配列[byte、byte]。 begin // Rowに対してa * bのすべての可能な値を事前計算します。= 0〜255 Colに対して行う:= Row〜255 do begin PreMult [Row、Col]:= Row * Col div 255; if(Row <> Col)そのときPreMult [Col、Row]:= PreMult [Row、Col]; // a * b = b * a終了。

Row:= 0からBitmap.Height-1の場合は、Col:= Bitmap.Widthを指定します。 p:= Bitmap.ScanLine [行];一方(Col> 0)はp.rgbBlueを開始します。= PreMult [p.rgbReserved、p.rgbBlue]; p.rgbGreen:= PreMult [p.rgbReserved、p.rgbGreen]; p.rgbRed:= PreMult [p.rgbReserved、p.rgbRed]; inc(p); dec(Col);終わり;終わり;終わり;

終わり。