2×3の欄があり、写真をdrag & dropでその欄に落として、印刷するというソフトです。
Windows7 32bitでは、問題なかったのですが、うまくdrag & dropできなくなりました。
HSP3.51に変更してinclude "hsp3_64.as”つけたし、コンパイルしなおしたのですがダメでした。
ここがおかしいというのはないでしょうか?
#module
;▼必要となるAPIや定数の定義
#include "hsp3_64.as"
#uselib "comdlg32.DLL"
#cfunc PrintDlg "PrintDlgA" var
#uselib "gdi32.dll"
#func SetMapMode "SetMapMode" int,int
#func SetWindowOrgEx "SetWindowOrgEx" int,int,int,nullptr
#func SetViewportOrgEx "SetViewportOrgEx" int,int,int,nullptr
#func SetWindowExtEx "SetWindowExtEx" int,int,int,nullptr
#func SetViewportExtEx "SetViewportExtEx" int,int,int,nullptr
#func ScaleViewportExtEx "ScaleViewportExtEx" int,int,int,int,int,nullptr
#cfunc StartDoc "StartDocA" int,var
#func StartPage "StartPage" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#func EndPage "EndPage" int
#func EndDoc "EndDoc" int
#cfunc GetDeviceCaps "GetDeviceCaps" int,int
#func DeleteDC "DeleteDC" int
#deffunc ghardcopy int prm1
;
; nMode =1 : 用紙に合わせて拡大・縮小して印刷
; nMode =0 : そのまま印刷
;
mref bmscr,67
#define dispSizeX bmscr(1)
#define dispSizeY bmscr(2)
#define HORZRES 8
#define VERTRES 10
#define LOGPIXELSX 88
#define LOGPIXELSY 90
#define PD_RETURNDC $00000100
nMode = prm1 : if (nMode<=0)|(nMode>1) : nMode=0
dim pd,20 ;PRINTDLG構造体
pd(0) = 66 ;lStructSize
pd(1) = hwnd ;hwndOwner
pd(2) = 0 ;hDevMode
pd(3) = 0 ;hDevNames
pd(5) = PD_RETURNDC ;Flags
ret=PrintDlg(pd)
PDhdc = pd(4) ;PrinterHDC
if ret!0 {
pdevcaps=HORZRES,VERTRES,LOGPIXELSX,LOGPIXELSY
repeat 4 : prnInfo(cnt)=GetDeviceCaps(PDhdc,pdevcaps(cnt)) : loop
prnInfo(4)=GetDeviceCaps(hdc,pdevcaps(2))
prnInfo(5)=GetDeviceCaps(hdc,pdevcaps(3))
}else{
return -1
}
SetMapMode PDhdc ,7 : SetWindowOrgEx PDhdc, 0,0
SetViewportOrgEx PDhdc, 0,0
SetWindowExtEx PDhdc, dispSizeX,dispSizeY
if nMode=0 {
SetViewportExtEx PDhdc, dispSizeX,dispSizeY
ScaleViewportExtEx PDhdc, prnInfo(2), prnInfo(4), prnInfo(3), prnInfo(5)
} else {
SetViewportExtEx PDhdc, prnInfo(0),prnInfo(1)
}
;DOCINFO構造体
dim dci,5 : pDOCNAME = "HSPDocument": dci= 20,varptr(pDOCNAME)
ret=StartDoc(PDhdc,dci)
if ret<0 { DeleteDC PDhdc : return -1 }
StartPage PDhdc
BitBlt PDhdc ,0,0,dispSizeX,dispSizeY, hdc, 0,0, $CC0020
EndPage PDhdc : EndDoc PDhdc : DeleteDC PDhdc
return
#global
;***** sample *****
#uselib "shell32.dll"
#func DragAcceptFiles "DragAcceptFiles" int,int
#func DragQueryFile "DragQueryFileA" int,int,int,int
#func DragQueryPoint "DragQueryPoint" int,int
#func DragFinish "DragFinish" int
#define WM_DROPFILES 0x0233
sdim jpgfile,6
buffer 2,800,1200,0
screen 0,500,600,0,10,10
;
dim py,4:dim px,3:dim py2,4:dim px2,3
py(0)=10:py(1)=190:py(2)=370:py(3)=550:px(0)=10:px(1)=250:px(2)=490
py2(0)=100:py2(1)=394:py2(2)=688:py2(3)=982:px2(0)=100:px2(1)=412:px2(2)=724
pos px(0),py(0):line px(0),py(3):line px(2),py(3):line px(2),py(0):line px(0),py(0)
pos px(0),py(1):line px(2),py(1)
pos px(0),py(2):line px(2),py(2)
pos px(1),py(0):line px(1),py(3)
pos 400,560:button "印刷",*PRT
;
oncmd gosub *OnDropFiles, WM_DROPFILES // WM_DROPFILES メッセージハンドラを設定
DragAcceptFiles hwnd, 1 // ファイルをドラッグ&ドロップできるように設定
stop
*OnDropFiles
; --- ファイルがドロップされたとき ---
; ドロップされたファイルの数を取得する
hdrop = wParam ; ドロップファイル情報のハンドル
DragQueryFile hdrop, -1, 0, 0
ndrop = stat ; ファイルの数
if ndrop > 1 :return
if ndrop =0 :return
;
xmse=mousex : ymse=mousey
if xmse > px(2) or xmse < px(0) {return}
if ymse < py(0) {return}
if ymse > py(3) {return}
nx=0:ny=0
if xmse > px(1) {nx=1}
if ymse > py(1) {ny=1}
if ymse > py(2) {ny=2}
; 画面をクリア
syscolor 5 : boxf px(nx)+1,py(ny)+1,px(nx+1)-1,py(ny+1)-1
syscolor 8 : pos px(nx)+3,py(ny)+3
; ファイル名を取得して表示
sdim filename, 260
DragQueryFile hdrop, cnt, varptr(filename), 260
;nxy=2*ny+nx
;jpgfile(nxy)=filename
buffer 1,640,680
picload filename
X_size=ginfo(12)
Y_size=ginfo(13)
gsel 0
gzoom 234,174,1,1,1,X_size,Y_size
; ++++++++ここからbuffer1に描画++++++++++++
gsel 2
syscolor 5 : boxf px2(nx)+1,py2(ny)+1,px2(nx+1)-1,py2(ny+1)-1
syscolor 8 : pos px2(nx)+3,py2(ny)+3
;gsel 1
;picload filename
;X_size=ginfo(12):Y_size=ginfo(13)
;gzoom 308,243,1,50,90,411,324,1;CT
gzoom 300,224,1,1,1,X_size,Y_size,1; ..内視鏡
;gzoom 300,285,1,10,50,X_size,900,1;..胸部Xp
;gzoom 285,285,1,28,28,456,456,1;MRI
gsel 0
; ドロップファイル情報をクリア (これをしないとメモリリークになる)
DragFinish hdrop
return
;
*PRT
objprm 0, "実行中"
gsel 2
ghardcopy 0
end