|
|
2015/4/20(Mon) 11:52:36|NO.68664
今、ランチャーソフトを開発中ですが、
設定画面などのGUI部品(オブジェクト)を
座標計算しながらpos命令で位置を決めてます。
当然、面倒な作業であり、このオブジェクトの位置を
ドラッグ&ドロップのような操作方法で移動をし、
HSPのスクリプト・ソースを吐き出してくれるソフトを探してます。
つまり、HSPオブジェクト・エディタですね。
・meikob_Light(HSP のオブジェクトを 簡単配置)
http://www.vector.co.jp/soft/winnt/prog/se506902.html
↑
こちらは使いにくかったです。
これ以外でオブジェクトの配置を簡単にできるソフトを紹介して欲しいです。
よろしくお願いします。
|
|
2015/4/23(Thu) 22:22:18|NO.68719
この掲示板でも何度か統合開発環境の紹介はありましたけど、
フォームデザイナ系の話題は少なかったように思います。
調べてみましたが、以下のコンテスト2作品くらいでしょうか。
http://hsp.tv/contest2011/entry.php?id=98
http://dev.onionsoft.net/seed/info.ax?id=621
・・・話は変わりますが、HSPスクリプトの記述の仕方って結構人によって様々ですよね。
フォームデザイナでスクリプトを吐き出す形式ってツールによって書式が決まっちゃうじゃないですか。
書式の見た目が慣れないですし、なんとか自由に記述できて、かつ、オブジェクトをドラッグして配置出来るような風に出来ないかなって、昔 ずっと考えてました。
「いっそ、オブジェクトを1回記述してしまって、作ってるソフトの中でオブジェクトを移動して、その配置をスクリプトに反映させるように出来ないかな」って。
で! むかぁ〜し、モジュールを書いてたんですけど、なかなかやりたい所までうまく行かず放置してたのがありまして。。。
それをちょっとひっくり返してきて、ちょちょっと手を加えたものが以下になります。
http://suwa.6.ql.bz/data/ObjPosModule_b1.zip
やってる内容は、
・例えばmesboxとかのオブジェクトの命令を一度 破棄して乗っ取って、そのmesboxのあるスクリプトの行数とかを取得。
・オブジェクトのクリック処理をフックで奪って位置やサイズを変更して記憶。
・あとは、手動でスクリプトを修正してね。
というものです。
まだまだ作り途中のような段階なんですけど、、、こういう形のもの誰か作ってくれないかなってことで一度放流してみます。
とりあえず、こういう風に動くイメージを伝えたかったということで。
中身ぐちゃぐちゃだったり、多分追加したほうが良い命令がまだありそうだったり。。。
むしろ、いっそ1から書き直したほうが良いでしょう。。。
//私はとりあえずなんとか形にできてもう満足してしまったのでこれ以上は手を付けないだろうと思います。多分。
【やりたいなって思ってたこと】
・ファイル名と行数が取れるから、自動で修正できるようにしたかった。
(HSPエディタで開いている場合はそれを修正編集。)
・他のオブジェクトと位置関係を揃えられるような吸着(?)機能。
・コールバックをdllを使わないように機械語で出来ないか。
・中でウィンドウIDを使いまくってる。それ以降空いているIDを指定しないといけないのが不細工。可能なら直したかった。
一応、上記のダウンロードのものと大体同じスクリプトを載せておきます。
(hscallbk.dllが必要なので http://chokuto.ifdef.jp/download/#hscallbk からダウンロードして下さい。)
;///////////////////////////////////////////////////////////////////////////////////////////////////
;//
;// オブジェクト配置モジュール
;//
;///////////////////////////////////////////////////////////////////////////////////////////////////
#module "ObjPosMod"
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;_/
;_/ ぷまさん作の不定形リージョン作成モジュール
;_/ http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200511/05110007.txt
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#deffunc ObjPos_SetRgn int p1, int p2 // [フルカラー専用Ver1.0] 左上の色が透過色になります。 stat : 失敗0 成功0以外
#uselib "kernel32.dll" // マシン語実行用メモリ確保
#func ObjPos_VirtualProtect "VirtualProtect" var, int, int, var
#uselib "user32" ; 使用するWin32API関数
#cfunc ObjPos_SetWindowRgn "SetWindowRgn" int, int, int
#uselib "gdi32"
#func ObjPos_DeleteObject "DeleteObject" int
#func ObjPos_ExtCreateRegion "ExtCreateRegion" int, int, int
#func ObjPos_CombineRgn "CombineRgn" int, int, int, int
c= p2 : if rgn=0 { ;mdim rgn,77
dim rgn,77 :ObjPos_VirtualProtect rgn,(77)*4,$40,AZSD
pf=varptr.rgn, varptr.ObjPos_ExtCreateRegion, varptr.ObjPos_CombineRgn, varptr.ObjPos_DeleteObject
rgn. 0= $81EC8B55,$000FCCEC,$57565300,$8B087D8B,$778B0447,$40048D08,$8303488D
rgn. 7= $DB33FCE1,$D02BD18B,$F1AF0F4E,$21147703,$FFF03C9D,$F85D89FF,$89FC5D89
rgn.14= $85C7F455,$FFFFF034,$00000020,$F03885C7,$0001FFFF,$BD810000,$FFFFF03C
rgn.21= $000000FA,$5F3B0573,$8D3A7C08,$FFF03485,$C06850FF,$6A00000F,$1055FF00
rgn.28= $75FF026A,$084589F8,$55FF5050,$F875FF14,$8B1855FF,$A5830845,$FFFFF03C
rgn.35= $085F3B00,$0FF84589,$0000928D,$4EB60F00,$8AC03302,$01468A26,$0B08E0C1
rgn.42= $0C453BC1,$858B5374,$FFFFF03C,$C1FC4D8B,$85FF04E0,$FFFFF03C,$5405848D
rgn.49= $89FFFFF0,$01538D08,$04588941,$890C5089,$1EEBFC4D,$0556B60F,$C683C933
rgn.56= $8A2E8A03,$E1C1014E,$3BCA0B08,$0B740C4D,$8BFC45FF,$4F3BFC4D,$8BDD7504
rgn.63= $4889FC4D,$04478B08,$FF03C683,$4539FC45,$3B8C0FFC,$8BFFFFFF,$6583F44D
rgn.70= $048D00FC,$F7E0D140,$03C82BD9,$23E943F1,$5FFFFFFF,$C2C95B5E,$00000014}
mref bm,67 ;: c= $FFFFFF ;色を指定
prm=varptr.bm,c,pf.1,pf.2,pf.3
return ObjPos_SetWindowRgn(p1,callfunc(prm,pf,5),1)
;_/ ぷまさん作の不定形リージョン作成モジュール
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;_/
;_/ 科学太郎さんの「[HSP]クリップボードの操作(クリア・取得・設定)」ページから引用
;_/ http://blog.goo.ne.jp/masaki_goo_2006/e/c4584dd59ccd15f890156efc044f633f
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//--------------------------------------
// Win32API関数の命令登録
//--------------------------------------
#uselib "Kernel32.dll"
#cfunc ObjPos_GlobalAlloc "GlobalAlloc" sptr,sptr
#func ObjPos_GlobalFree "GlobalFree" sptr
#cfunc ObjPos_GlobalLock "GlobalLock" sptr
#func ObjPos_GlobalUnlock "GlobalUnlock" sptr
#uselib "User32.dll"
#cfunc ObjPos_OpenClipboard "OpenClipboard" sptr
#func ObjPos_CloseClipboard "CloseClipboard"
#func ObjPos_EmptyClipboard "EmptyClipboard"
#func ObjPos_SetClipboardData "SetClipboardData" sptr,sptr
//--------------------------------------
// クリップボードにテキストを設定
//--------------------------------------
#deffunc apiClipSave str _text_,\
local hMem,\
local nSize,\
local pBuff,\
local dupStr
nSize=strlen(_text_)+1
hMem=ObjPos_GlobalAlloc($0042/*GHND*/|$2000/*GMEM_SHARE*/,nSize):if(hMem){
pBuff=ObjPos_GlobalLock(hMem)
;文字列型のクローン変数作成
dupptr dupStr,pBuff,nSize,2
dupStr=_text_
ObjPos_GlobalUnlock hMem
if ObjPos_OpenClipboard(hWnd){
ObjPos_EmptyClipboard
ObjPos_SetClipboardData 1/*CF_TEXT*/,hMem
ObjPos_CloseClipboard
return 1
}
ObjPos_GlobalFree hMem
}
return 0
;_/ 科学太郎さんの「[HSP]クリップボードの操作(クリア・取得・設定)」ページから引用
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#uselib "gdi32"
#func ObjPos_SetTextColor "SetTextColor" int,int
#func ObjPos_SetBkMode "SetBkMode" int, int
#cfunc ObjPos_GetStockObject "GetStockObject" int
#func ObjPos_SelectObject "SelectObject" int, int
#func ObjPos_GetTextExtentPoint32 "GetTextExtentPoint32A" int, str, int, int
#uselib "user32"
#func ObjPos_SetWindowLong "SetWindowLongA" int,int,int;ウィンドウ属性を変更 ⇒ ウィンドウハンドル、変更データ指定、新しい値
#func ObjPos_GetWindowLong "GetWindowLongA" int,int ;ウィンドウ属性を取得 ⇒ ウィンドウハンドル、取得データ指定
#func ObjPos_GetClassName "GetClassNameA" int,int,int
#func ObjPos_SetParent "SetParent" sptr,sptr
#func ObjPos_SetWindowPos "SetWindowPos" int,int,int,int,int,int,int ;ウィンドウを移動する ⇒ ウィンドウハンドル、z座標指定、x座標、y座標、幅、高さ、描画フラグ
#func ObjPos_MoveWindow "MoveWindow" int, int, int, int, int, int ;ウィンドウを移動する ⇒ ウィンドウハンドル、x座標、y座標、幅、高さ、描画フラグ
#func ObjPos_GetWindowRect "GetWindowRect" int,int
#cfunc ObjPos_ChildWindowFromPoint "ChildWindowFromPoint" int,int,int ;ウィンドウ内指定座標の子ウィンドウハンドル取得 ⇒ ウィンドウハンドル、POINT構造体
#cfunc ObjPos_GetParent "GetParent" int ;親ウィンドウを調べる ⇒ 子ウィンドウハンドル
#func ObjPos_ScreenToClient "ScreenToClient" int, int ;スクリーン座標系をクライアントの座標系に変換 ⇒ ウィンドウハンドル、POINT構造体
#func ObjPos_ClientToScreen "ClientToScreen" int, int ;クライアントの座標系をスクリーン座標系に変換 ⇒ ウィンドウハンドル、POINT構造体
#cfunc ObjPos_GetSysColorBrush "GetSysColorBrush" int
; #func ObjPos_InvalidateRgn "InvalidateRgn" int,int,int
#func ObjPos_InvalidateRect "InvalidateRect" int,int,int
#func ObjPos_UpdateWindow "UpdateWindow" int
#func ObjPos_TrackPopupMenu "TrackPopupMenu" sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func ObjPos_CreatePopupMenu "CreatePopupMenu"
#func ObjPos_AppendMenu "AppendMenuA" sptr,sptr,sptr,sptr
#func ObjPos_DestroyMenu "DestroyMenu" sptr
;コールバックなるものを
#func ObjPos_GetWindowThreadProcessId "GetWindowThreadProcessId" sptr,sptr
#func ObjPos_SetWindowsHookEx "SetWindowsHookExA" sptr,sptr,sptr,sptr
#func ObjPos_CallNextHookEx "CallNextHookEx" sptr,sptr,sptr,sptr
#func ObjPos_UnhookWindowsHookEx "UnhookWindowsHookEx" sptr
#regcmd "_callbackinit@4","hscallbk.dll",1
#cmd ObjPos_setcallbk $000
#cmd ObjPos_callbkarg $001
#uselib ""
#func ObjPos_mouse_HookProc "" int, int, int
;//オブジェクト配置をする
#deffunc StartObjPos_SetBlankWinID int wID
objposing_windowID=ginfo_sel
aki_windowID=wID
;変更結果を表示するウィンドウを作成
screen aki_windowID, 640,400,,ginfo_dispx-660,ginfo_dispy-450
winobj "SysListView32", "", 0x00000200, 0x50000001, ginfo_sx, ginfo_sy
hList = objinfo(stat, 2)
sendmsg hList, $1036/*LVM_SETEXTENDEDLISTVIEWSTYLE*/, , $20/*LVS_EX_FULLROWSELECT*/
szText = "ファイル名"
LVCOLUMN = 0x000F, 0, 10, varptr(szText), 0, 0
sendmsg hList, 0x101B, 0, varptr(LVCOLUMN)
szText = "行数"
LVCOLUMN = 0x000F, 0, 50, varptr(szText), 0, 1
sendmsg hList, 0x101B, 1, varptr(LVCOLUMN)
szText = "ハンドル"
LVCOLUMN = 0x000F, 0, 80, varptr(szText), 0, 1
sendmsg hList, 0x101B, 2, varptr(LVCOLUMN)
szText = "タイプ"
LVCOLUMN = 0x000F, 0, 100, varptr(szText), 0, 1
sendmsg hList, 0x101B, 3, varptr(LVCOLUMN)
szText = "POS"
LVCOLUMN = 0x000F, 0, 120, varptr(szText), 0, 1
sendmsg hList, 0x101B, 4, varptr(LVCOLUMN)
szText = "SIZE"
LVCOLUMN = 0x000F, 0, 120, varptr(szText), 0, 1
sendmsg hList, 0x101B, 5, varptr(LVCOLUMN)
szText = "備考"
LVCOLUMN = 0x000F, 0, 500, varptr(szText), 0, 1
sendmsg hList, 0x101B, 6, varptr(LVCOLUMN)
hwObjpos=hwnd
oncmd gosub *WM_NOTIFY,$4e
gsel objposing_windowID
;ウィンドウハンドルを記憶
hw=hwnd
;
aki_windowID++
;変数
hobj =0
objtype =""
objcomm =""
objoptn=0.0
objfont =""
hFont =0
hColor =0
hspline =0
hspfile =""
;マウスフック
ObjPos_setcallbk pHookProc, ObjPos_mouse_HookProc, *objposmod_HookProc
ObjPos_GetWindowThreadProcessId hwnd, 0
ObjPos_SetWindowsHookEx 7, varptr(pHookProc), hinstance, stat
hHook = stat
hBrush = ObjPos_GetSysColorBrush (15) //3D オブジェクトの表面色
oncmd gosub *objposmod_ctlcolor, 0x138
dim point,2
dim rect,4
init_ok=1
return 1
;//オブジェクト配置を行うウィンドウかどうかをチェックする関数
#defcfunc checkObjposing
if init_ok=0 :return 0
if objposing_windowID!ginfo_sel :return 0
return 1
;//ウィンドウタイトル変更
#deffunc title_objpos str text_
text = text_
sendmsg hwObjpos,$C,0,varptr.text ;タイトル名を変更 WM_SETTEXT = $C
return
;//終了処理命令
#deffunc exit_objpos onexit
ObjPos_UnhookWindowsHookEx hHook ;フック解放
return
;//リストビューに追加
#deffunc putListView int objpsID, int psx, int psy, int szx, int szy
if objpsID=-1 :return
hw_objpsID = hobj(objpsID)
Sendmsg hlist,0x1004/*LVM_GETTITEMCOUNT*/,0,0
num=stat
repeat num
String=ListView_GETITEM(cnt,2)
if hw_objpsID=int(String) : Sendmsg hlist,0x1008/*LVM_DELETEITEM*/,cnt,0 :break
loop
pszText = hspfile(objpsID)
tim = 0x0001, 0, 0, 0, 0, varptr(pszText)
sendmsg hList, 0x1007, 0, varptr(tim)
pszText = str.hspline(objpsID)
tim = 0x0001, 0, 1, 0, 0, varptr(pszText)
sendmsg hList, 0x1006, 0, varptr(tim)
pszText = str.hobj(objpsID)
tim = 0x0001, 0, 2, 0, 0, varptr(pszText)
sendmsg hList, 0x1006, 0, varptr(tim)
pszText = objtype(objpsID)
tim = 0x0001, 0, 3, 0, 0, varptr(pszText)
sendmsg hList, 0x1006, 0, varptr(tim)
pszText = strf("POS(%d,%d)",psx,psy)
tim = 0x0001, 0, 4, 0, 0, varptr(pszText)
sendmsg hList, 0x1006, 0, varptr(tim)
pszText = strf("SIZE(%d,%d)",szx,szy)
if objtype(objpsID)="mes" :pszText = strf("FONT(%s)",objfont(objpsID))
tim = 0x0001, 0, 5, 0, 0, varptr(pszText)
sendmsg hList, 0x1006, 0, varptr(tim)
pszText = str.objcomm(objpsID)
tim = 0x0001, 0, 6, 0, 0, varptr(pszText)
sendmsg hList, 0x1006, 0, varptr(tim)
return
;//リストビューの文字列を取得
#defcfunc ListView_GETITEM int gyo, int retu
if gyo<0 || retu<0 :return ""
sdim String,512
;LVITEM構造体
dim tim,9
tim(0) = $00000001 ;mask
tim(1) = gyo ;iItem
tim(2) = retu ;iSubItem
tim(5) = varptr(String) ;pszText
tim(6) = 512 ;cchTextMax
SendMsg hlist,0x1005/*LVM_GETITEM*/,0,varptr(tim)
return String
;//
;// 命令置き換え
;//
;mes命令を削除して
#undef mes
#undef print
#define global print mes
;あらたに設定
#deffunc ObjPos_mes str sp1
cst=stat
if checkObjposing()=0 :mes@hsp sp1 :return cst
sel=ginfo_sel
col=ginfo_r, ginfo_g, ginfo_b
;フォント系の記録
mref bmscr, 67 ;フォントハンドル等をBMSCR構造体から取得
hFont(objID) = bmscr.38
hColor(objID) = bmscr.40
f_size = -bmscr.49
f_style = (bmscr.53>=700)|peek(BMSCR.54, 0)<<1|peek(BMSCR.54, 1)<<2|peek(BMSCR.54, 2)<<3|(peek(BMSCR.55, 2)>0)<<4
sdim lfFaceName
dupptr lfFaceName, varptr(bmscr.56), 32, 2
objfont(objID) = ""+f_size+","+f_style+","+lfFaceName
;フォントのハンドルがbufferで作られていないと、フォントを変えたときすべて変わってしまうので
buffer aki_windowID+objID,1,1
color col(0),col(1),col(2)
font lfFaceName,f_size,f_style
mref bmscr, 67 ;フォントハンドルをBMSCR構造体から取得
hFont(objID) = bmscr.38
; メッセージサイズを取得
mes_size_objpos sp1,size, hFont(objID)
gsel sel
winobj@hsp "static",sp1, , $50000100, size(0), size(1) ;メッセージ配置(スタティックテキストで)
hobj(objID) = objinfo( stat, 2 )
objtype(objID) = "mes"
objcomm(objID) = ""+sp1
hspline(objID) = ScLine
hspfile(objID) = ScFile
sendmsg objinfo( stat, 2 ), $30/*WM_SETFONT*/, hFont(objID) ;フォント設定。取得したフォントハンドルを適用してやる。
objID++
return cst
#define global mes(%1) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :dp1@ObjPosMod=""+%1:ObjPos_mes dp1@ObjPosMod
;メッセージサイズを取得(複数行対応)
#deffunc mes_size_objpos str p1,array p2, int p3
sa=p1 ;文字列を変数に代入
a=0 ;インデックスカウント
b=0 ;xサイズ
c=0 ;行数
dim da,2
ObjPos_SelectObject hdc, p3
repeat
c=cnt
;一行毎に調べる
getstr sb,sa,a, :a+=strsize
if strsize=0 :break
;文字列サイズを取得
ObjPos_GetTextExtentPoint32 hdc,sb,strlen(sb),varptr(da)
if b < da(0) :b=da(0)
loop
p2=b,da(1)*c
return
;boxf命令を削除して
#undef boxf
;あらたに設定
#deffunc ObjPos_boxf int p1, int p2, int p3, int p4
cst=stat
if checkObjposing()=0 :boxf@hsp p1,p2,p3,p4 :return cst
if p1=0 & p2=0 & p3=ginfo_winx & p4=ginfo_winy :boxf@hsp p1,p2,p3,p4 :return cst ;boxf全省略(全体塗り)の場合オブジェクトとして管理しない
sel=ginfo_sel
col=ginfo_r, ginfo_g, ginfo_b
;ダミーを子ウィンドウとして描画
set=p3-p1+1, p4-p2+1
;サイズを可変にするためあらかじめディスプレイサイズぶん確保しておく
if set(0)<ginfo_dispx :set(0)=ginfo_dispx
if set(1)<ginfo_dispy :set(1)=ginfo_dispy
bgscr aki_windowID+objID, set(0), set(1), 2, p1, p2
width p3-p1+1, p4-p2+1
ObjPos_GetWindowLong hwnd, -16
ObjPos_SetWindowLong hwnd, -16, stat& 0x7FFFFFFF | 0x40000000
ObjPos_SetParent hwnd,hw
color col(0),col(1),col(2)
boxf@hsp; 0,0,p3-p1+1,p4-p2+1
;詳細を記憶
hobj(objID)=hwnd
objtype(objID)="boxf"
objcomm(objID)="COLOR("+col(0)+","+col(1)+","+col(2)+")"
hspline(objID) = ScLine
hspfile(objID) = ScFile
gsel aki_windowID+objID,1
objID++
gsel sel
return cst
;パラメータ省略時の処理
#define global boxf(%1=0,%2=0,%3=ginfo_winx,%4=ginfo_winy) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_boxf %1,%2,%3,%4
;line命令を削除して
#undef line
;あらたに設定
#deffunc ObjPos_line int p1, int p2, int p3, int p4
cst=stat
if checkObjposing()=0 :line@hsp p1,p2,p3,p4 :return cst
sel=ginfo_sel
col=ginfo_r, ginfo_g, ginfo_b
;ダミーを子ウィンドウとして描画
set=p3-p1+1, p4-p2+1
if set(0)<ginfo_dispx :set(0)=ginfo_dispx
if set(1)<ginfo_dispy :set(1)=ginfo_dispy
bgscr aki_windowID+objID, set(0), set(1), 2, p1, p2
width p3-p1+1, p4-p2+1
ObjPos_GetWindowLong hwnd, -16
ObjPos_SetWindowLong hwnd, -16, stat& 0x7FFFFFFF | 0x40000000
ObjPos_SetParent hwnd,hw
rgncol=0
if ( col(0)+col(1)+col(2) )=0 :color 255,0,0 :boxf@hsp :rgncol=255 :else :color :boxf@hsp
color col(0),col(1),col(2)
line@hsp 0,0,p3-p1,p4-p2
ObjPos_SetRgn hwnd,rgncol ;透化ウィンドウにする。
;詳細を記憶
hobj(objID)=hwnd
objtype(objID)="line"
objcomm(objID)="COLOR("+col(0)+","+col(1)+","+col(2)+")"
hspline(objID) = ScLine
hspfile(objID) = ScFile
gsel aki_windowID+objID,1
objID++
gsel sel
pos p1, p2 ;line命令は p1,p2 がカレントポジションになる
return cst
;パラメータ省略時の処理
#define global line(%1=0,%2=0,%3=ginfo_cx,%4=ginfo_cy) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_line %1,%2,%3,%4
;circle命令を削除して
#undef circle
;あらたに設定
#deffunc ObjPos_circle int p1, int p2, int p3, int p4, int p5
cst=stat
if checkObjposing()=0 :circle@hsp p1,p2,p3,p4,p5 :return cst
sel=ginfo_sel
col=ginfo_r, ginfo_g, ginfo_b
;ダミーを子ウィンドウとして描画
set=p3-p1+1, p4-p2+1
if set(0)<ginfo_dispx :set(0)=ginfo_dispx
if set(1)<ginfo_dispy :set(1)=ginfo_dispy
bgscr aki_windowID+objID, set(0), set(1), 2, p1, p2
width p3-p1+1, p4-p2+1
ObjPos_GetWindowLong hwnd, -16
ObjPos_SetWindowLong hwnd, -16, stat& 0x7FFFFFFF | 0x40000000
ObjPos_SetParent hwnd,hw
rgncol=0
if ( col(0)+col(1)+col(2) )=0 :color 255,0,0 :boxf@hsp :rgncol=255 :else :color :boxf@hsp
color col(0),col(1),col(2)
circle@hsp 0,0,p3-p1,p4-p2,p5
ObjPos_SetRgn hwnd,rgncol // 透化ウィンドウにする。
hobj(objID)=hwnd
objtype(objID)="circle"
objcomm(objID)="p5="+p5+", COLOR("+col(0)+","+col(1)+","+col(2)+")"
hspline(objID) = ScLine
hspfile(objID) = ScFile
gsel aki_windowID+objID,1
objID++
gsel sel
return cst
;パラメータ省略時の処理
#define global circle(%1=0,%2=0,%3=ginfo_winx,%4=ginfo_winy,%5=1) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_circle %1,%2,%3,%4,%5
;命令を削除して
#undef grect
;あらたに設定
#deffunc ObjPos_grect int p1, int p2, double p3, int p4, int p5
cst=stat
if checkObjposing()=0 :grect@hsp p1,p2,p3,p4,p5 :return cst
sel=ginfo_sel
col=ginfo_r, ginfo_g, ginfo_b
;ダミーを子ウィンドウとして描画
set = int(absf(cos(p3)*p4)+absf(sin(p3)*p5)), int(absf(sin(p3)*p4)+absf(cos(p3)*p5))
; dialog ""+set(0)+","+set(1)
set(2)=set(0)
set(3)=set(1)
if set(0)<ginfo_dispx :set(2)=ginfo_dispx
if set(1)<ginfo_dispy :set(3)=ginfo_dispy
bgscr aki_windowID+objID, set(2), set(3), 2, p1-set(0)/2, p2-set(1)/2
width set(0), set(1)
ObjPos_GetWindowLong hwnd, -16
ObjPos_SetWindowLong hwnd, -16, stat& 0x7FFFFFFF | 0x40000000
ObjPos_SetParent hwnd,hw
rgncol=0
if ( col(0)+col(1)+col(2) )=0 :color 255,0,0 :boxf@hsp :rgncol=255 :else :color :boxf@hsp
color col(0),col(1),col(2)
grect@hsp set(0)/2, set(1)/2,p3,p4,p5
ObjPos_SetRgn hwnd,rgncol // 透化ウィンドウにする。
hobj(objID)=hwnd
objtype(objID)="grect"
objoptn(objID)=p3
objcomm(objID)="p3="+p3+", COLOR("+col(0)+","+col(1)+","+col(2)+")"
hspline(objID) = ScLine
hspfile(objID) = ScFile
gsel aki_windowID+objID,1
objID++
gsel sel
return cst
;パラメータ省略時の処理
#define global grect(%1=0,%2=0,%3=0.0,%4=-1,%5=-1) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :dp4@ObjPosMod=%4:dp5@ObjPosMod=%5:if %4=-1|%5=-1{ mref bmscr@ObjPosMod,67:if %4=-1{dp4@ObjPosMod=bmscr@ObjPosMod.29} :if %5=-1{dp5@ObjPosMod=bmscr@ObjPosMod.30} }:ObjPos_grect %1,%2,%3,%4,%5
;命令を削除して
#undef picload
;あらたに設定
#deffunc ObjPos_picload str p1, int p2
cst=stat
if checkObjposing()=0 || p2=0 :picload@hsp p1,p2 :return cst
sel=ginfo_sel
psn=ginfo_cx, ginfo_cy
;ダミーを子ウィンドウとして描画
bgscr aki_windowID+objID, 1, 1, 2, ginfo_cx, ginfo_cy
picload@hsp p1,0
ObjPos_GetWindowLong hwnd, -16
ObjPos_SetWindowLong hwnd, -16, stat& 0x7FFFFFFF | 0x40000000
ObjPos_SetParent hwnd,hw
width ,,psn.0, psn.1
;詳細を記憶
hobj(objID)=hwnd
objtype(objID)="picload"
objcomm(objID)=""+p1
hspline(objID) = ScLine
hspfile(objID) = ScFile
gsel aki_windowID+objID,1
objID++
gsel sel
return
;パラメータ省略時の処理
#define global picload(%1,%2=0) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_picload %1,%2
;命令を削除して
#undef chkbox
;あらたに設定
#deffunc ObjPos_chkbox str p1, var p2
chkbox@hsp p1,p2
st=stat
if checkObjposing()=0 :return st
hobj(objID)=objinfo_hwnd(st)
objtype(objID)="chkbox"
objcomm(objID)="p1="+p1
hspline(objID) = ScLine
hspfile(objID) = ScFile
objID++
return st
;パラメータ省略時の処理
#define global chkbox(%1,%2) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_chkbox %1,%2
;命令を削除して
#undef mesbox
;あらたに設定
#deffunc ObjPos_mesbox var p1, int p2, int p3, int p4, int p5
mesbox@hsp p1,p2,p3,p4,p5
st=stat
if checkObjposing()=0 :return st
hobj(objID)=objinfo_hwnd(st)
objtype(objID)="mesbox"
objcomm(objID)=""+p1+varname
hspline(objID) = ScLine
hspfile(objID) = ScFile
objID++
return st
;パラメータ省略時の処理
#define global mesbox(%1,%2=-1,%3=-1,%4=1,%5=-1) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :dp2@ObjPosMod=%2:dp3@ObjPosMod=%3:if %2=-1|%3=-1{ mref bmscr@ObjPosMod,67:if %2=-1{dp2@ObjPosMod=bmscr@ObjPosMod.29} :if %3=-1{dp3@ObjPosMod=bmscr@ObjPosMod.30} }:ObjPos_mesbox %1,dp2@ObjPosMod,dp3@ObjPosMod,%4,%5
;命令を削除して
#undef input
;あらたに設定
#deffunc ObjPos_input var p1, int p2, int p3, int p4
input@hsp p1,p2,p3,p4
st=stat
if checkObjposing()=0 :return st
hobj(objID)=objinfo_hwnd(st)
objtype(objID)="input"
objcomm(objID)=""+p1
hspline(objID) = ScLine
hspfile(objID) = ScFile
objID++
return st
;パラメータ省略時の処理
#define global input(%1,%2=-1,%3=-1,%4=-1) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :dp2@ObjPosMod=%2:dp3@ObjPosMod=%3:if %2=-1|%3=-1{ mref bmscr@ObjPosMod,67:if %2=-1{dp2@ObjPosMod=bmscr@ObjPosMod.29} :if %3=-1{dp3@ObjPosMod=bmscr@ObjPosMod.30} }:ObjPos_input %1,dp2@ObjPosMod,dp3@ObjPosMod,%4
;命令を削除して
#undef combox
;あらたに設定
#deffunc ObjPos_combox var p1, int p2, str p3
combox@hsp p1,p2,p3
st=stat
if checkObjposing()=0 :return st
hobj(objID)=objinfo_hwnd(st)
objtype(objID)="combox"
objcomm(objID)=""+p1
hspline(objID) = ScLine
hspfile(objID) = ScFile
objID++
return st
;パラメータ省略時の処理
#define global combox(%1,%2=100,%3="") ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_combox %1,%2,%3
;命令を削除して
#undef listbox
;あらたに設定
#deffunc ObjPos_listbox var p1, int p2, str p3
listbox@hsp p1,p2,p3
st=stat
if checkObjposing()=0 :return st
hobj(objID)=objinfo_hwnd(st)
objtype(objID)="listbox"
objcomm(objID)=""+p1
hspline(objID) = ScLine
hspfile(objID) = ScFile
objID++
return st
;パラメータ省略時の処理
#define global listbox(%1,%2=100,%3="") ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_listbox %1,%2,%3
;命令を削除して
#undef winobj
;あらたに設定
#deffunc ObjPos_winobj str p1, str p2, int p3, int p4, int p5, int p6, int p7, int p8
winobj@hsp p1,p2,p3,p4,p5,p6,p7,p8
st=stat
if checkObjposing()=0 :return st
hobj(objID)=objinfo_hwnd(st)
objtype(objID)="winobj "+p1
objcomm(objID)="Title="+p2
hspline(objID) = ScLine
hspfile(objID) = ScFile
objID++
return st
;パラメータ省略時の処理
#define global winobj(%1="",%2="",%3=0,%4=0,%5=0,%6=0,%7=0,%8=0) ScLine@ObjPosMod=__line__ :ScFile@ObjPosMod=__file__ :ObjPos_winobj %1,%2,%3,%4,%5,%6,%7,%8
;命令を削除して
#undef button
;あらたに設定
#define global button if(checkObjposing()=1){ objBtnLine@ObjPosMod(objButtonID@ObjPosMod)=__line__ : objBtnFile@ObjPosMod(objButtonID@ObjPosMod)=__file__ : mref bmscr@ObjPosMod,96+ginfo_sel: objBtnID@ObjPosMod(objButtonID@ObjPosMod)=bmscr@ObjPosMod(72) :objButtonID@ObjPosMod++ } button@hsp
;スタティックテキストの色
*objposmod_ctlcolor
ctlclr_flg=0
repeat objID
;ハンドルが一致するものを探す
if lparam = hobj(cnt) {
if objtype(cnt)!"mes" :break
ObjPos_SetTextColor wparam, hColor(cnt) ;テキストカラー設定
ObjPos_SetBkMode wparam, 1 ;背景のモードを設定
ctlclr_flg=1
break
}
loop
if ctlclr_flg=1 {
if ctlclr_tien=lparam :ctlclr_tien=0 :return hBrush ;3D表面色
return ObjPos_GetStockObject(5) ;スタティックテキストの背景 透過
}
return
;//オブジェクトの処理をフック
*objposmod_HookProc
nCode = ObjPos_callbkarg(0)
wp = ObjPos_callbkarg(1)
lp = ObjPos_callbkarg(2)
if nCode < 0 {
ObjPos_CallNextHookEx hHook, nCode, wp, lp ;フックチェーン内の次のフックプロシージャに、フック情報を渡す
return stat
} else {
;title "$"+strf("%x",wp)
;//オブジェクト変更中じゃない geth=0
if geth=0 {
;// 取得ハンドルなし
dupptr MOUSEHOOKSTRUCT,lp,12 ;MOUSEHOOKSTRUCT構造体
;指定ウィンドウIDのハンドルと比較して、違ったら次のフックへ
if hw ! ObjPos_GetParent(MOUSEHOOKSTRUCT(2)) {
;nTitle="("+(MOUSEHOOKSTRUCT(2))+","+(hwnd)+")"+ObjPos_GetParent(MOUSEHOOKSTRUCT(2))
;title_objpos nTitle; ;タイトル名を変更
ObjPos_CallNextHookEx hHook, nCode, wp, lp :return stat
}
;// クリック
switch wp
case $201 ;WM_LBUTTONDOWN
case $204 ;WM_RBUTTONDOWN
geth=MOUSEHOOKSTRUCT(2) ;ハンドル取得
ObjPos_GetWindowRect geth,varptr(rect) ;オブジェクトのサイズ取得
geth(1)=ginfo_mx-rect(0),ginfo_my-rect(1),wp;オブジェクトとマウスの座標差、wpalamを記憶
ObjPos_InvalidateRect geth,0,1 ;領域の再描画
getID=-1
repeat objID
if hobj(cnt)=geth {
getID=cnt
if objtype(getID)="mes" :ctlclr_tien=hobj(getID) ;クリックがテキストだったら、背景を3D表面色で塗りつぶしちゃうようにする
break
}
loop
return
swbreak
case $200 ;WM_MOUSEMOVE
;オブジェクトフォーカス
gh=MOUSEHOOKSTRUCT(2)
getID=-1
repeat objID
if hobj(cnt)=gh {
getID=cnt
break
}
loop
if getID=-1 {
hobj(objID) = gh
sdim txt,256
ObjPos_GetClassName gh, varptr.txt, 256
objtype(objID) = txt
sdim txt,256
sendmsg gh,$d/*WM_GETTEXT*/,256,varptr.txt
objcomm(objID) = txt
hspline(objID) = ScLine
hspfile(objID) = ScFile
getID=objID
if objtype(objID)="Button" {
g_sel = ginfo_sel
gsel objposing_windowID
repeat objButtonID
if objinfo_hwnd(objBtnID(cnt)) = hobj(objID) {
hspline(objID) = objBtnLine(cnt)
hspfile(objID) = objBtnFile(cnt)
break
}
loop
gsel g_sel
}
objID++
}
ObjPos_GetWindowRect gh,varptr(rect) ;オブジェクトのサイズ取得
pt=rect(0),rect(1)
ObjPos_ScreenToClient hw,varptr(pt)
nTitle="POS("+(pt.0)+","+pt.1+") SIZE("+(rect.2-rect.0)+","+(rect.3-rect.1)+") "
if getID!-1 :nTitle = strf("%s / %s %s",objtype(getID),nTitle,objcomm(getID))
title_objpos nTitle; ;タイトル名を変更
swbreak
swend
}else {
;//オブジェクト変更中 geth!0
point=ginfo_mx,ginfo_my
ObjPos_ScreenToClient hw,varptr(point)
switch geth(3)
case $201 ;WM_LBUTTONDOWN
pt=rect(0),rect(1)
ObjPos_ScreenToClient hw,varptr(pt)
set=point(0)-geth(1), point(1)-geth(2), rect(2)-rect(0)-1, rect(3)-rect(1)-1
getkey sft,16 :getkey ctl,17
if ctl :set(0)=pt(0)
if sft :set(1)=pt(1)
swbreak
case $204 ;WM_RBUTTONDOWN
pt=rect(0),rect(1)
ObjPos_ScreenToClient hw,varptr(pt)
set=pt(0), pt(1), ginfo_mx-(geth(1)+rect(0))+rect(2)-rect(0)-1, ginfo_my-(geth(2)+rect(1))+rect(3)-rect(1)-1
getkey sft,16 :getkey ctl,17
if ctl :set(2)=rect(2)-rect(0)-1
if sft :set(3)=rect(3)-rect(1)-1
if set(2)<0 :set(2)=0
if set(3)<0 :set(3)=0
if getID!-1 {
switch objtype(getID)
case "line"
sel=ginfo_sel
gsel aki_windowID+getID
col=ginfo_r,ginfo_g,ginfo_b
rgncol=0
if ( col(0)+col(1)+col(2) )=0 :color 255,0,0 :boxf@hsp :rgncol=255 :else :color :boxf@hsp
color col(0),col(1),col(2)
line@hsp 0,0,set(2),set(3)
ObjPos_SetRgn hwnd,rgncol ;透化ウィンドウにする。
gsel sel
swbreak
case "circle"
sel=ginfo_sel
gsel aki_windowID+getID
col=ginfo_r,ginfo_g,ginfo_b
rgncol=0
if ( col(0)+col(1)+col(2) )=0 :color 255,0,0 :boxf@hsp :rgncol=255 :else :color :boxf@hsp
color col(0),col(1),col(2)
circle@hsp 0,0,set(2),set(3),int(strmid(objcomm(getID),3,1))
ObjPos_SetRgn hwnd,rgncol ;透化ウィンドウにする。
gsel sel
swbreak
case "grect"
sel=ginfo_sel
gsel aki_windowID+getID
col=ginfo_r,ginfo_g,ginfo_b
rgncol=0
if ( col(0)+col(1)+col(2) )=0 :color 255,0,0 :boxf@hsp :rgncol=255 :else :color :boxf@hsp
set(2)++
set(3)++
color col(0),col(1),col(2)
dig=objoptn(getID)
dbl=sin(dig)*sin(dig)-cos(dig)*cos(dig)
grect@hsp (set(2)+1)/2,(set(3)+1)/2,objoptn(getID),(cos(dig)*set(2)-sin(dig)*set(3))/(-dbl),(sin(dig)*set(2)-cos(dig)*set(3))/dbl
ObjPos_SetRgn hwnd,rgncol ;透化ウィンドウにする。
gsel sel
swbreak
case "mes"
sel=ginfo_sel
mae_size=1,1
gsel aki_windowID+getID
a=0
getstr temp,objfont(getID),a,',' :a+=strsize :
getstr temp,objfont(getID),a,',' :a+=strsize :f_style=int(temp)
getstr temp,objfont(getID),a :a+=strsize :f_name=temp
repeat 1000,1
font f_name,cnt,f_style
mref bmscr, 67 ;フォントハンドルをBMSCR構造体から取得
hF = bmscr.38
; メッセージサイズを取得
mes_size_objpos objcomm(getID),size, hF
if size(0)>set(2)+1 || size(1)>set(3)+1 {
;オブジェクトのサイズより大きくなったら、その1つ前が最適サイズ
font f_name,cnt-1,f_style
mref bmscr, 67 ;フォントハンドルをBMSCR構造体から取得
hFont(getID) = bmscr.38
getstr temp,objfont(getID),0,','
objfont(getID)=""+(cnt-1)+","+strmid(objfont(getID),strsize,1024)
;f_size(getID)=cnt-1
break
}
mae_size=size(0),size(1)
loop
sendmsg geth, $30/*WM_SETFONT*/, hFont(getID) ;フォントを適用しなおし
;スタティックテキストのサイズをフォントの大きさに合わせなおす
set(2)=mae_size(0)-1,mae_size(1)-1
ObjPos_SetWindowPos geth,-2/*HWND_NOTOPMOST*/,set(0),set(1),set(2)+1,set(3)+1,$200|$4/*SWP_NOOWNERZORDER|SWP_NOZODER*/
ctlclr_tien=geth
gsel sel
swbreak
swend
}
swbreak
swend
ObjPos_SetWindowPos geth,-2/*HWND_NOTOPMOST*/,set(0),set(1),set(2)+1,set(3)+1,$200|$4/*SWP_NOOWNERZORDER|SWP_NOZODER*/
ObjPos_InvalidateRect geth,0,1 ;領域の再描画
ObjPos_UpdateWindow geth ;領域の再描画
nTitle="POS("+(set(0))+","+set(1)+") SIZE("+(set(2)+1)+","+(set(3)+1)+") "
if getID!-1 :nTitle = strf("%s / %s %s",objtype(getID),nTitle,objcomm(getID))
title_objpos nTitle; ;タイトル名を変更
;クリックを離す
switch geth(3)
case $201 ;WM_LBUTTONDOWN
if wp=$202/*WM_LBUTTONUP*/ || wp=$a2/*WM_NCLBUTTONUP*/ {
putListView getID, set(0),set(1), set(2)+1,set(3)+1
geth=0
return
}
swbreak
case $204 ;WM_RBUTTONDOWN
if wp=$205/*WM_RBUTTONUP*/ || wp=$a5/*WM_NCRBUTTONUP*/ {
putListView getID, set(0),set(1), set(2)+1,set(3)+1
geth=0
return
}
swbreak
swend
}
ObjPos_CallNextHookEx hHook, nCode, wp, lp
}
return
;//リストビュー処理。右クリックを取得してクリップボードに文字列をコピー
*WM_NOTIFY
dupptr code,lparam,112
if code=hList {
if code(2)=-5/*NM_RCLICK*/ && code(3)>=0 {
;//右クリックメニュー
ObjPos_CreatePopupMenu
hMenu = stat
ObjPos_AppendMenu hMenu,$3,0,"コピー"
ObjPos_AppendMenu hMenu,$8,0,0
;各タイプごとに異なるメニュー
listType = ListView_GETITEM(code(3),3)
switch listType
case "mes" :
;POSを取得
ltxt=ListView_GETITEM(code(3),4)
strrep ltxt, "POS(", "" : strrep ltxt, ")", ""
split ltxt, ",", lpxy
;SIZEを取得
ltxt=ListView_GETITEM(code(3),5)
strrep ltxt, "FONT(", "" : strrep ltxt, ")", ""
split ltxt, ",", lfnt
lmenuTxt(0) = strf("pos %d, %d", lpxy(0), lpxy(1))
lmenuTxt(1) = strf(" %d, %d", lpxy(0), lpxy(1))
lmenuTxt(2) = strf("font \"%s\", %d, %d", lfnt(2), lfnt(0), lfnt(1))
lmenuTxt(3) = strf(" \"%s\", %d, %d", lfnt(2), lfnt(0), lfnt(1))
lmenuTxt(4) = strf("font \"%s\", %d, %d :pos %d, %d", lfnt(2), lfnt(0), lfnt(1), lpxy(0), lpxy(1))
ObjPos_AppendMenu hMenu,0,1, lmenuTxt(0)
ObjPos_AppendMenu hMenu,0,2, lmenuTxt(1)
ObjPos_AppendMenu hMenu,$8,0, 0
ObjPos_AppendMenu hMenu,0,3, lmenuTxt(2)
ObjPos_AppendMenu hMenu,0,4, lmenuTxt(3)
ObjPos_AppendMenu hMenu,$8,0, 0
ObjPos_AppendMenu hMenu,0,5, lmenuTxt(4)
swbreak
case "boxf" :
;POSを取得
ltxt=ListView_GETITEM(code(3),4)
strrep ltxt, "POS(", "" : strrep ltxt, ")", ""
split ltxt, ",", lpxy
;SIZEを取得
ltxt=ListView_GETITEM(code(3),5)
strrep ltxt, "SIZE(", "" : strrep ltxt, ")", ""
split ltxt, ",", lsxy
lmenuTxt(0) = strf("boxf %d, %d, %d, %d", lpxy(0), lpxy(1), int.lpxy(0)+int.lsxy(0)-1, int.lpxy(1)+int.lsxy(1)-1 )
lmenuTxt(1) = strf(" %d, %d, %d, %d", lpxy(0), lpxy(1), int.lpxy(0)+int.lsxy(0)-1, int.lpxy(1)+int.lsxy(1)-1 )
ObjPos_AppendMenu hMenu,0,1, lmenuTxt(0)
ObjPos_AppendMenu hMenu,0,2, lmenuTxt(1)
swbreak
case "line"
;POSを取得
ltxt=ListView_GETITEM(code(3),4)
strrep ltxt, "POS(", "" : strrep ltxt, ")", ""
split ltxt, ",", lpxy
;SIZEを取得
ltxt=ListView_GETITEM(code(3),5)
strrep ltxt, "SIZE(", "" : strrep ltxt, ")", ""
split ltxt, ",", lsxy
lmenuTxt(0) = strf("line %d, %d, %d, %d", lpxy(0), lpxy(1), int.lpxy(0)+int.lsxy(0), int.lpxy(1)+int.lsxy(1) )
lmenuTxt(1) = strf(" %d, %d, %d, %d", lpxy(0), lpxy(1), int.lpxy(0)+int.lsxy(0)-1, int.lpxy(1)+int.lsxy(1)-1 )
ObjPos_AppendMenu hMenu,0,1, lmenuTxt(0)
ObjPos_AppendMenu hMenu,0,2, lmenuTxt(1)
swbreak
case "circle"
;POSを取得
ltxt=ListView_GETITEM(code(3),4)
strrep ltxt, "POS(", "" : strrep ltxt, ")", ""
split ltxt, ",", lpxy
;SIZEを取得
ltxt=ListView_GETITEM(code(3),5)
strrep ltxt, "SIZE(", "" : strrep ltxt, ")", ""
split ltxt, ",", lsxy
;備考を取得
ltxt=ListView_GETITEM(code(3),6)
split ltxt, ",", lbko
strrep lbko, "p5=", ""
lmenuTxt(0) = strf("circle %d, %d, %d, %d, %d", lpxy(0), lpxy(1), int.lpxy(0)+int.lsxy(0)-1, int.lpxy(1)+int.lsxy(1)-1, lbko )
lmenuTxt(1) = strf(" %d, %d, %d, %d, %d", lpxy(0), lpxy(1), int.lpxy(0)+int.lsxy(0)-1, int.lpxy(1)+int.lsxy(1)-1, lbko )
ObjPos_AppendMenu hMenu,0,1, lmenuTxt(0)
ObjPos_AppendMenu hMenu,0,2, lmenuTxt(1)
swbreak
case "grect"
;POSを取得
ltxt=ListView_GETITEM(code(3),4)
strrep ltxt, "POS(", "" : strrep ltxt, ")", ""
split ltxt, ",", lpxy
;SIZEを取得
ltxt=ListView_GETITEM(code(3),5)
strrep ltxt, "SIZE(", "" : strrep ltxt, ")", ""
split ltxt, ",", lsxy
;備考を取得
ltxt=ListView_GETITEM(code(3),6)
split ltxt, ",", lbko
strrep lbko, "p3=", ""
dig=double.lbko
dbl=sin(dig)*sin(dig)-cos(dig)*cos(dig)
lmenuTxt(0) = strf("grect %d, %d, %s, %d, %d", int.lpxy(0)+(int.lsxy(0)+1)/2-1, int.lpxy(1)+(int.lsxy(1)+1)/2-1, strtrim(lbko,0,'0'), int((cos(dig)*int.lsxy(0)-sin(dig)*int.lsxy(1))/(-dbl))-1, int((sin(dig)*int.lsxy(0)-cos(dig)*int.lsxy(1))/(dbl))-1 )
lmenuTxt(1) = strf(" %d, %d, %s, %d, %d", int.lpxy(0)+(int.lsxy(0)+1)/2-1, int.lpxy(1)+(int.lsxy(1)+1)/2-1, strtrim(lbko,0,'0'), int((cos(dig)*int.lsxy(0)-sin(dig)*int.lsxy(1))/(-dbl))-1, int((sin(dig)*int.lsxy(0)-cos(dig)*int.lsxy(1))/(dbl))-1 )
ObjPos_AppendMenu hMenu,0,1, lmenuTxt(0)
ObjPos_AppendMenu hMenu,0,2, lmenuTxt(1)
swbreak
case "picload" :
;POSを取得
ltxt=ListView_GETITEM(code(3),4)
strrep ltxt, "POS(", "" : strrep ltxt, ")", ""
split ltxt, ",", lpxy
lmenuTxt(0) = strf("pos %d, %d", lpxy(0), lpxy(1) )
lmenuTxt(1) = strf(" %d, %d", lpxy(0), lpxy(1) )
ObjPos_AppendMenu hMenu,0,1, lmenuTxt(0)
ObjPos_AppendMenu hMenu,0,2, lmenuTxt(1)
swbreak
case "chkbox" :
case "input" :
case "mesbox" :
case "combox" :
case "listbox" :
case "Button" :
default :
;POSを取得
ltxt=ListView_GETITEM(code(3),4)
strrep ltxt, "POS(", "" : strrep ltxt, ")", ""
split ltxt, ",", lpxy
;SIZEを取得
ltxt=ListView_GETITEM(code(3),5)
strrep ltxt, "SIZE(", "" : strrep ltxt, ")", ""
split ltxt, ",", lsxy
lmenuTxt(0) = strf("pos %d, %d", lpxy(0), lpxy(1) )
lmenuTxt(1) = strf(" %d, %d", lpxy(0), lpxy(1) )
lmenuTxt(2) = strf("objsize %d, %d", lsxy(0), lsxy(1) )
lmenuTxt(3) = strf(" %d, %d", lsxy(0), lsxy(1) )
ObjPos_AppendMenu hMenu,0,1, lmenuTxt(0)
ObjPos_AppendMenu hMenu,0,2, lmenuTxt(1)
ObjPos_AppendMenu hMenu,0,3, lmenuTxt(2)
ObjPos_AppendMenu hMenu,0,4, lmenuTxt(3)
swbreak
objsize
swend
ObjPos_TrackPopupMenu hMenu, $100, ginfo(0), ginfo(1), 0, hwObjpos, 0
select=stat
ObjPos_DestroyMenu hMenu
if select = 0 :return
;//クリップボードにコピー
apiClipSave strtrim( lmenuTxt(select-1), 0, ' ' )
return
}
}
return
#global
screen 0,480,320
font "",14
pos 10,10
mes "StartObjPos_SetBlankWinIDを実行したウィンドウだけ"
j="オブジェクトを移動できるようになります"
input j,450,20
screen 1, 480,320
StartObjPos_SetBlankWinID 123 ;描画先ウィンドウのオブジェクト配置変更実行。引数には'それ以降'確実にウィンドウIDが空いている数値を指定する必要がある。
font "MS ゴシック", 14
pos 10,10
ipt="オブジェクトやmesの位置を左ドラッグで移動、"
input ipt,450,20
mes "右ドラッグでサイズ変更ができます。"
mes "リストビューを右クリックでテキストコピー。"
color 0,0,255
boxf 145,90,155,100
color
pos 165,85 :mes "メッセージ"
msbx=""
pos 145,110 :mesbox msbx,100,100
objsize 70, 65
pos 255,110 :button goto "実行", *go
objsize 70, 25
pos 255,185 :button gosub "変更", *ch
pos 145,225 :winobj "msctls_trackbar32","",,$50000000|$100|$10|$8, 180, 20
ipt2="インプット"
pos 145,250 :input ipt2, 180,20
objsize 150,30
pos 145,275 :chkbox "チェックボックス",b
color 255,0,0
circle 365,200,455,290,1
stop
*go
title "実行"
stop
*ch
title "変更"
return
---
【ファイルの更新日時を見ると】
最初に挑戦を始めたのが2006年で、1回諦めて、
2009年に再挑戦して、また諦めて、
今、とりあえずイメージだけ伝えられるように放流して他の人に丸投げ。という状態。
| |
|
2015/4/24(Fri) 17:26:51|NO.68729
すみません。
上記のモジュールですが、肝心の使い方を書いてなかったですね^^;
普通に書いていたスクリプトに、
1.「オブジェクト配置」したいなって思った時に、ObjPosModule.hsp をインクルード。(ObjPosModule_b1.zipに同梱)
#include "ObjPosModule.hsp"
2.「オブジェクト配置」したいウィンドウを作成した後、StartObjPosMod_blankWinID を実行。
screen 2,640,480
StartObjPosMod_blankWinID 123 ; ←それ以降 空いているウィンドウIDを指定
3.HSPを実行(F5)。
4.オブジェクトをドラッグして配置・サイズを調整。
5.リストビューを右クリックすると修正内容をコピーできるので、手動でスクリプトの内容を修正する。
以上です。
|
|
2015/4/25(Sat) 13:55:30|NO.68745
MIZUSHIKIさん。
ありがとうございます。
明日、じっくりと読ませてもらいます。
それでは。
|
|
2015/4/26(Sun) 16:49:10|NO.68795
> 調べてみましたが、以下のコンテスト2作品くらいでしょうか。
「SoupDevelop」は去年使ってみましたね。
今回「HSP Visual Designer」を使ってみましたが、
ドラッグ移動やリサイズは使いやすかったです。
HSPのスクリプトは、やっぱり自分とは違いますので…ですね。
> ・・・話は変わりますが、HSPスクリプトの記述の仕方って結構人によって様々ですよね。
同感。
> フォームデザイナでスクリプトを吐き出す形式ってツールによって書式が決まっちゃうじゃないですか。
ですね。
> 書式の見た目が慣れないですし、なんとか自由に記述できて、かつ、オブジェクトをドラッグして配置出来るような風に出来ないかなって、昔 ずっと考えてました。
ふむふむ。
> 「いっそ、オブジェクトを1回記述してしまって、作ってるソフトの中でオブジェクトを移動して、その配置をスクリプトに反映させるように出来ないかな」って。
こちらはC言語タイプで作りましたね。
> それをちょっとひっくり返してきて、ちょちょっと手を加えたものが以下になります。
なるほどね。
私はグリッド単位でオブジェクトを移動できるタイプが欲しかったので、
上記の「HSP Visual Designer」が操作性では理想でした。
> ・コールバックをdllを使わないように機械語で出来ないか。
http://hsp.tv/play/pforum.php?mode=all&num=62130
↑
この「コールバック用モジュールができました」が使えそうですよ。
> ・他のオブジェクトと位置関係を揃えられるような吸着(?)機能。
これね。
左クリックか、CTRL+オブジェクト、SHIFT+オブジェクトで選択オブジェクトを何らかの方法で記憶。
そして、一括して左揃え、右揃え、上揃え、下揃えなどなどすれば良いと思います。
> ・中でウィンドウIDを使いまくってる。それ以降空いているIDを指定しないといけないのが不細工。可能なら直したかった。
そんなに必要ですか?
軽く「ObjPosModule.hsp」を見てみましたが、オブジェクトの処理をフックしてますね。
サブクラス化やフックでオブジェクトをドラッグする方法は、
コールバック関数が使えない今のHSPでは何らかのDLLを必要としますね。
しかし、オブジェクトを無効にすることで簡単にオブジェクトの移動が可能です。
//------------------------------------------------------------------------------
// 科学太郎のサンプル for HSP(Ver.3.3.2)
//==============================================================================
// テーマ:HSP専用オブジェクト・エディタ
//------------------------------------------------------------------------------
#cmpopt varinit 1
#packopt hide 1
#packopt name __file__
#packopt xsize 640
#packopt ysize 480
#
#include "User32.as"
//------------------------------------------------------------------------------
// HSP専用オブジェクト・エディタの記号定数
//------------------------------------------------------------------------------
#ifndef __OBJEDIT_HEAD__
#const global __OBJEDIT_HEAD__
//--------------------------------------
// 記号定数(API関数)
//--------------------------------------
#const global NULL $00000000
#const global WM_TIMER $00000113
#const global WM_MOUSEMOVE $00000200
#const global WM_LBUTTONUP $00000202
#const global WM_LBUTTONDOWN $00000201
#const global WM_CONTEXTMENU $0000007B
#
#const global MF_STRING $00000000
#const global MF_SEPARATOR $00000800
#
#const global TPM_LEFTALIGN $00000000
#const global TPM_TOPALIGN $00000000
#const global TPM_NONOTIFY $00000080
#const global TPM_RETURNCMD $00000100
#const global TPM_LEFTTOPALIGN (TPM_LEFTALIGN|TPM_TOPALIGN|TPM_NONOTIFY|TPM_RETURNCMD)
#
#const global GWL_STYLE $FFFFFFF0
#const global GWL_EXSTYLE $FFFFFFEC
#const global GWL_HWNDPARENT $FFFFFFF8
#
#const global WS_MAXIMIZEBOX $00010000
#const global WS_MINIMIZEBOX $00020000
#const global WS_THICKFRAME $00040000
#const global WS_VISIBLE $10000000
#const global WS_CHILD $40000000
#const global WS_EX_STATICEDGE $00020000
#
#const global SS_LEFT $00000000
#const global SS_CENTER $00000001
#const global SS_RIGHT $00000002
#const global SS_CENTERIMAGE $00000200
#
#const global SWP_NOSIZE $00000001
#const global SWP_NOMOVE $00000002
#const global SWP_NOZORDER $00000004
#const global SWP_NOOWNERZORDER $00000200
#const global SWP_FRAMECHANGED $00000020
#const global SPI_GETWORKAREA $00000030
//--------------------------------------
// 記号定数(文字列)
//--------------------------------------
#define MSG_CAPTION "HSPオブジェクト・エディタ by 科学太郎"
//--------------------------------------
// 記号定数(タイマーID)
//--------------------------------------
#const TID_REDRAW 1
#const TMS_REDRAW 100
#
#const SCRIPT_MAIN %0001
#const SCRIPT_DIALOG %0010
#const SCRIPT_BUTTON %0100
#const SCRIPT_OBJECT %1000
//--------------------------------------
// 列挙定数(ウインドウID)
//--------------------------------------
#enum global WID_EDITOR=0 ;編集ウインドウ
#enum global WID_SCRIPT ;出力ウインドウ
#enum global WID_OPTION ;設定ウインドウ
#enum global MAX_WID
//--------------------------------------
// 列挙定数(メニューID)
//--------------------------------------
#enum global MENU_NULL=0 ;なし
#enum global MENU_SCRIPTVIEW ;スクリプトの表示(S)...
#enum global MENU_SCRIPTCOPY ;スクリプトのコピー(C)
#enum global MENU_SCRIPTPASTE ;スクリプトの貼り付け(P)
#
#enum global MENU_OPTION ;オプションの表示(O)...
#enum global MENU_ABOUT ;バージョン情報(V)...
#enum global MENU_HELP ;ヘルプ(H)
#
#enum global MENU_FOLDER ;hspObjectEdit のフォルダ(W)
#enum global MENU_BOOT ;hspObjectEdit の起動(R)
#enum global MENU_QUIT ;hspObjectEdit の終了(X)
//--------------------------------------
// 列挙定数(メニューID)
//--------------------------------------
#enum global RECT_NULL=0 ;なし
#enum global RECT_LTEXT ;mes(左寄せ)
#enum global RECT_CTEXT ;mes(センタリング)
#enum global RECT_RTEXT ;mes(右寄せ)
#
#enum global RECT_BUTTON ;button(プッシュボタン)
#enum global RECT_CHKBOX ;chkbox(チェックボタン)
#enum global RECT_LISTBOX ;listbox(リストボックス)
#enum global RECT_COMBOX ;combox(コンボボックス)
#enum global RECT_MESBOX ;mesbox(メッセージボックス)
#enum global RECT_INPUT ;input(入力ボックス)
#enum global MAX_RECT
//--------------------------------------
// 列挙定数(オプション画面)
//--------------------------------------
#enum global EID_MARGINX=0
#enum global EID_MARGINY
#enum global EID_DOTGRIDX
#enum global EID_DOTGRIDY
#enum global EID_NEWSIZEX
#enum global EID_NEWSIZEY
#enum global EID_OBJTYPE
#enum global EID_OBJNUMB
#enum global EID_OBJCURSX
#enum global EID_OBJCURSY
#enum global EID_OBJSIZEX
#enum global EID_OBJSIZEY
#enum global EID_OBJTEXT
#enum global EID_OBJNAME
#enum global EID_OBJLABEL
#
#enum global BID_ENABLE
#enum global BID_DELETE
#enum global BID_CHANGE
//--------------------------------------
// マクロ変数(全体情報)
//--------------------------------------
#define global nMarginX EditInfo(0)
#define global nMarginY EditInfo(1)
#define global dotGridX EditInfo(2)
#define global dotGridY EditInfo(3)
#define global newSizeX EditInfo(4)
#define global newSizeY EditInfo(5)
#define global allEnable EditInfo(6)
#define global hTitleMenu EditInfo(7)
#define global hRightMenu EditInfo(8)
#define global hWndEditor EditInfo(9)
#define global hWndScript EditInfo(10)
#define global hWndOption EditInfo(11)
#define global sxEditor EditInfo(12)
#define global syEditor EditInfo(13)
#define global scriptSw EditInfo(14)
#define global MAX_EDITINFO
//--------------------------------------
// マクロ変数(ドラッグ情報)
//--------------------------------------
#define global DragSw DragInfo(0)
#define global DragNo DragInfo(1)
#define global DragCx DragInfo(2)
#define global DragCy DragInfo(3)
#define global DragEx DragInfo(4)
#define global DragEy DragInfo(5)
#define global MAX_DRAGINFO
//--------------------------------------
// マクロ変数(オブジェクト情報)
//--------------------------------------
#define global objID ObjInt(0)
#define global objCursX ObjInt(1)
#define global objCursY ObjInt(2)
#define global objSizeX ObjInt(3)
#define global objSizeY ObjInt(4)
#define global objFontX ObjInt(5)
#define global objFontY ObjInt(6)
#define global MAX_OBJINT
//--------------------------------------
// マクロ変数(ソース情報)
//--------------------------------------
#define global SourceCreate "CreateUserDialog"
#define global SourceHandle "hWndUser"
#define global SourceCaption "設定ダイアログ"
#define global SourceWindowID "WID_USERDIALOG"
#define global SourceFontName "HG明朝E"
#define global SourceFontSize 14
#define global Source
#endif
//------------------------------------------------------------------------------
// End of hspObjectEdit.as
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// オブジェクトのクラス(モジュール型変数)
//==============================================================================
// m_tp :オブジェクトの種類番号(mes,button,chkbox,listbox,combox,mesbox,input)
// m_cx :オブジェクトの横軸位置
// m_cy :オブジェクトの縦軸位置
// m_sx :オブジェクトの横サイズ
// m_sy :オブジェクトの縦サイズ
// m_id :オブジェクトのID番号
// m_wnd :オブジェクトのハンドル(HWND型)
// m_data :オブジェクトのデータ値(整数値,文字列)
// m_name :オブジェクトのデータ名(変数名)
// m_label :オブジェクトのラベル名(ボタン用)
//------------------------------------------------------------------------------
#ifndef __OBJDATA_CLASS__
#const global __OBJDATA_CLASS__
#module objDataClass\
m_tp,\
m_cx,\
m_cy,\
m_sx,\
m_sy,\
m_id,\
m_wnd,\
m_data,\
m_name,\
m_label
//--------------------------------------
// マクロ変数(OK)
//--------------------------------------
#define LTextNo cntNo(0) ;LTEXTの生成カウンタ
#define CTextNo cntNo(1) ;CTEXTの生成カウンタ
#define RTextNo cntNo(2) ;RTEXTの生成カウンタ
#define buttonNo cntNo(3) ;butonの生成カウンタ
#define chkboxNo cntNo(4) ;chkboxの生成カウンタ
#define comboxNo cntNo(5) ;comboxの生成カウンタ
#define lstboxNo cntNo(6) ;listboxの生成カウンタ
#define mesboxNo cntNo(7) ;mesboxの生成カウンタ
#define inputNo cntNo(8) ;inputの生成カウンタ
#define valueNo cntNo(9) ;変数番号のカウンタ
#define labelNo cntNo(10) ;ラベル名のカウンタ
//--------------------------------------
// マクロ命令(OK)
//--------------------------------------
#define CreateLText LTextNo++:winobj "Static",strf("LTEXT%%02d",LTextNo),WS_EX_STATICEDGE,WS_CHILD|WS_VISIBLE|SS_CENTERIMAGE|SS_LEFT
#define CreateCText CTextNo++:winobj "Static",strf("CTEXT%%02d",CTextNo),WS_EX_STATICEDGE,WS_CHILD|WS_VISIBLE|SS_CENTERIMAGE|SS_CENTER
#define CreateRText RTextNo++:winobj "Static",strf("RTEXT%%02d",RTextNo),WS_EX_STATICEDGE,WS_CHILD|WS_VISIBLE|SS_CENTERIMAGE|SS_RIGHT
#define CreateButton buttonNo++:button gosub strf("BUTTON%%02d",buttonNo),*PushButton
#define CreateChkbox chkboxNo++:chkbox strf("CHECKBOX%%02d",chkboxNo),m_data
#define CreateCombox comboxNo++:combox m_data,m_sy,GetListString@objDataClass()
#define CreateListbox lstboxNo++:listbox m_data,m_sy,GetListString@objDataClass()
#define CreateMesbox mesboxNo++:m_data=strf("メッセージ%%02d",mesboxNo):mesbox m_data,,,5,0
#define CreateInput inputNo++:m_data=strf("入力ボックス%%02d",inputNo):input m_data
#define SetValueName valueNo++:m_name=strf("変数%%d",valueNo)
#define SetLabelName labelNo++:m_label=strf("Push%%02d",labelNo)
//--------------------------------------
// リストボックスの文字列(OK)
//--------------------------------------
#defcfunc local GetListString\
local s
sdim s
repeat 26,'A'
s+=strf("%c%c%c%c%c\n",cnt,cnt,cnt,cnt,cnt)
loop
return s
//--------------------------------------
// オブジェクトの初期化(OK)
//--------------------------------------
#modinit int _type_,int _cx_,int _cy_,int _sx_,int _sy_
m_tp=_type_
m_cx=_cx_
m_cy=_cy_
m_sx=_sx_
m_sy=_sy_
m_id=0
m_wnd=0
m_data=0
m_name=""
m_label=""
;オブジェクトの作成
pos m_cx,m_cy
objsize m_sx,m_sy
repeat 1
if(m_tp==RECT_LTEXT) :CreateLText :break
if(m_tp==RECT_CTEXT) :CreateCText :break
if(m_tp==RECT_RTEXT) :CreateRText :break
if(m_tp==RECT_BUTTON) :CreateButton :SetLabelName :break
if(m_tp==RECT_CHKBOX) :CreateChkbox :SetValueName :break
if(m_tp==RECT_COMBOX) :CreateCombox :SetValueName :break
if(m_tp==RECT_LISTBOX) :CreateListbox :SetValueName :break
if(m_tp==RECT_MESBOX) :CreateMesbox :SetValueName :break
if(m_tp==RECT_INPUT) :CreateInput :SetValueName :break
loop
m_id=stat
m_wnd=objinfo_hwnd(stat)
objenable stat,0
if(m_tp==RECT_CHKBOX){
GetWindowLong m_wnd,GWL_EXSTYLE
SetWindowLong m_wnd,GWL_EXSTYLE,(stat|WS_EX_STATICEDGE)
SetWindowPos m_wnd,NULL,0,0,0,0,(SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_FRAMECHANGED)
}
return
//--------------------------------------
// オブジェクトの範囲判定(OK)
//--------------------------------------
#modcfunc ObjDataCheck int _x_,int _y_
if(m_cx<=_x_)and(_x_<=(m_cx+m_sx-1)){
if(m_cy<=_y_)and(_y_<=(m_cy+m_sy-1)){
offsetX=(_x_-m_cx)
offsetY=(_y_-m_cy)
return 1
}
}
return 0
//--------------------------------------
// オブジェクトの移動設定(OK)
//--------------------------------------
#modfunc ObjDataMove int _x_,int _y_
m_cx=(_x_-offsetX)
m_cy=(_y_-offsetY)
SetWindowPos m_wnd,NULL,m_cx,m_cy,0,0,(SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER)
return
//--------------------------------------
// オブジェクトの描画(OK)
//--------------------------------------
#modfunc ObjDataDraw
SetWindowPos m_wnd,NULL,m_cx,m_cy,0,0,(SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER)
return
//--------------------------------------
// オブジェクトの補正処理(OK)
//--------------------------------------
#modfunc ObjDataAdjust int _cx_,int _cy_,int _sx_,int _sy_
if(m_cx<_cx_):m_cx=_cx_
if(m_cy<_cy_):m_cy=_cy_
m_cx=(m_cx-_cx_)/_sx_*_sx_+_cx_
m_cy=(m_cy-_cy_)/_sy_*_sy_+_cy_
SetWindowPos m_wnd,NULL,m_cx,m_cy,0,0,(SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER)
return
//--------------------------------------
// オブジェクトの種類を取得(OK)
//--------------------------------------
#modfunc ObjDataGetType
return m_tp
//--------------------------------------
// オブジェクトのIDを取得(OK)
//--------------------------------------
#modfunc ObjDataGetID
return m_id
//--------------------------------------
// オブジェクトの矩形を取得(OK)
//--------------------------------------
#modfunc ObjDataGetRect var _cx_,var _cy_,var _sx_,var _sy_
_cx_=m_cx
_cy_=m_cy
_sx_=m_sx
_sy_=m_sy
return
//--------------------------------------
// オブジェクトの矩形を設定(OK)
//--------------------------------------
#modfunc ObjDataSetRect int _cx_,int _cy_,int _sx_,int _sy_
m_cx=_cx_
m_cy=_cy_
m_sx=_sx_
m_sy=_sy_
SetWindowPos m_wnd,NULL,m_cx,m_cy,m_sx,m_sy,(SWP_NOZORDER|SWP_NOOWNERZORDER)
return
//--------------------------------------
// オブジェクトの内容を取得(OK)
//--------------------------------------
#modfunc ObjDataGetText var _msg_
if(m_tp==RECT_LISTBOX)or(m_tp==RECT_COMBOX){
_msg_=""
return
}
GetWindowTextLength m_wnd:sdim _msg_,stat+1
GetWindowText m_wnd,varptr(_msg_),stat+1
return
//--------------------------------------
// オブジェクトの内容を設定(OK)
//--------------------------------------
#modfunc ObjDataSetText str _msg_
if(m_tp==RECT_LISTBOX)or(m_tp==RECT_COMBOX){
return
}
SetWindowText m_wnd,_msg_
return
//--------------------------------------
// オブジェクトの有効化/無効化(OK)
//--------------------------------------
#modfunc ObjDataSetEnable int _sw_
objenable m_id,_sw_
return
//--------------------------------------
// オブジェクトのソース値を取得(OK)
//--------------------------------------
#modfunc ObjDataGetSource var _cx_,var _cy_,var _sx_,var _sy_,var _msg_,var _name_,var _label_
ObjDataGetText thismod,_msg_
_cx_=m_cx
_cy_=m_cy
_sx_=m_sx
_sy_=m_sy
_name_=m_name
_label_=m_label
return m_tp
//--------------------------------------
// オブジェクトのソース値を設定(OK)
//--------------------------------------
#modfunc ObjDataSetSource int _cx_,int _cy_,int _sx_,int _sy_,str _msg_,str _name_,str _label_
ObjDataSetRect thismod,_cx_,_cy_,_sx_,_sy_
ObjDataSetText thismod,_msg_
m_name=_name_
m_label=_label_
return
//--------------------------------------
// オブジェクトの全データを取得(OK)
//--------------------------------------
#modfunc ObjDataGetParam array _int_,array _str_
_int_(0)=m_tp
_int_(1)=m_cx
_int_(2)=m_cy
_int_(3)=m_sx
_int_(4)=m_sy
_int_(5)=m_id
_int_(6)=m_wnd
_str_(0)=str(m_data)
_str_(1)=m_name
_str_(2)=m_label
return m_tp
//--------------------------------------
// オブジェクトの全データを設定(OK)
//--------------------------------------
#modfunc ObjDataSetParam array _int_,array _str_
m_tp =_int_(0)
m_cx =_int_(1)
m_cy =_int_(2)
m_sx =_int_(3)
m_sy =_int_(4)
m_id =_int_(5)
m_wnd =_int_(6)
m_data =_str_(0)
m_name =_str_(1)
m_label =_str_(2)
;整数化
if(m_tp==RECT_CHKBOX)or(m_tp==RECT_LISTBOX)or(m_tp==RECT_COMBOX){
m_data=int(m_data)
}
SetWindowPos m_wnd,NULL,m_cx,m_cy,m_sx,m_sy,(SWP_NOZORDER|SWP_NOOWNERZORDER)
return
//--------------------------------------
// プッシュ・ボタンの処理(OK)
//--------------------------------------
*PushButton
return
//--------------------------------------
#global
#endif
//------------------------------------------------------------------------------
// End of objDataClass.as
//------------------------------------------------------------------------------
;#define CCOPT_MAXIMIZE
//--------------------------------------
// メイン部(OK)
//--------------------------------------
*Init
dim EditInfo,MAX_EDITINFO
dim DragInfo,MAX_DRAGINFO
dimtype objData,5,1
dim ObjInt,MAX_OBJINT
sdim msgType,0,MAX_RECT
sdim objType
sdim objText
sdim objName
sdim objLabel
sdim strScript
*Main
ObjectEditInit
hTitleMenu=CreateTitleMenu()
hRightMenu=CreateRightMenu()
hWndEditor=CreateObjectWindow(640,480)
hWndScript=CreateScriptWindow(400,300)
hWndOption=CreateOptionWindow(262,271)
SetWindowLong hWndScript,GWL_HWNDPARENT,hWndEditor
SetWindowLong hWndOption,GWL_HWNDPARENT,hWndEditor
gsel WID_SCRIPT,1
gsel WID_OPTION,1
gsel WID_EDITOR,1
stop
//--------------------------------------
// オブジェクト・エディタの初期化(OK)
//--------------------------------------
#deffunc ObjectEditInit\
local n
;全体情報
nMarginX =16
nMarginY =16
dotGridX =8
dotGridY =8
newSizeX =200
newSizeY =28
allEnable =0
scriptSw =SCRIPT_MAIN|SCRIPT_DIALOG|SCRIPT_BUTTON
;ドラッグ情報
DragSw =0
DragNo =-1
DragCx =0
DragCy =0
DragEx =0
DragEy =0
;オブジェクト情報
objType =""
objID =0
objCursX =0
objCursY =0
objSizeX =0
objSizeY =0
objFontX =7
objFontY =14
objText =""
objName =""
objLabel =""
;オブジェクト種類
n=0:msgType(n)=""
n++:msgType(n)="mes(左)"
n++:msgType(n)="mes(中)"
n++:msgType(n)="mes(右)"
n++:msgType(n)="button"
n++:msgType(n)="chkbox"
n++:msgType(n)="listbox"
n++:msgType(n)="combox"
n++:msgType(n)="mesbox"
n++:msgType(n)="input"
return
//--------------------------------------
// オブジェクト・エディタの作成(OK)
//--------------------------------------
#defcfunc CreateObjectWindow int _sx_,int _sy_,\
local cx,\
local cy,\
local sx,\
local sy,\
local rc
dim rc,4
#ifdef CCOPT_MAXIMIZE
SystemParametersInfo SPI_GETWORKAREA,0,varptr(rc),0
cx=rc(0)
cy=rc(1)
sx=rc(2)-rc(0)
sy=rc(3)-rc(1)
screen WID_EDITOR,ginfo_dispX,ginfo_dispY,(SCREEN_NORMAL|SCREEN_HIDE)
GetWindowLong hWnd,GWL_STYLE
SetWindowLong hWnd,GWL_STYLE,(stat|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX)
SetWindowPos hWnd,NULL,cx,cy,sx,sy,(SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_FRAMECHANGED)
#else
screen WID_EDITOR,ginfo_dispX,ginfo_dispY,(SCREEN_NORMAL|SCREEN_HIDE)
GetWindowLong hWnd,GWL_STYLE
SetWindowLong hWnd,GWL_STYLE,(stat|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX)
SetWindowPos hWnd,NULL,0,0,0,0,(SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_FRAMECHANGED)
sx=(ginfo_sizeX-ginfo_winX)+_sx_
sy=(ginfo_sizeY-ginfo_winY)+_sy_
cx=(ginfo_dispX-sx)/2
cy=(ginfo_dispY-sy)/2
SetWindowPos hWnd,NULL,cx,cy,sx,sy,(SWP_NOZORDER|SWP_NOOWNERZORDER)
#endif
sxEditor=ginfo_winX
syEditor=ginfo_winY
title MSG_CAPTION
font "HG明朝E",14
;割り込み設定
onexit gosub *OnQuit
oncmd gosub *OnTimer, WM_TIMER
oncmd gosub *OnMouseMove, WM_MOUSEMOVE
oncmd gosub *OnLButtonUp, WM_LBUTTONUP
oncmd gosub *OnLButtonDown, WM_LBUTTONDOWN
oncmd gosub *OnContextMenu, WM_CONTEXTMENU
;タイマー設定
SetTimer hWnd,TID_REDRAW,TMS_REDRAW,NULL
return hWnd
//--------------------------------------
// スクリプト画面の作成(OK)
//--------------------------------------
#defcfunc CreateScriptWindow int _sx_,int _sy_,\
local cx,\
local cy,\
local po
dim po,2
#ifdef CCOPT_MAXIMIZE
screen WID_SCRIPT,_sx_,_sy_,(SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL|SCREEN_HIDE)
ClientToScreen hWndEditor,varptr(po)
cx=po(0)+sxEditor-ginfo_sizeX
cy=po(1)
SetWindowPos hWnd,NULL,cx,cy,0,0,(SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER)
#else
gsel WID_EDITOR
cx=ginfo_wx2
cy=ginfo_wy1
screen WID_SCRIPT,_sx_,_sy_,(SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL|SCREEN_HIDE),cx,cy
#endif
title "スクリプト画面"
syscolor 15:boxf
mesbox strScript,_sx_,_sy_,5
return hWnd
//--------------------------------------
// コントロール画面の作成(OK)
//--------------------------------------
#defcfunc CreateOptionWindow int _sx_,int _sy_,\
local cx,\
local cy,\
local po
dim po,2
#ifdef CCOPT_MAXIMIZE
screen WID_OPTION,_sx_,_sy_,(SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL|SCREEN_HIDE)
ClientToScreen hWndEditor,varptr(po)
cx=po(0)+sxEditor-ginfo_sizeX
cy=po(1)+syEditor-ginfo_sizeY
SetWindowPos hWnd,NULL,cx,cy,0,0,(SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER)
#else
gsel WID_SCRIPT
cx=ginfo_wx1
cy=ginfo_wy2
screen WID_OPTION,_sx_,_sy_,(SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL|SCREEN_HIDE),cx,cy
#endif
syscolor 15:boxf
color $00,$00,$00
title "コントロール画面"
font "HG明朝E",14
;オブジェクトの配置
objmode 2,1
pos 8, 11:mes "ウインドウのマージン"
pos 8, 31:mes "ウインドウのグリッド"
pos 8, 51:mes "オブジェクトのサイズ"
pos 8, 91:mes "オブジェクトの種類"
pos 8,111:mes "オブジェクトのID"
pos 8,131:mes "オブジェクトの位置"
pos 8,151:mes "オブジェクトのサイズ"
pos 8,171:mes "オブジェクトのデータ"
pos 8,191:mes "オブジェクトの変数名"
pos 8,211:mes "オブジェクトのラベル"
pos 156, 8:objsize 48,18:input nMarginX
pos 206, 8:objsize 48,18:input nMarginY
pos 156, 28:objsize 48,18:input dotGridX
pos 206, 28:objsize 48,18:input dotGridY
pos 156, 48:objsize 48,18:input newSizeX
pos 206, 48:objsize 48,18:input newSizeY
pos 156, 88:objsize 98,18:input objType
pos 156,108:objsize 48,18:input objID
pos 156,128:objsize 48,18:input objCursX
pos 206,128:objsize 48,18:input objCursY
pos 156,148:objsize 48,18:input objSizeX
pos 206,148:objsize 48,18:input objSizeY
pos 156,168:objsize 98,18:input objText
pos 156,188:objsize 98,18:input objName
pos 156,208:objsize 98,18:input objLabel
pos 8,233:objsize 82,30:button gosub "有効化", *PushEnable
pos 90,233:objsize 82,30:button gosub "削除", *PushDelete
pos 172,233:objsize 82,30:button gosub "更新", *PushChange
ObjDragProperty
return hWnd
//--------------------------------------
// コントロール画面の作成(OK)
//--------------------------------------
#defcfunc CreateOptionWindow2 int _sx_,int _sy_,\
local cx,\
local cy,\
local po
dim po,2
#ifdef CCOPT_MAXIMIZE
screen WID_OPTION,_sx_,_sy_,(SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL|SCREEN_HIDE)
ClientToScreen hWndEditor,varptr(po)
cx=po(0)+sxEditor-ginfo_sizeX
cy=po(1)+syEditor-ginfo_sizeY
SetWindowPos hWnd,NULL,cx,cy,0,0,(SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER)
#else
gsel WID_SCRIPT
cx=ginfo_wx1
cy=ginfo_wy2
screen WID_OPTION,_sx_,_sy_,(SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL|SCREEN_HIDE),cx,cy
#endif
syscolor 15:boxf
color $00,$00,$00
title "コントロール画面"
objsize(16*3),16,20
objmode 2,1
;文字
font "HG明朝E",14
pos 8,8+(20-16)/2
mes "ウインドウのマージン"
mes "ウインドウのグリッド"
mes "オブジェクトのサイズ"
mes ""
mes "オブジェクトの種類"
mes "オブジェクトのID"
mes "オブジェクトの位置"
mes "オブジェクトのサイズ"
mes "オブジェクトのデータ"
mes "オブジェクトの変数名"
mes "オブジェクトのラベル"
;横軸
font "HG明朝E",12
pos(16*10+8)+(4*1),8
input nMarginX
input dotGridX
input newSizeX
mes ""
input objType,(16*6+4)
input objID
input objCursX
input objSizeX
input objText,(16*6+4)
input objName,(16*6+4)
input objLabel,(16*6+4)
;縦軸
pos(16*13+8)+(4*2),8
input nMarginY
input dotGridY
input newSizeY
mes ""
mes ""
mes ""
input objCursY
input objSizeY
;ボタン
font "HG明朝E",14
objsize 128,30
pos(128*0+ 8),(20*11+8):button gosub "有効化", *PushEnable
pos(128*1+16),(20*11+8):button gosub "プロパティの更新", *PushChange
ObjDragProperty
return hWnd
//--------------------------------------
// [有効化/無効化]ボタンの処理(OK)
//--------------------------------------
*PushEnable
gsel WID_EDITOR
allEnable^=1
foreach objData
ObjDataSetEnable objData(cnt),allEnable
loop
gsel WID_OPTION
if(allEnable):objprm BID_ENABLE,"無効化":else:objprm BID_ENABLE,"有効化"
return
//--------------------------------------
// [削除]ボタンの処理
//--------------------------------------
*PushDelete
dialog "[削除]ボタンの処理",0,"確認"
return
//--------------------------------------
// [プロパティの更新]ボタンの処理(OK)
//--------------------------------------
*PushChange
if(DragNo>=0){
ObjDataSetSource objData(DragNo),objCursX,objCursY,objSizeX,objSizeY,objText,objName,objLabel
}
return
//--------------------------------------
// タイトルバーのメニューを作成(OK)
//--------------------------------------
#defcfunc CreateTitleMenu\
local menu,\
local id
CreatePopupMenu:menu=stat
id++:AppendMenu menu,MF_STRING,id,"スクリプトの表示(&S)..."
id++:AppendMenu menu,MF_STRING,id,"スクリプトのコピー(&C)"
id++:AppendMenu menu,MF_STRING,id,"スクリプトの貼り付け(&P)"
:AppendMenu menu,MF_SEPARATOR,0,""
id++:AppendMenu menu,MF_STRING,id,"コントロール画面の表示(&O)..."
id++:AppendMenu menu,MF_STRING,id,"バージョン情報(&V)..."
id++:AppendMenu menu,MF_STRING,id,"ヘルプ(&H)"
:AppendMenu menu,MF_SEPARATOR,0,""
id++:AppendMenu menu,MF_STRING,id,"hspObjectEdit のフォルダ(&W)"
id++:AppendMenu menu,MF_STRING,id,"hspObjectEdit の起動(&R)"
id++:AppendMenu menu,MF_STRING,id,"hspObjectEdit の終了(&X)"
return menu
//--------------------------------------
// オブジェクトのメニューを作成(OK)
//--------------------------------------
#defcfunc CreateRightMenu\
local menu,\
local id
CreatePopupMenu:menu=stat
id++:AppendMenu menu,MF_STRING,id,"mes(左寄せ)"
id++:AppendMenu menu,MF_STRING,id,"mes(センタリング)"
id++:AppendMenu menu,MF_STRING,id,"mes(右寄せ)"
:AppendMenu menu,MF_SEPARATOR,0,""
id++:AppendMenu menu,MF_STRING,id,"button(プッシュボタン)"
id++:AppendMenu menu,MF_STRING,id,"chkbox(チェックボタン)"
id++:AppendMenu menu,MF_STRING,id,"listbox(リストボックス)"
id++:AppendMenu menu,MF_STRING,id,"combox(コンボボックス)"
id++:AppendMenu menu,MF_STRING,id,"mesbox(メッセージボックス)"
id++:AppendMenu menu,MF_STRING,id,"input(入力ボックス)"
:AppendMenu menu,MF_SEPARATOR,0,""
id=0:AppendMenu menu,MF_STRING,id,"キャンセル"
return menu
//--------------------------------------
// グリッド点の描画(OK)
//--------------------------------------
#deffunc DrawGrid int _cx_,int _cy_,int _dotX_,int _dotY_,\
local cntX,\
local cntY,\
local dotX,\
local dotY
;最小化
if(ginfo_winX==0):return
if(ginfo_winY==0):return
;補正(ゼロ除算対策)
if(_dotX_>=2):dotX=_dotX_:else:dotX=2
if(_dotY_>=2):dotY=_dotY_:else:dotY=2
;描画
color $00,$00,$00
repeat(ginfo_winY-_cy_*2)/dotY+1:cntY=cnt
repeat(ginfo_winX-_cx_*2)/dotX+1:cntX=cnt
pset(dotX*cntX+_cx_),(dotY*cntY+_cy_)
loop
loop
return
//--------------------------------------
// ウインドウ・メッセージの処理(OK)
//--------------------------------------
*OnTimer :TimerMain ginfo_intID,ginfo_sel,wParam,lParam :return 1
*OnMouseMove :ObjDragMove ginfo_intID,ginfo_sel,(lParam & $FFFF),((lParam>>16)& $FFFF):return 1
*OnLButtonUp :ObjDragEnd ginfo_intID,ginfo_sel,(lParam & $FFFF),((lParam>>16)& $FFFF):return 1
*OnLButtonDown :ObjDragStart ginfo_intID,ginfo_sel,(lParam & $FFFF),((lParam>>16)& $FFFF):return 1
*OnContextMenu :ContextMenu ginfo_intID,ginfo_sel:return 1
//--------------------------------------
// ドラッグ移動のプロパティ(OK)
//--------------------------------------
#deffunc ObjDragProperty
gsel WID_OPTION
if(DragNo<0){
objenable EID_OBJTYPE,0
objenable EID_OBJNUMB,0
objenable EID_OBJTEXT,0
objenable EID_OBJNAME,0
objenable EID_OBJLABEL,0
objenable EID_OBJCURSX,0
objenable EID_OBJCURSY,0
objenable EID_OBJSIZEX,0
objenable EID_OBJSIZEY,0
}
else{
ObjDataGetID objData(DragNo):objID=stat
ObjDataGetSource objData(DragNo),objCursX,objCursY,objSizeX,objSizeY,objText,objName,objLabel
objType=msgType(stat)
objenable EID_OBJTYPE,1:objprm EID_OBJTYPE,objType
objenable EID_OBJNUMB,1:objprm EID_OBJNUMB,objID
objenable EID_OBJTEXT,1:objprm EID_OBJTEXT,objText
objenable EID_OBJNAME,1:objprm EID_OBJNAME,objName
objenable EID_OBJLABEL,1:objprm EID_OBJLABEL,objLabel
objenable EID_OBJCURSX,1:objprm EID_OBJCURSX,objCursX
objenable EID_OBJCURSY,1:objprm EID_OBJCURSY,objCursY
objenable EID_OBJSIZEX,1:objprm EID_OBJSIZEX,objSizeX
objenable EID_OBJSIZEY,1:objprm EID_OBJSIZEY,objSizeY
}
title strf("コントロール画面(DragNo=%d)",DragNo)
return
//--------------------------------------
// ドラッグ移動の開始(OK)
//--------------------------------------
#deffunc ObjDragStart int _intID_,int _selID_,int _x_,int _y_,\
local rc
gsel _intID_
if(DragSw==0)and(allEnable==0){
;クリッピングの設定
dim rc,4
GetClientRect hWnd,varptr(rc)
ClientToScreen hWnd,varptr(rc(0))
ClientToScreen hWnd,varptr(rc(2))
ClipCursor varptr(rc)
;ドラッグ処理の開始
DragSw=1
DragNo=-1
DragCx=_x_
DragCy=_y_
DragEx=_x_
DragEy=_y_
foreach objData
if ObjDataCheck(objData(cnt),_x_,_y_):DragNo=cnt
loop
;オブジェクトのプロパティ
ObjDragProperty
}
gsel _selID_
return
//--------------------------------------
// ドラッグ移動の処理(OK)
//--------------------------------------
#deffunc ObjDragMove int _intID_,int _selID_,int _x_,int _y_,\
local sx,\
local sy
gsel _intID_
if(DragSw==0){
title strf("%s(%d×%d)",MSG_CAPTION,ginfo_winX,ginfo_winY)
}
else:if(DragNo<0){
DragEx=_x_:sx=abs(DragCx-DragEx)
DragEy=_y_:sy=abs(DragCy-DragEy)
title strf("背景のドラッグ中(%d×%d)",sx,sy)
}
else{
ObjDataMove objData(DragNo),_x_,_y_
title strf("DragNo=%d",DragNo)
}
gsel _selID_
return
//--------------------------------------
// ドラッグ移動の終了(OK)
//--------------------------------------
#deffunc ObjDragEnd int _intID_,int _selID_,int _x_,int _y_
gsel _intID_
if(DragSw){
title strf("%s(%d×%d)",MSG_CAPTION,ginfo_winX,ginfo_winY)
if(DragNo>=0):ObjDataAdjust objData(DragNo),nMarginX,nMarginY,dotGridX,dotGridY
ObjDragProperty
DragSw=0
DragEx=_x_
DragEy=_y_
ClipCursor NULL
}
gsel _selID_
return
//--------------------------------------
// タイマー割り込みの処理(OK)
//--------------------------------------
#deffunc TimerMain int _intID_,int _selID_,int _id_,int _tick_
gsel _intID_
if(_id_==TID_REDRAW):TimerDraw
gsel _selID_
return
//--------------------------------------
// オブジェクトの描画(OK)
//--------------------------------------
#deffunc TimerDraw
redraw 0
syscolor 15:boxf
DrawGrid nMarginX,nMarginY,dotGridX,dotGridY
if(DragNo<0){
color $FF,$00,$00
line DragEx,DragCy,DragCx,DragCy
line DragEx,DragEy
line DragCx,DragEy
line DragCx,DragCy
}
else{
foreach objData
ObjDataDraw objData(cnt)
loop
}
redraw 1
return
//--------------------------------------
// 右メニューの分岐処理(OK)
//--------------------------------------
#deffunc ContextMenu int _intID_,int _selID_,\
local cx,\
local cy,\
local po
gsel _intID_
po(0)=((lParam>> 0)& $FFFF)
po(1)=((lParam>>16)& $FFFF)
ScreenToClient hWnd,varptr(po)
cx=po(0)
cy=po(1)
;メニューの表示
if(0<=cx)and(cx<=ginfo_winX)and(0<=cy)and(cy<=ginfo_winY){
PopupRightMenu(ginfo_mx+1),(ginfo_my+1)
}
else{
PopupTitleMenu(ginfo_mx+1),(ginfo_my+1)
}
gsel _selID_
return
//--------------------------------------
// オブジェクトのメニューを表示(OK)
//--------------------------------------
#deffunc PopupRightMenu int _x_,int _y_,\
local type,\
local po
dim po,2
TrackPopupMenu hRightMenu,TPM_LEFTTOPALIGN,_x_,_y_,0,hWnd,NULL:type=stat
if(stat==RECT_NULL):return
GetCursorPos varptr(po)
ScreenToClient hWnd,varptr(po)
;オブジェクトの生成
po(0)-=(newSizeX/2)
po(1)-=(newSizeY/2)
newmod objData,objDataClass,type,po(0),po(1),newSizeX,newSizeY
;オブジェクトのプロパティ
DragNo=-1
foreach objData
if ObjDataCheck(objData(cnt),po(0),po(1)):DragNo=cnt
loop
ObjDragProperty
return
//--------------------------------------
// タイトルバーのメニューを表示(OK)
//--------------------------------------
#deffunc PopupTitleMenu int _x_,int _y_
TrackPopupMenu hTitleMenu,TPM_LEFTTOPALIGN,_x_,_y_,0,hWnd,NULL
if(stat==MENU_NULL):return
switch stat
case MENU_SCRIPTVIEW: ScriptView :swbreak
case MENU_SCRIPTCOPY: ScriptCopy :swbreak
case MENU_SCRIPTPASTE: ScriptPaste :swbreak
case MENU_OPTION: MenuOption :swbreak
case MENU_ABOUT: MenuAbout :swbreak
case MENU_HELP: MenuHelp :swbreak
case MENU_FOLDER: MenuFolder :swbreak
case MENU_BOOT: MenuBoot :swbreak
case MENU_QUIT: MenuQuit :swbreak
swend
return
//--------------------------------------
// メイン・ソースの出力(OK)
//--------------------------------------
#deffunc ScriptMakeMain\
local n,\
local s
strScript+=strf("//--------------------------------------\n")
strScript+=strf("// メイン部\n")
strScript+=strf("//--------------------------------------\n")
strScript+=strf("*Init\n")
foreach objData
ObjDataGetParam objData(cnt),n,s
if(stat==RECT_CHKBOX)or(stat==RECT_LISTBOX)or(stat==RECT_COMBOX){
strScript+=strf("\tdim\t\t%s\n",s(1))
continue
}
if(stat==RECT_MESBOX)or(stat==RECT_INPUT){
strScript+=strf("\tsdim\t%s\n",s(1))
continue
}
loop
strScript+=strf("*Main\n")
strScript+=strf("\t%s=%s(%s)\n",SourceHandle,SourceCreate,SourceWindowID)
strScript+=strf("\tgsel %s,1\n",SourceWindowID)
strScript+=strf("stop\n")
return
//--------------------------------------
// ダイアログ・ソースの出力(OK)
//--------------------------------------
#deffunc ScriptMakeDialog
strScript+=strf("//--------------------------------------\n")
strScript+=strf("// %sの作成\n",SourceCaption)
strScript+=strf("//--------------------------------------\n")
strScript+=strf("#defcfunc %s int _id_,\\\n",SourceCreate)
strScript+=strf("\tlocal cx,\\\n")
strScript+=strf("\tlocal cy,\\\n")
strScript+=strf("\tlocal sx,\\\n")
strScript+=strf("\tlocal sy\n")
strScript+=strf("\t\n")
strScript+=strf("\tsx=(%d)\n",ginfo_winX)
strScript+=strf("\tsy=(%d)\n",ginfo_winY)
strScript+=strf("\tcx=(ginfo_dispX-sx)/2\n")
strScript+=strf("\tcy=(ginfo_dispY-sy)/2\n")
strScript+=strf("\tscreen _id_,sx,sy,(SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_HIDE),cx,cy\n")
strScript+=strf("\tsyscolor 15:boxf\n")
strScript+=strf("\tcolor $00,$00,$00\n")
strScript+=strf("\ttitle \"%s\"\n",SourceCaption)
strScript+=strf("\tfont \"%s\",%d\n",SourceFontName,SourceFontSize)
strScript+=strf("\t;オブジェクトの配置\n")
ScriptMakeObject
strScript+=strf("\t;割り込み設定\n")
strScript+=strf("\t\n")
strScript+=strf("\treturn hWnd\n")
return
//--------------------------------------
// プッシュボタン・ソースの出力(OK)
//--------------------------------------
#deffunc ScriptMakeButton\
local n,\
local s,\
local msg
foreach objData
ObjDataGetParam objData(cnt),n,s
if(stat==RECT_BUTTON){
ObjDataGetText objData(cnt),msg
strScript+=strf("//--------------------------------------\n")
strScript+=strf("// [%s]ボタンの処理\n",msg)
strScript+=strf("//--------------------------------------\n")
strScript+=strf("*%s\n",s(2))
strScript+=strf("\tdialog \"[%s]ボタンの処理\",0,\"確認\"\n",msg)
strScript+=strf("\treturn\n")
}
loop
return
//--------------------------------------
// オブジェクト・ソースの出力(OK)
//--------------------------------------
#deffunc ScriptMakeObject\
local fx,\
local fy,\
local cx,\
local cy,\
local sx,\
local sy,\
local msg,\
local name,\
local label
foreach objData
; ObjDataGetFont objData(cnt),fx,fy
fx=objFontX
fy=objFontY
ObjDataGetSource objData(cnt),cx,cy,sx,sy,msg,name,label
if(stat==RECT_NULL):continue
if(stat==RECT_LTEXT){
cy+=(sy-fy)/2
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("mes \"%s\"\n",msg)
continue
}
if(stat==RECT_CTEXT){
fx=(fy*strlen(msg)/2)
cx+=(sx-fx)/2
cy+=(sy-fy)/2
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("mes \"%s\"\n",msg)
continue
}
if(stat==RECT_RTEXT){
fx=(fy*strlen(msg)/2)
cx+=(sx-fx)
cy+=(sy-fy)/2
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("mes \"%s\"\n",msg)
continue
}
if(stat==RECT_BUTTON){
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("objsize %3d,%3d:",sx,sy)
strScript+=strf("button gosub \"%s\",*%s\n",msg,label)
continue
}
if(stat==RECT_CHKBOX){
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("objsize %3d,%3d:",sx,sy)
strScript+=strf("chkbox \"%s\",%s\n",msg,name)
continue
}
if(stat==RECT_LISTBOX){
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("objsize %3d,%3d:",sx,sy)
strScript+=strf("listbox %s,%d,\"%s\"\n",name,0,msg)
continue
}
if(stat==RECT_COMBOX){
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("objsize %3d,%3d:",sx,sy)
strScript+=strf("combox %s,%d,\"%s\"\n",name,100,msg)
continue
}
if(stat==RECT_MESBOX){
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("objsize %3d,%3d:",sx,sy)
strScript+=strf("mesbox %s,,,5,0\n",name)
continue
}
if(stat==RECT_INPUT){
strScript+=strf("\tpos %3d,%3d:",cx,cy)
strScript+=strf("objsize %3d,%3d:",sx,sy)
strScript+=strf("input %s,,,0\n",name)
continue
}
loop
return
//--------------------------------------
// スクリプトの表示(OK)
//--------------------------------------
#deffunc ScriptView
sdim strScript
gsel WID_EDITOR,1
if(scriptSw & SCRIPT_MAIN) :ScriptMakeMain
if(scriptSw & SCRIPT_DIALOG) :ScriptMakeDialog
if(scriptSw & SCRIPT_BUTTON) :ScriptMakeButton
if(scriptSw & SCRIPT_OBJECT) :ScriptMakeObject
gsel WID_SCRIPT,1
objprm 0,strScript
return
//--------------------------------------
// スクリプトのコピー
//--------------------------------------
#deffunc ScriptCopy
dialog "MENU_SCRIPTCOPY",0,"確認"
return
//--------------------------------------
// スクリプトの貼り付け
//--------------------------------------
#deffunc ScriptPaste
dialog "MENU_SCRIPTPASTE",0,"確認"
return
//--------------------------------------
// コントロール画面の表示
//--------------------------------------
#deffunc MenuOption
gsel WID_OPTION,1
return
//--------------------------------------
// バージョン情報の表示
//--------------------------------------
#deffunc MenuAbout
dialog "MENU_ABOUT",0,"確認"
return
//--------------------------------------
// ヘルプファイルの表示
//--------------------------------------
#deffunc MenuHelp
dialog "MENU_HELP",0,"確認"
return
//--------------------------------------
//「hspObjectEdit」のフォルダ
//--------------------------------------
#deffunc MenuFolder
dialog "MENU_FOLDER",0,"確認"
return
//--------------------------------------
//「hspObjectEdit」の再起動
//--------------------------------------
#deffunc MenuBoot
dialog "MENU_BOOT",0,"確認"
return
//--------------------------------------
//「hspObjectEdit」の終了
//--------------------------------------
#deffunc MenuQuit
dialog "MENU_QUIT",0,"確認"
return
//--------------------------------------
// メッセージの処理(OK)
//--------------------------------------
*OnQuit
if(ginfo_act==WID_EDITOR){
gsel WID_EDITOR
KillTimer hWnd,TID_REDRAW
end
}
gsel ginfo_act,-1
return
//------------------------------------------------------------------------------
// End of hspObjectEdit.hsp
//------------------------------------------------------------------------------
まだ未完成ですが一応使えたりします。
グリッドのあるメイン・ウインドウで右クリックでメニューを出して選択します。
あとはオブジェクトをドラッグ移動で位置を決めますね。
コントロール画面で位置・サイズを入力して「更新」ボタンで反映させる使い方です。
さらに「有効化」ボタンでオブジェクトを使えるようにします。
「削除」ボタンは未実装でオブジェクトの削除機能を今後つける予定です。
MIZUSHIKIさんの右ドラッグでサイズ変更はいいアイディアですね。
私のスクリプトにSHIFTを押しながら左ドラッグしたらリサイズできるように改良すると操作性が上がると思いました。
(まだ未実装ですが…)
あとメイン・ウインドウのタイトルバーで右メニューを出して
「スクリプトの表示」を選択することでスクリプト画面にHSPソースが出てきます。
ここは改良の余地がありますが、現在ひな形ソースを吐き出してます。
上記の「HSP専用オブジェクト・エディタ」ソースを改良するなり、自由に参考にしてください。
この質問は、一通り「HSP Visual Designer」を使えると考えて解決とします。
なお、「HSP専用オブジェクト・エディタ」ソースの改良話などは
引き続き書き込んで欲しいと思います。
(本格的にやり取りするようになれば別スレッドを立てますが…)
| |
|
2015/4/26(Sun) 16:54:59|NO.68796
追記。
現在、新しい「HSP専用ダイアログ作成ツール」を作成中です。
完成したら紹介します。
そこで、この手のツールで良いアイディアがありましたら書き込んでみて下さい。
参考にしながら完成させる予定です。
|
|