2004/6/20公開
2004/7/13更新

;*****************************************************
;       ○画像の読み込み
;       LoadPicture2 p1,p2
;       p1:画像ファイル名(フルパス。packfile・memfileは不可) または URL
;       p2:画面の初期化モード(0=初期化する,1=初期化しない)
;
;       現在のウインドウに画像(BMP,JPEG,GIF,ICO,PNG)を読み込みます。
;       p2を0にすると画面を初期化してから画像を読み込みます。
;       p2を1にした場合は初期化せずに、現在位置(pos命令で指定)に画像を読み込みます。
;       p2に0を指定して、透過画像を読み込む場合にはcolor命令で指定されている色を透過色に割り当てます。
;       成功した場合statに0がセットされます。
;
;       初期状態のWin95では動かないかもしれません(Win95+IE5で動作確認)
;---------------------------------------------------
#module
        #define SETUUID(%1,%2,%3,%4,%5,%6) ll_bin %1,"%5 %6":%1.3=%1,%1.1:%1.1=$%2,$%4<<16|$%3:ll_getptr %1.1:ll_ret %1
        #define CLSCTX_INPROC_SERVER    $00000001
        #define IMGLOAD_LOADING     0x00200000  // Image in the process of being loaded
        #define IMGLOAD_COMPLETE    0x01000000  // Image loaded
        #define IMGTRANS_OPAQUE     0x20000000
        #define CP_ACP  $00000000
        #define MB_PRECOMPOSED  $00000001
        #define Release 2       ;IImgCtx's method
        #define Load 3
        #define GetStateInfo 8
        #define Draw 10

#deffunc LoadPicture2 str,int
        mref filename,32
        mref mode,1
        mref _stat,64
        mref bm,67
        ll_libload hOle,"ole32.dll"
        ll_libload hKernel,"kernel32.dll"
        ll_getproc pCoInitialize,"CoInitialize",hOle
        ll_getproc pCoUninitialize,"CoUninitialize",hOle
        ll_getproc pCoCreateInstance,"CoCreateInstance",hOle
        ll_getproc pMultiByteToWideChar,"MultiByteToWideChar",hKernel
        ll_getproc pSleep,"Sleep",hKernel
        SETUUID IID_IImgCtx,3050f3d7,98b5,11cf,bb82,00aa00bdce0b
        SETUUID CLSID_IImgCtx,3050f3d6,98b5,11cf,bb82,00aa00bdce0b
        prm=0: ll_callfunc prm,1,pCoInitialize
        prm=CLSID_IImgCtx,0,CLSCTX_INPROC_SERVER,IID_IImgCtx:ll_getptr pIImgCtx:ll_ret prm.4
        ll_callfunc prm,5,pCoCreateInstance: ll_ret result: if result:stt=1:goto *fin
        ll_peek4 pvtbl,pIImgCtx: ll_peek vtbl,pvtbl,13*4
        sdim wname,1024
        prm=CP_ACP,MB_PRECOMPOSED,0,-1,0,1024:ll_getptr filename:ll_ret prm.2:ll_getptr wname:ll_ret prm.4
        ll_callfunc prm,6,pMultiByteToWideChar
        prm=pIImgCtx,0,0:ll_getptr wname:ll_ret prm.1: ll_callfunc prm,3,vtbl.Load: ll_ret result
        if result:stt=2:goto *fin
        prm=pIImgCtx,0,0,0:ll_getptr stt:ll_ret prm.1:ll_getptr size:ll_ret prm.2
        prm2=10
        repeat
                ll_callfunc prm,4,vtbl.GetStateInfo: ll_ret result
                if result: stt=0:break
                if stt&IMGLOAD_LOADING==0:break
                ll_callfunc prm2,1,pSleep
        loop
        if stt&IMGLOAD_COMPLETE==0:stt=3:goto *fin
        if mode==0{
                initcolor=bm.40
                if bm.17==1{
                        buffer bm.18,size,size.1,0
                }else{if bm.17==2{
                        bgscr bm.18,size,size.1,0
                }else{
                        screen bm.18,size,size.1,0
                }}
                cx=0:cy=0
                if stt&IMGTRANS_OPAQUE==0{
                        redraw 0
                        color initcolor&$ff,initcolor>>8&$ff,initcolor>>16&$ff
                        boxf 0,0,size,size.1
                        color
                }
        }else{
                cx=bm.27:cy=bm.28
        }
        mref bm,67
        rect=cx,cy,cx+size,cy+size.1
        prm=pIImgCtx,bm.4:ll_getptr rect:ll_ret prm.2: ll_callfunc prm,3,vtbl.Draw: ll_ret result
        if result:stt=5:goto *fin
        stt=0
        redraw 1
*fin
        if pIImgCtx:ll_callfunc pIImgCtx,1,vtbl.Release: pIImgCtx=0
        ll_callfnv pCoUninitialize
        ll_libfree hKernel
        ll_libfree hOle
        _stat=stt
        return
#global
;*****************************************************

;以下サンプル
dialog "bmp;*.jpg;*.gif;*.png;*.ico",16
if stat==0:end
LoadPicture2 refstr
if stat:mes "エラー"
stop



戻る