HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0420
科学太郎使いやすいオブジェクト・エディタを紹介して欲しい5解決


科学太郎

リンク

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

こちらは使いにくかったです。
これ以外でオブジェクトの配置を簡単にできるソフトを紹介して欲しいです。
よろしくお願いします。



この記事に返信する


MIZUSHIKI

リンク

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年に再挑戦して、また諦めて、
今、とりあえずイメージだけ伝えられるように放流して他の人に丸投げ。という状態。



MIZUSHIKI

リンク

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専用ダイアログ作成ツール」を作成中です。
完成したら紹介します。

そこで、この手のツールで良いアイディアがありましたら書き込んでみて下さい。
参考にしながら完成させる予定です。



ONION software Copyright 1997-2023(c) All rights reserved.