|
|
2013/1/14(Mon) 10:46:44|NO.51863
いつもお世話になっております
ドラッグ&ドロップで画像を動かすにはどう書けばできますでしょうか?
やりたい事は
1)HSPでフォルダ内の画像をサムネイルで一覧表示する
■A001.JPG
▲A002.JPG
□A003.JPG
2)D&Dで画像を移動
□A003.JPG
▲A002.JPG
■A001.JPG
3)最後にはその順番でリネームする
※リネームすることはできます。
画像は約10〜15枚ぐらいです
サンプルを探しても見つかりませんでした。
アドバイス、サンプルを教えていただけないでしょうか?
どうぞよろしくお願いいたしますm(_ _)m
|
|
2013/1/14(Mon) 11:07:01|NO.51864
普通にリストボックス作って下に「対象を下に移動」「対象を上に移動」ボタン、
右にプレビューを置くのが一番
サムネイルでエクスプローラーのように移動は出来ないこともないですが、
少し凝ったゲームのシステムを作るより難しいです
自分で作れず他人のソースを流用したいと思うなら上記の方法にしてください
D&Dのところを自分が作るとすれば
・順番等を記録する文字列配列
・配列の指定した範囲を上下に一つシフトさせる自作命令
・サムネイル一覧の表示部分 自動で縮小処理も行う
・サムネイル一覧のマウス当たり判定取得構文 縮小に沿った当たり判定の取得が必要
・ドラッグを検出し挿入する位置の目安として線分を描画、ドロップ時に配列シフト命令を呼び出す所
・サムネイル一覧が長くなる場合、スクロールバーを自作 マウス当たり判定、ドラッグ判定もそれによって変化
・ドラッグ中の画像を半透明表示
を作ります
WinAPIを使う方法もありますがそれは不具合の修正もめんどくさくて結果上の方法よりめんどくさくなります
|
|
2013/1/14(Mon) 19:41:09|NO.51881
@key様
こんばんは、いつもお世話になっております
詳しいアドバイスをどうもありがとうございます
D&D版はやはりいきなりは難しそうなので、
まずはリストボックス版から作ってみたいと思います。
今後ともどうぞよろしくお願いいたしますm(_ _)m
|
|
2013/1/14(Mon) 21:11:31|NO.51883
こんばんは、いつもお世話になっております
@key様のアドバイスのように
まずはサンプルでリストボックスの入れ替えを試しているのですが
入れ替えしたリストボックスの内容を出力するにはどうしたら良いでしょうか?
アドバイスの方どうぞよろしくお願いいたします。
; 項目文字列取得用に確保
sdim listbox_text
pos 50, 50
objsize 150
filelist="1. A001.JPG\n2. A002.JPG\n3. A003.JPG\n4. A004.JPG\n5. A005.JPG"
listbox a, 100, filelist
hListbox = objinfo(stat, 2)
pos 200, 65
button "上へ", *listup
button "下へ", *listdown
button "保存", *save
stop
; 上方向に入れ替え
*listup
; 選択項目のインデックス番号取得 (LB_GETCURSEL)
sendmsg hListbox, $188
if stat = 0 : stop ; 選択項目が先頭だった場合
index = stat
; 選択項目の文字列取得 (LB_GETTEXT)
sendmsg hListbox, $189, index, varptr(listbox_text)
; 選択項目の削除 (LB_DELETESTRING)
sendmsg hListbox, $182, index
; 選択項目の1つ上に取得した文字列を挿入 (LB_INSERTSTRING)
sendmsg hListbox, $181, index - 1, listbox_text
; 項目の選択 (LB_SETCURSEL)
; 第3パラのwparam値にインデックス番号を指定
sendmsg hListbox, $186, index - 1
// objprm 0, index - 1
mes listbox_text
stop
; 下方向に入れ替え
*listdown
sendmsg hListbox, $188
if stat = 4 : stop ; 選択項目が最後部だった場合
index = stat
sendmsg hListbox, $189, index, varptr(listbox_text)
sendmsg hListbox, $182, index
; 選択項目の1つ下に取得した文字列を
sendmsg hListbox, $181, index + 1, listbox_text
sendmsg hListbox, $186, index + 1
// objprm 0, index + 1
mes listbox_text
stop
//保存
*save
// notesel buf
// notesave "hoge.txt"
// mes buf
stop
| |
|
2013/1/14(Mon) 21:31:59|NO.51885
repeat使って
sendmsg hListbox, $189, cnt, varptr(listbox_text)
みたいに順に取得してやればいんじゃない?
|
|
2013/1/14(Mon) 23:03:39|NO.51888
ppr様
アドバイスありがとうございます、あとで試してみます。
暇人様
アドバイスありがとうございます。
下記のようにすると、リストボックスのデータを抜くことができました。
どうもありがとうございました。
//保存
*save
repeat 5
mes "GGGG"+cnt
sendmsg hListbox, $189, cnt, varptr(listbox_text)
mes listbox_text
loop
stop
@key様
アドバイスありがとうございます
D&Dリストボックスのサンプルありがとうございます。
理想の形ですね^^)/早速、改造してみますね。
上記と同じようにlistbox_textデータを抜こうとしても、一行分しか取り出せませんでした。
こちらはどうしたら良いでしょうか?
どうかアドバイスをお願いします。
; Win32API関数
#uselib "user32"
#cfunc RegisterWindowMessage "RegisterWindowMessageA" str
#uselib "comctl32"
#func MakeDragList "MakeDragList" int
#cfunc LBItemFromPt "LBItemFromPt" int, int, int, int
#func DrawInsert "DrawInsert" int, int, int
; マクロ
#define DRAGLISTMSGSTRING "commctrl_draglistmsg"
#define DL_BEGINDRAG $485
#define DL_DRAGGING $486
#define DL_DROPPED $487
#define DL_CANCELDRAG $488
#define DL_CURSORSET 0
#define DL_STOPCURSOR 1
#define DL_COPYCURSOR 2
#define DL_MOVECURSOR 3
; メイン
oncmd gosub, *draglistmsg, RegisterWindowMessage (DRAGLISTMSGSTRING)
; 項目文字列取得用変数
sdim listbox_text
objsize 100
pos 20, 20
listbox a, , "1. ナイル川\n2. アマゾン川\n3. 黄河\n4. セーヌ川\n5. 信濃川"
; ドラッグリストボックス化
MakeDragList objinfo (stat, 2)
pos 200, 65
button "保存", *save
stop
; DRAGLISTMSGSTRING
*draglistmsg
; DRAGLISTINFO構造体
; DRAGLISTINFO.0 = 通知メッセージ
; DRAGLISTINFO.1 = リストボックスのハンドル
; DRAGLISTINFO.2 & .3 = カーソル位置
dupptr DRAGLISTINFO, lparam, 16
; ドラッグ開始時
if DRAGLISTINFO.0 = DL_BEGINDRAG {
; ドラッグする項目インデックス取得
dragindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, )
return 1
}
; ドラッグ中
if DRAGLISTINFO.0 = DL_DRAGGING {
; ドラッグ途中の項目インデックス取得
newindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, 1)
if newindex = -1 : return DL_STOPCURSOR
; ドラッグ目印表示
DrawInsert hwnd, DRAGLISTINFO.1, newindex
return DL_MOVECURSOR
}
; ドロップ後 (ドラッグ終了)
if DRAGLISTINFO.0 = DL_DROPPED {
; 新たな位置となる項目インデックス取得
newindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, )
if newindex != -1 {
; LB_GETTEXT
sendmsg DRAGLISTINFO.1, $189, dragindex, varptr (listbox_text)
; LB_DELETESTRING
sendmsg DRAGLISTINFO.1, $182, dragindex
; LB_INSERTSTRING
sendmsg DRAGLISTINFO.1, $181, newindex, listbox_text
; LB_SETCURSEL
sendmsg DRAGLISTINFO.1, $186, newindex
}
; ドラッグ目印消去
DrawInsert hwnd, DRAGLISTINFO.1, -1
return
}
; ドラッグキャンセル
if DRAGLISTINFO.0 = DL_CANCELDRAG {
; ドラッグ目印消去
DrawInsert hwnd, DRAGLISTINFO.1, -1
return
}
return
*save
repeat 5
sendmsg DRAGLISTINFO, $189, dragindex, varptr (listbox_text)
// sendmsg DRAGLISTINFO.1, $189, dragindex, varptr (listbox_text)にするとエラーになる
mes listbox_text
loop
stop
| |
|
2013/1/15(Tue) 00:31:24|NO.51894
repeat 5
sendmsg objinfo (0, 2), $189, cnt, varptr (listbox_text)
mes listbox_text
loop
objinfo(0, 2)の0は最初に配置したlistboxのID
DRAGLISTINFOは*draglistmsg(割り込み)内で有効
割り込み中なら
sendmsg DRAGLISTINFO.1, $189,cnt, varptr (listbox_text)
でも良い
|
|
2013/1/15(Tue) 09:27:38|NO.51896
こんなのでどうでしょうか
//////////////////////////////////////////////////////////
//
// 左クリック D&D で 移動
// 右クリック D&D で 入れ替え
// キーボードの 方向キーでスクロール
//
//////////////////////////////////////////////////////////
#const THUMBNAIL_SIZE 64 // サムネイルのサイズ
#const NOTRIGGERKEY 256|512|2|8
// イメージデータ構造体の代わり
TotalShowImg=10
repeat TotalShowImg
FileName.cnt=strf("img(%d).bmp",cnt) // ファイル名
Order.cnt = cnt // 表示順序
loop
// 重要変数
Before = -1 // 現在選択されているか否かを兼ねた、選択されている位置
After =0 // 移動先の値が代入される
// サイズ変更を確認するため WindowID 1 以降を使用
screen 1,ginfo_dispx,limit(TotalShowImg*THUMBNAIL_SIZE,ginfo_dispy,0x7FFFFFFF),0,,,640,480
// メインルーチン
font msGothic,32,2
*@
stick key,NOTRIGGERKEY
// アイテムデータ並び替え処理
if((key&256/*左クリック*/)!=0 or (key&512/*右クリック*/)!=0){
// move
if(Before==-1){
// クリックした際に、その下に有る順序番号をロックする。
if((mousey+ginfo_vy)<=(TotalShowImg*THUMBNAIL_SIZE)) {
Before = CalcImgOrder()
kInput = key
}else{
Before=-2 // 表示範囲外をKeyDownした場合 KeyUp 動作を無効化するためのフラグ
}
}
}else{
if(Before>=0){
After = Limit_ShowImageTotal(CalcImgOrder())
if(kInput==256){ // move 処理
stock=Order.Before
memcpy Order.Before,Order.Limit_ShowImageTotal(Before+1),((TotalShowImg-Before-1)*4)
memcpy Order.Limit_ShowImageTotal(After+1),Order.After,((TotalShowImg-After-1)*4)
Order.After = stock
}else:if(kInput==512){ // swap 処理
stock=Order.Before
Order.Before=Order.After
Order.After=stock
}
}
Before=-1
}
// アイテムリストスクロール処理
wl=mousew
if(wl!=0 or (key&0b1010)!=0){
if(wl&0x80000000)!=0 or (key&8)!=0 {
wl=THUMBNAIL_SIZE
}else:if(wl&0x80000000)==0 or (key&2)!=0{
wl=-THUMBNAIL_SIZE
}
groll 0,limit(ginfo_vy+wl*2,0,TotalShowImg*THUMBNAIL_SIZE-ginfo_winy)
}
redraw 0
color 255,255,255:boxf
repeat TotalShowImg
pt = cnt*THUMBNAIL_SIZE
// アイテム背景塗りつぶし
hsvcolor Order(cnt)*20,255,255
boxf 0,pt,ginfo_winx,pt+THUMBNAIL_SIZE
// カーソルを描画
if(Before>=0){
// ロックされたアイテムを強調
ptm = (Before*THUMBNAIL_SIZE)
if(ptm==pt){
hsvcolor i,255,180
DrawFrame 5,0,ptm,ginfo_winx,ptm+THUMBNAIL_SIZE
}
// 移動先を示すカーソルを強調
ptm=Limit_ShowImageTotal(CalcImgOrder())*THUMBNAIL_SIZE
if(ptm==pt){
hsvcolor i,255,255
DrawFrame 2,0,ptm,ginfo_winx,ptm+THUMBNAIL_SIZE
}
i+=20
}
// アイテム情報を描画
pos 0,pt:color:mes FileName(Order.cnt)
// サムネイルを描画するルーチンを挟む
loop
redraw
await 30
goto*@b
// 現在のマウス座標から、順序ID を取得
#defcfunc CalcImgOrder
return ((mousey+ginfo_vy)/THUMBNAIL_SIZE)
// 選択されている色で、枠を描画する。
#deffunc DrawFrame int l_ , int px_ , int py_ , int px2_ , int py2_
repeat l_
line px_,py_+cnt,px2_,py_+cnt
line px2_-cnt,py_,px2_-cnt,py2_
line px2_,py2_-cnt,px_,py2_-cnt
line px_+cnt,py2_,px_+cnt,py_
loop
return
// 表示されているイメージを適切な範囲に丸める。
#defcfunc Limit_ShowImageTotal int val_
return limit(val_,0,TotalShowImg-1)
| |
|
2013/1/15(Tue) 20:55:17|NO.51901
暇人様
アドバイスどうもありがとうございます。
ちゃんと出力できるようになりましたm(_ _)m
いひ様
アドバイスどうもありがとうございます。
また、すばらしいサンプルをありがとうございますm(_ _)m
まだ使ったことのない命令が多くて、戸惑っておりますが勉強したいと思います。
質問ですが、
画像フォルダを指定するのと、並び替えた画像ファイル名を出力するにはどうしたらよいでしょうか?
最終的には並び替えた順番に、001.JPG 002.JPGとリネームしたいと思います。
どうぞよろしくお願いします
|
|
2013/1/15(Tue) 21:14:53|NO.51902
>画像フォルダを指定するのと
ディレクトリ移動
chdir "dirname"
"dirname" : 移動先ディレクトリ名
>並び替えた画像ファイル名を出力するにはどうしたらよいでしょうか?
出力って?
|
|
2013/1/16(Wed) 04:53:17|NO.51908
暇人様
無事できるようになりました。
出力はリネーム用でしたが、そちらもOKでした。
ありがとうございました。
いひ様
いろいろとアドバイスをありがとうございます
ご紹介頂いたHPを見て色々と触ってみます。
今後ともどうぞよろしくお願いいたします。
今後ともどうぞよろしくお願いいたします。
|
|