AlphaBlendでMoveMemoryを使用しないとうまくいかない理由

解決


tucky  2003-12-15 20:24:04  No: 80908

はじめまして。tuckyといいます。
AlphaBlendについてどうしてもわからないことがあったので質問させていただきます。
AlphaBlendを使用する際に、単にBLENDFUNCTIONのSourceConstAlphaに数値を代入してそのままAlphaBlendに渡すだけではうまくいかないのはなぜでしょうか?

因みに下記のようにするとうまくいくのがわかっています。

Dim Bld As BLENDFUNCTION
Dim LngBld As Long

Bld.SourceConstAlpha = 60
MoveMemory LngBld,Bld,Len(LenBld)
AlphaBlend 〜,ByVal LngBld

尚、ByVal LngBldの部分は、宣言文ではBLENDFUNCTION As Anyとなっています。


魔界の仮面弁士  2003-12-15 20:44:47  No: 80909

ByVal/ByRefの問題でしょう。

今回の AlphaBlend や、WindowFromPoint APIなどのように、
構造体を値渡しする事が要求される場合は、呼び出し方に工夫が必要です。

なぜならVB6では、ユーザー定義型を「値渡し」する事はできないからです。
(ユーザー定義型の引数は、全て「参照渡し」になります)

今回のように、「構造体の値渡し」が要求される場合は、ユーザー定義型を使うのではなく、
提示された方法のように、構造体と同サイズの変数を用意しておき、そこに、
MoveMemory で複写した値をByValで渡すという方法で回避してください。

あるいは、構造体要素の値をスタックに積み上げて配置する手法もあります。

例えば、WindowFromPointXY の場合は、引数を「ByVal Point As POINTAPI」などと
定義する事ができないため、それを展開して、
  Declare Function WindowFromPoint Lib "User32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
などと記述するのが常套手段となっています。


岡田 之仁  2003-12-15 20:46:20  No: 80910

要はこういうことですか・・・

http://hp.vector.co.jp/authors/VA015521/sample/sample_88.html

ご参考までに・・・

以上。


tucky  2003-12-15 23:50:05  No: 80911

>魔界の仮面弁士 さん
>岡田 之仁 さん

そういうことでしたか。
わかりました。
有難うございました。

一応質問文内の訂正を…
SourceConstAlpha →  SourceConstantAlpha
LenBld           →  LngBld


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加