PSet、PointをAPIでどう置き換えたら。

解決


かず  2001-09-30 14:16:19  No: 74876  IP: [192.*.*.*]

ちょくちょく、おじゃまさしてもらってます。

通常イラストの描画でマスク画像を用意して
API関数のBitBlt でやっていたのですが、
マスク画像を用意するのが手間なので特定の色(ラベルのバックカラー)を
描画せずに、重ね描きしてマスク代わりにしようと思っています。
    
そこで、以下のソースですが、

For x% = 0 To XM%
    For y% = 0 To YM%
        I = Picture1.Point(x%, y%)
        If I& <> Label1.BackColor Then
            Picture2.PSet (Label1.Left + x%, Label1.Top +  y%),I        
            End If
    Next y%
Next x%

PSet、Pointでは、バカ遅です。

PSet、PointをAPIでどう置き換えたらいいでしょうか。

編集 削除
こころ  URL  2001-09-30 20:00:07  No: 74877  IP: [192.*.*.*]

GetPixel,SetPixelが該当しますが
これでも激遅なんですけどね。

二色ビットマップにBitBltするのも手ですが。
後はCreateDIBSectionとかでしょうか。

っていうか、背景が単色なら塗りつぶし系の
APIとかもあったと思うのでそういうのを使ってもいいかも。
塗り残しが発生しそうですが。

編集 削除
かず  2001-10-06 16:31:26  No: 74878  IP: [192.*.*.*]

自力解決しました。
ネットの海をドンブラコ、やっとたどりつき、
フリーズしまくって、なんとかできました。

CreateDIBSection 関数でDIBSectionをメモリーに確保して
SelectObject関数でオブジェクトを選び、例えばピクチャーボックスとか。
次ぎに、操作する画像をそのピクチャーボックスにBitblt関数でこぴーし、
CopyPtrtoVal関数で、DIBSectionのメモリーデータをバイト配列にコピーします
バイト配列の内容を加減算して、CopyValtoPtr関数でDIBSectionに戻せばいいです。
速度は飛躍的にアップ、コンパイル前の実行速度比較で、
15秒かかっていたものが、10ミリセカンドです。やったー!!!

編集 削除