日ごろは大変お世話になっております。
サーバー復旧おめでとうございます。さびしかったです。
さて、A,B,C,Dと画像がトランプのように重なって表示されていて
Aがだんだん薄くなってB
Bがだんだん薄くなってC
というような表示をするプログラムを考えています。
描画にはけっこう時間がかかるようにも思いますがこうした
RGBを段階的に薄くしていってダイレクトに表示するような
方法は具体的にどのようなファンクションで行なうのが良い
のでしょうか。
達人皆様ご教示お願いいたします。
画像表示したあとに全体を薄くしたりしたい場合
AlphaBlend関数が使えるようです。
[ここをクリックすると内容が表示されます]
コード: 全て選択
Const AC_SRC_OVER=0
Const AC_SRC_ALPHA=1
Type BLENDFUNCTION
BlendOp As Byte'ブレンド操作(常にAC_SRC_OVER)
BlendFlags As Byte'常に0
SourceConstantAlpha As Byte'コピー元のビットマップ全体に適用するアルファ値
AlphaFormat As Byte'コピー元のビットマップがアルファ値を持つときAC_SRC_ALPHA
End Type
TypeDef _BLENDFUNCTION=DWord
'AB423でコンパイルできる事は確認したけど、関数のオーバーロードが出来るようになったのっていつだっけ?
Function Get_BLENDFUNCTION(ByRef bf As BLENDFUNCTION) As _BLENDFUNCTION
Get_BLENDFUNCTION=GetDWord(VarPtr(bf))
End Function
Function Get_BLENDFUNCTION(bf As *BLENDFUNCTION) As _BLENDFUNCTION
Get_BLENDFUNCTION=GetDWord(bf)
End Function
Declare Function AlphaBlend Lib "msimg32.dll" (_
hdcDest As HDC,nXOriginDest As DWord,nYOriginDest As DWord,nWidthDest As DWord,hHeightDest As DWord,_
hdcSrc As HDC,nXOriginSrc As DWord,nYOriginSrc As DWord,nWidthSrc As DWord,nHeightSrc As DWord,_
blendFunction As _BLENDFUNCTION) As Long
'定義ここまで
#prompt
Line (0,0)-Step(100,100),4,bf
Line (110,0)-Step(100,100),2,bf
Dim hDC As HDC,bf As BLENDFUNCTION
hDC=GetDC(_PromptSys_hWnd)
bf.BlendOp=AC_SRC_OVER
bf.BlendFlags=0
bf.AlphaFormat=0
bf.SourceConstantAlpha=255
AlphaBlend(hDC,220,0,100,100,hDC,0,0,100,100,Get_BLENDFUNCTION(bf))
bf.SourceConstantAlpha=128
AlphaBlend(hDC,220,0,100,100,hDC,110,0,100,100,Get_BLENDFUNCTION(bf))
ReleaseDC(_PromptSys_hWnd,hDC)
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
画像を薄くしていくBLEND
なるほど良く分かりました。
しかし、BLENDの関数内の設定が良く分からないのですが
やはりこの数値の設定はRGB別々に行なうようでしょうか。
下記のプログラム変更で確認してみましたが変化させているのは
Bのみと思っています。RGBを同時に低減させて黒くしたりすることで
BLENDの機能が実現できそうです。
しかし、BLENDの関数内の設定が良く分からないのですが
やはりこの数値の設定はRGB別々に行なうようでしょうか。
下記のプログラム変更で確認してみましたが変化させているのは
Bのみと思っています。RGBを同時に低減させて黒くしたりすることで
BLENDの機能が実現できそうです。
コード: 全て選択
Const AC_SRC_OVER=0
Const AC_SRC_ALPHA=1
Type BLENDFUNCTION
BlendOp As Byte'ブレンド操作(常にAC_SRC_OVER)
BlendFlags As Byte'常に0
SourceConstantAlpha As Byte'コピー元のビットマップ全体に適用するアルファ値
AlphaFormat As Byte'コピー元のビットマップがアルファ値を持つときAC_SRC_ALPHA
End Type
TypeDef _BLENDFUNCTION=DWord
'AB423でコンパイルできる事は確認したけど、関数のオーバーロードが出来るようになったのっていつだっけ?
Function Get_BLENDFUNCTION(ByRef bf As BLENDFUNCTION) As _BLENDFUNCTION
Get_BLENDFUNCTION=GetDWord(VarPtr(bf))
End Function
Function Get_BLENDFUNCTION(bf As *BLENDFUNCTION) As _BLENDFUNCTION
Get_BLENDFUNCTION=GetDWord(bf)
End Function
Declare Function AlphaBlend Lib "msimg32.dll" (_
hdcDest As HDC,nXOriginDest As DWord,nYOriginDest As DWord,nWidthDest As DWord,hHeightDest As DWord,_
hdcSrc As HDC,nXOriginSrc As DWord,nYOriginSrc As DWord,nWidthSrc As DWord,nHeightSrc As DWord,_
blendFunction As _BLENDFUNCTION) As Long
'定義ここまで
#prompt
Line (0,0)-Step(100,100),4,bf
Line (110,0)-Step(100,100),2,bf
Dim hDC As HDC,bf As BLENDFUNCTION
Dim i as Long,t as Long
hDC=GetDC(_PromptSys_hWnd)
bf.BlendOp=AC_SRC_OVER
bf.BlendFlags=0
bf.AlphaFormat=0
bf.SourceConstantAlpha=255
AlphaBlend(hDC,220,0,100,100,hDC,0,0,100,100,Get_BLENDFUNCTION(bf))
for i=1 to 128
bf.SourceConstantAlpha=i
AlphaBlend(hDC,220,0,100,100,hDC,110,0,100,100,Get_BLENDFUNCTION(bf))
for t=1 to 10000000:Next t
Next i
ReleaseDC(_PromptSys_hWnd,hDC)