板 1- 前 次 新 レス
管理人の雑記
[46]管理人 ★:2007/03/29(木) 21:59:31
機械語コールバックの実用的な例。
imgctl.dll(ruche-home)のPasteDIB()にはPASTEPROCという関数ポインタを引数で与えられる。
こいつを利用することで、透過色の使用や半透明など、特殊な貼り付け処理を行える。
例えば、以下のような関数で、PasteDIB()のlParam引数で指定した色を透過色とみなし、それ以外の部分のみ貼り付けるという処理が行える。
COLORREF CALLBACK PasteProc(LPPASTEINFO lppi){
if(lppi->colSrc==(COLORREF)lppi->lParam){
return lppi->colDest;
}else{
return lppi->colSrc;
}
}
コンパイルした関数をダンプして埋め込むとこうなる。(デバッグモードを無効にして最適化を加えたらやたら小さくなった)
pfTransPaste:=unDump("8b 4c 24 04 8b 41 04 3b 41 0c 75 02 8b 01 c2 04 00")
以下のようにして使う。
DllCall("imgctl.dll\PasteDIB",UInt,hDIBTarget,UInt,left,UInt,top,UInt,width,UInt,height
,UInt,hDIBSrc,Int,0,Int,0,UInt,pfTransPaste,UInt,0x00FFFFFF)
PASTEPROCのサンプルにあった他の関数も試してみようかと思ったが、面倒なんでやめた。
そのうちまともな画像操作ライブラリを作るときにでも作ろう。
前 次