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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0706
アイルー画像のサムネイル表示について16解決


アイルー

リンク

2010/7/6(Tue) 11:15:37|NO.33550

こんにちは。

HSP3で画像ビューアを作成しています。
その中の一機能として、サムネイル表示されたものを作りたいと思っています。

画像サイズは大きめのBMPとなり、画像ごとにサイズが異なります。
元画像を縮小する部分については完成しています。

やりたいことが、フォルダ内の画像をすべて読み込み、縮小させたサムネイルを表示し、サムネイルクリック(難しいようであればボタンでも可)で画像を表示させるといった感じです。
できれば画像を縦にずっと並べるのではなく、画面内に縦横と並んで表示できるようにしたいのですが。

画像の量が多く、ページ遷移機能をつけると難しそうなので、イメージ的にはリストボックスの中に画像を表示させるといった感じで考えています。
しかしながら、リストボックスは文字のみということで、使用不可でした。

また、イメージリストについては同一サイズの画像が必要ということで、まだ成功していません。(縮小した画像のサイズを合わせれば、可能なのでしょうか。)

自分でもいろいろなサンプルを見て試してはおりますが、いまだにうまくいかず…

どうかご助力の程お願い致します。



この記事に返信する


いかろ

リンク

2010/7/6(Tue) 17:45:45|NO.33554

縦横比を維持したままサイズを合わせるのなら、長い辺のほうを縮小後の一辺の長さに縮小して
、短い方も同じ比率で縮小、縮小して大きさが足りない部分は余白で埋めればいいかと。



KA

リンク

2010/7/6(Tue) 21:34:32|NO.33560

ぱっと考えただけですが・・・

○ボタンに画像を貼り付けて、適当に並べる。
○縮小画像をまとめた画面と、その座標からファイルを開く。

効率は悪そうですが・・・



あまま

リンク

2010/7/6(Tue) 21:52:49|NO.33561

かなり適当ですがこんな感じでしょうか?

同じフォルダ内のBMP画像で勝手にサムネイルを作ります。
スクロールバーなどは無いので、
5〜6枚程度しか表示できません。


onclick goto *picture_print sdim file, 64 sdim filelist, 64; // フォルダ内のBMPファイルリスト作成 dirlist filelist, "*.bmp", 0; notesel filelist; // ファイル数を調べる filenum = noteinfo( 0 ); // サムネイル表示位置 lpx = 15; lpy = 15; // サムネイルサイズ size = 64; // サムネイル表示間隔 dst = 10; screen 0, 640, 480, 0; bsy = lpy * 2 + filenum * ( size + dst ) - dst bsx = size + lpx * 2; buffer 1, bsx, bsy, 0; buffer 2, , , 0; repeat filenum gsel 2; noteget file, cnt; picload file; sx = ginfo_sx; sy = ginfo_sy; slpy = lpy + ( size + dst ) * cnt; gsel 1; color 128, 128, 128; boxf lpx - 1, slpy - 1, lpx + size, slpy + size; color 255, 255, 255; boxf lpx, slpy, lpx + size - 1, slpy + size - 1; if( sx > sy ) { ssy = size * sy / sx; pos lpx, slpy + ( size - ssy ) / 2; gzoom size, ssy, 2, 0, 0, sx, sy; } else { ssx = size * sx / sy; pos lpx + ( size - ssx ) / 2, slpy; gzoom ssx, size, 2, 0, 0, sx, sy; } loop gsel 0; pos 0, 0; gcopy 1, 0, 0, bsx, bsy; stop; *picture_print if( 0 < mousex && mousex < bsx && 0 < mousey && mousey < bsy ) { ppx = ( mousex - lpx ) / size; ppy = ( mousey - lpy ) / ( size + dst ); if( ppx != 0 || ppy < 0 || ppy >= filenum ) { stop; } else { slpy = lpy + ( size + dst ) * ppy; if( lpx <= mousex && mousex <= (lpx + size) && slpy <= mousey && mousey <= (slpy + size) ) { gsel 2; noteget file, ppy; picload file; sx = ginfo_sx; sy = ginfo_sy; gsel 0; color 255, 255, 255; boxf bsx, 0, 640, 480; pos bsx, 0; gcopy 2, 0, 0, sx, sy; } } } stop;



アイルー

リンク

2010/7/7(Wed) 02:15:00|NO.33565

>> いかろ様
ご回答ありがとうございます。

>縦横比を維持したままサイズを合わせるのなら、長い辺のほうを縮小後の一辺の長さに縮小して
>、短い方も同じ比率で縮小、縮小して大きさが足りない部分は余白で埋めればいいかと。

画像を全て同じ大きさに縮小(+余白で埋める)し、イメージリストで作成するということでしょうか。


>> KA様
ご回答ありがとうございます。

>○ボタンに画像を貼り付けて、適当に並べる。
>○縮小画像をまとめた画面と、その座標からファイルを開く。

実はボタンに画像を貼りつけるというのは、やってみたんです。
やってはみたのですが、どうしてもloopで複数作成することができなくて…
HSP始めたばかりで、お恥ずかしいソースですが、一応載せてみます。
また仕様的に、ボタンに画像を貼りつけるというのよりは、サムネイルの画像から表示させるという流れになりました。


#include "llmod3\\llmod3.hsp" #include "llmod3\\misc.hsp" #include "hspcv.as" #include "obj.as" // メモリノートパッド用の変数を作成 notesel bufBmpData // バイナリデータとして画像を読み込む noteload "image\\00001.bmp" // バイナリデータより画像サイズを取得(それぞれ4バイト取得) imgSizeX = lpeek(bufBmpData, $12) // x(横)サイズ imgSizeY = lpeek(bufBmpData, $16) // y(縦)サイズ // 画面:x(横)サイズ windowSizeX = 160 // 画面:y(縦)サイズ windowSizeY = 120 // 画像と画面のx(横)の比率 ratioX = double(windowSizeX) / imgSizeX // 画像と画面のy(縦)の比率 ratioY = double(windowSizeY) / imgSizeY buffer 2 picload "image\\00001.bmp" gsel 0 // アスペクト比を固定で、画像をリサイズ if ratioX > ratioY { gzoom ratioY * imgSizeX, windowSizeY, 2, 0, 0, imgSizeX, imgSizeY } else { gzoom windowSizeX, ratioX * imgSizeY, 2, 0, 0, imgSizeX, imgSizeY } // ボタンサイズ objsize 160, 120 button "", *label : id = stat btnimg id, 0, 0, 0, windowSizeX, windowSizeY *label stop


>> あまま様
ご回答ありがとうございます。

>同じフォルダ内のBMP画像で勝手にサムネイルを作ります。
>スクロールバーなどは無いので、
>5〜6枚程度しか表示できません。

サンプルスクリプトを作成していただきまして、ありがとうございます!
実際に動かしてみました。
少しソースのほうを変えさせていただいて動かしてみたのですが、自分のイメージに一番近いものでした。

問題はこれをどう、一つのウィンドウの中に収めるか…ですよね。

本当にメッセージボックスのような中身に入れられたら楽なのですが…
スクロールバーも試してみたのですが、なかなかうまくいきません。



あまま

リンク

2010/7/7(Wed) 14:58:10|NO.33569

アイルーさんがイメージしている完成形を
できるだけ詳しく教えていただけないでしょうか

↑でやったようにサムネイルを常に表示しつつ、
実寸画像も表示するのか
もしくは、サムネイルを画面いっぱいに表示し、
選択すると画面全体を使って選択した画像を表示するのか

大きい画像とありますが、どの程度の大きさなのか


> スクロールバーも試してみたのですが、なかなかうまくいきません。
スクロールバーをどのように追加しようとして
どううまくいかなかったのか、などなど


こういった詳しい説明があると皆さんも協力しやすくなると思います。



アイルー

リンク

2010/7/7(Wed) 15:34:28|NO.33571

あまま 様

ご返信ありがとうございます。
説明不足で申し訳ありません。


>↑でやったようにサムネイルを常に表示しつつ、
>実寸画像も表示するのか
>もしくは、サムネイルを画面いっぱいに表示し、
>選択すると画面全体を使って選択した画像を表示するのか

やりたいことですが、
サムネイルのサイズを100を考えまして、
画面サイズ(800×600)の中に、横5列ほどで順にサムネイルを
表示していきたいと考えております。
横5列で1行目が表示されたら、次は2行目に表示していくといった感じで、
イメージ的には間隔を空けたタイル状に敷き詰めるといった感じです。

これを1ウィンドウの中で行いたいと考えております。

サムネイル画像をクリックすると、
別ウィンドウで800×600のサイズに縮小された
(縦横比は修正されて縮小されています)
画像が表示されるような感じです。
実寸サイズの画像は表示しません。

あまま様が書いてくださった
サムネイル画像クリックで別ウィンドウ表示でも、
サムネイル画像に対応したボタンをつけて、
ボタンクリックで別ウィンドウ表示でも、
どちらでもよいと考えています。
(理解不足のため、出来る限り簡単なソースで作れたらと考えております。)


>大きい画像とありますが、どの程度の大きさなのか

縦横の比率もまちまちですが、
大体横1200〜1400、縦800〜900のサイズのBMP画像です。


>スクロールバーをどのように追加しようとして
>どううまくいかなかったのか、などなど

別の方が作られたスクリプトになりますが、
参考にさせていただきながら作ってみたものになります。

参考ページ
http://hp.vector.co.jp/authors/VA043120/hpi_exhspobj.htm

こちらの
hpi_exhspobj.hpi
hpi_exhspobj.hsp
を使用し、


#include "hpi_exhspobj.hsp" randomize dim pos_wb, 2, 17 bgscr cnt + 1, 800, 600, 2, , , 800, 500 c = cnt / 8 \ 2 * 128 font msgothic, 24 pos 0, 0 : mes strf( "内容を表示 %2d", cnt + 1 ) wndbar pos_wb(0, cnt +1), pos_wb(1, cnt + 1) screen 0, 800, 600 pos cnt \ 4 * 320, cnt / 4 * 240 : bgsobj cnt + 1

といった感じで、スクロールバーを動かしてみました。

「内容を表示」が表示されている部分に、
サムネイルを入れられればと思ったのですが、
スクロールバーの構造を理解しきれていないため、うまくできませんでした。
文字は入れられるのですが、picloadで読み込んだ画像(1枚のみです)を
表示させることもできませんでした。


>こういった詳しい説明があると皆さんも協力しやすくなると思います。

そうですね。
自分で完成したソースを上げられない以上、
もっと細かくお伝えしなければいけませんでした。

情報が足りなければ、またご説明させていただきますので、
何卒よろしくお願い致します。



あまま

リンク

2010/7/7(Wed) 17:46:32|NO.33575

詳細説明ありがとうございます。

スクロールバーはサムネイル選択のときだけで
そして垂直バーだけのようですのですね。

スクロールバーのプラグインが難しかったのならば、
こちらのページのやり方はどうでしょうか
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200511/05110003.txt

APIを使った方法ですが
基本的には ScrollBar と記述するだけでスクロールバーが追加されます。

screen 0, 800, 1000, 0 ScrollBar width 800, 600

これで垂直スクロールバーが追加でき、
画像などほぼ通常通りに表示できます。



アイルー

リンク

2010/7/7(Wed) 23:03:40|NO.33579

あまま様

ご返答ありがとうございます。
ご記載いただいたURL先のスクロールバーについては、
実は過去に試してみてました。

その時のソースを記載致します。
モジュール部分もそのまま記載されているので、
長くなってしまいますが、ご容赦ください。


// 2005/12/14修正済み (Ver0.96) #module "scrlbar" //----------------------- #uselib "user32" #func GetWindowLongA "GetWindowLongA" int,int #func SetWindowLongA "SetWindowLongA" int,int,int #func ShowScrollBar "ShowScrollBar" int,int,int #func SetScrollInfo "SetScrollInfo" int,int,var,int #func SetScrollPos "SetScrollPos" int,int,int,int #func SetWindowPos "SetWindowPos" int,int,int,int,int,int,int //----------------------- // 水平 垂直スクロールバーを使えるようにする #deffunc ScrollBar oncmd gosub *WMSIZE, 5 oncmd gosub *SCROLL, $114 oncmd gosub *SCROLL, $115 si= 28, 31, 0,0,0,0,0 // SCROLLINFO構造体 wx.ginfo_sel= ginfo_sizex+ginfo_sx-ginfo_winx wy.ginfo_sel= ginfo_sizey+ginfo_sy-ginfo_winy ; WS_VSCROLL|WS_HSCROLL|WS_SIZEBOX GetWindowLongA hwnd,-16 : SetWindowLongA hwnd,-16,stat|$340000 SetWindowPos hWnd, 0, 0, 0, 0, 0, $37 ; screen 0, bgscr用 return 1 *WMSIZE //ウィンドウサイズが変更された時の処理 sel=ginfo_sel: gsel ginfo_intid repeat 2 si.3= ginfo(26+cnt), ginfo(12+cnt), ginfo(8+cnt) SetScrollInfo hWnd, cnt, si, 1 loop groll ginfo_vx, ginfo_vy mref bm,67 : bm.20=ginfo_winx, ginfo_winy hHide= wx.ginfo_intid= ginfo_sizex ;gsel selを確実に実行させるため vHide= wy.ginfo_intid= ginfo_sizey wnd=hwnd : gsel sel ;何故かスクロールバーが描画されない環境があるため if hHide=1: ShowScrollBar wnd, 0, 0:else: SetWindowPos Wnd, 0,0,0,0,0,$37 if vHide=1: ShowScrollBar wnd, 1, 0:else: SetWindowPos Wnd, 0,0,0,0,0,$37 return 1 *SCROLL //スクロールバー操作時の処理 sel=ginfo_sel : gsel ginfo_intid m=iparam=$115 : nPos=ginfo(8+(m=1)) Code= wParam &$ffff repeat 1 if Code= 5 : nPos=wParam>>16&$ffff : break ;TB_THUMBTRACK if Code= 0 : nPos-4 : break ;TB_LINEUP if Code= 1 : nPos+4 : break if Code= 2 : nPos-32: break if Code= 3 : nPos+32 loop SetScrollPos hWnd, m, nPos, 1 if m : groll ginfo_vx, nPos :else: groll nPos, ginfo_vy gsel sel : return 1 #global ;----------------------- //StyleAdd ハンドル,スタイル,追加(0)or削除(1) (+2で 拡張ウィンドウスタイル) #uselib "user32.dll" #func global SetLong "SetWindowLongA" int, int, int #cfunc global GetLong "GetWindowLongA" int, int #define global StyleAdd(%1, %2=0, %3=0)ujw=((%3)&2)*-2-16 :\ SetLong %1, ujw, GetLong(%1, ujw)|(%2)^((%3)&1)*(%2) #define 拡張 2 #define 削除 1 ;----------------------- //ウィンドウ0の画面 onexit gosub *owari screen 0, 800, 600 title "screen 0" picload "image\\00000.bmp" ScrollBar width 800, 600 ; WS_MINIMIZEBOX, を削除(1) (+0 ウィンドウスタイル) StyleAdd hwnd, $20000, 1+0 gsel ginfo_sel, -1 : gsel ginfo_sel, 1 ScrollBar stop *owari if iparam|wparam=0:end wait 20:gsel wparam, -1:return

このような形で、ウィンドウ0の部分に書いてみましたが、
画像の大きさに対するスクロールバーは表示できました。

しかし、このソースの下部、「//ウィンドウ0の画面」の下のウィンドウ0を表示する部分に、
あまま様の作ってくださったサムネイル表示のソースを入れてみようとしますと、
スクロールバーが表示されず、サムネイル表示だけの画面となってしまいます。
(おそらくうまく書けていないのだと思うのですが)

イメージとしては、ウィンドウ1にサムネイル表示させた画像を
スクロールバー付きで並べて、そのウィンドウ1をウィンドウ0の中に表示させる、
といったものが、一番イメージに近いのではないかと思います。

どうしてもメインウィンドウ(上の例ですと、ウィンドウ0がメインウィンドウです)の中に
「前画面に戻る」ボタンを常に表示しておかなければならず、
そのあたりでうまくいかず、悩んでおりました。


こちらの掲示板に来る前に、一通りのページは調べて、試せるものは試してまいりました。
技量が追い付かず、成功していないという部分もあるのですが。

日曜日までに製作しなければならないということもあり、
うまく作れない自分にもどかしさを感じながら、
今回こちらでご相談させていただいております。
いろいろと教えていただきまして、ありがとうございます。



ANTARES

リンク

2010/7/8(Thu) 01:34:08|NO.33585

 こんなんかな〜?
 NO.33561のスクリプトをベースにNO.33579のスクリプトを組み込みました。

#module "scrlbar" <中略> #global #uselib "user32.dll" #func global SetLong "SetWindowLongA" int, int, int #cfunc global GetLong "GetWindowLongA" int, int #define global StyleAdd(%1, %2=0, %3=0)ujw=((%3)&2)*-2-16 :\ SetLong %1, ujw, GetLong(%1, ujw)|(%2)^((%3)&1)*(%2) onexit gosub *owari onclick goto *picture_print sdim file, 64 <中略> ;screen 0, 640, 480, 0; bsy = lpy * 2 + filenum * ( size + dst ) - dst bsx = size + lpx * 2; screen 0, 640, bsy, 0;★ buffer 1, bsx, bsy, 0; buffer 2, , , 0; repeat filenum <中略> gsel 0; pos 0, 0; gcopy 1, 0, 0, bsx, bsy; ScrollBar width 800, 600 ; WS_MINIMIZEBOX, を削除(1) (+0 ウィンドウスタイル) StyleAdd hwnd, $20000, 1+0 gsel ginfo_sel, -1 : gsel ginfo_sel, 1 ScrollBar stop; *picture_print if( 0 < mousex && mousex < bsx && 0 < mousey && mousey < bsy ) { ppx = ( mousex - lpx ) / size; ppy = ( mousey - lpy + ginfo_vy) / ( size + dst ); if( ppx != 0 || ppy < 0 || ppy >= filenum ) { stop; } else { slpy = lpy + ( size + dst ) * ppy; if( lpx <= mousex && mousex <= (lpx + size) && slpy <= mousey+ginfo_vy && mousey+ginfo_vy <= (slpy + size) ) { gsel 2; noteget file, ppy; picload file; sx = ginfo_sx; sy = ginfo_sy; screen 3,800,600;★ gzoom 800,600,2,0,0,sx,sy } } } stop; *owari if iparam|wparam=0:end wait 20:gsel wparam, -1: gsel 0:return ;★



あまま

リンク

2010/7/8(Thu) 02:26:22|NO.33586

詳細説明を踏まえ修正。

モジュールが最新のではなかったようなので差し替えておきました。
また、サイズ固定ウィンドウのようなので
モジュール内の SetWindowLongA hwnd,-16,stat|$340000 を
SetWindowLongA hwnd,-16,stat|$300000 と変更しています。


// 2006/11/6(Ver 0.98β1 右クリックメニュー、ウィンドウ初期化に対応) #module "scrlbar" //----------------------- #uselib "user32" #func global GetWindowLongA "GetWindowLongA" int, int #func global SetWindowLongA "SetWindowLongA" int, int, int #func global ShowScrollBar "ShowScrollBar" int, int, int #func global SetScrollInfo "SetScrollInfo" int, int, var, int #func global SetScrollPos "SetScrollPos" int, int, int, int #func global SetWindowPos "SetWindowPos" int, int, int, int, int, int, int #cfunc global GetParent "GetParent" int #cfunc global GetSystemMetrics "GetSystemMetrics" int #cfunc global WindowFromPoint "WindowFromPoint" int, int #func global ScreenToClient "ScreenToClient" int, var #func global GetWindowRect "GetWindowRect" int, var #cfunc global FindWindowEx "FindWindowExA" int, int, int, int #func global RedrawWindow "RedrawWindow" int, int, int, int //----------------------- #define ctype GetScrollBarSize(%1)GetSystemMetrics(2+%1) // スクロールバーサイズの取得関数: 水平(0)/垂直(1) #deffunc groll2 int x, int y // オブジェクトも移動するgroll命令 dim r, 4 ;(モジュール内ScrollBar命令で使用しています) v= ginfo_vx, ginfo_vy : groll x, y repeat hobj= FindWindowEx(hwnd, hobj, 0, 0) if hobj= 0 : break GetWindowRect hobj, r ; オブジェクトのスクリーン座標取得 ScreenToClient hwnd, r ; クライアント座標に変換 SetWindowPos hobj, 0, r+v-ginfo_vx, r.1+v.1-ginfo_vy, 0, 0, $115 ;RedrawWindow hobj, 0, 0, $401 loop return #deffunc ScrollBar // 水平 垂直スクロールバーを使えるようにする oncmd gosub *WMSIZE, 5 oncmd gosub *SCROLL, $114 oncmd gosub *SCROLL, $115 oncmd gosub *WHEEL, $20A oncmd gosub *WHEEL, $20E si= 28, 31, 0,0,0,0,0 // SCROLLINFO構造体 hscsize= GetScrollBarSize(0) // スクロールバーのサイズを取得 vscsize= GetScrollBarSize(1) dup xx,wx.ginfo_sel : dup yy,wy.ginfo_sel if (wx.ginfo_sel=ginfo_sizex)|(wx.ginfo_sel=0) : hscsize=0 if (wy.ginfo_sel=ginfo_sizey)|(wy.ginfo_sel=0) : vscsize=0 wx.ginfo_sel= ginfo_sizex+ginfo_sx-ginfo_winx-vscsize wy.ginfo_sel= ginfo_sizey+ginfo_sy-ginfo_winy-hscsize ShowScrollBar hwnd, 0, 0 : ShowScrollBar hwnd, 1, 0 GetWindowLongA hwnd,-16 : SetWindowLongA hwnd,-16,stat|$300000 ;( WS_VSCROLL|WS_HSCROLL|WS_SIZEBOX SetWindowPos hWnd, 0, 0, 0, 0, 0, $37 ; screen 0 , bgscr用 ) return *WMSIZE //ウィンドウサイズが変更された時の処理 sel= ginfo_sel: gsel ginfo_intid repeat 2 si.3= ginfo(26+cnt), ginfo(12+cnt), ginfo(8+cnt) SetScrollInfo hwnd, cnt, si, 1 loop groll2 ginfo_vx, ginfo_vy mref bm, 67 : bm.20= ginfo_winx, ginfo_winy hHide= wx.ginfo_intid= ginfo_sizex ; gsel selを確実に実行させるため vHide= wy.ginfo_intid= ginfo_sizey wnd= hwnd : gsel sel ; 何故かスクロールバーが描画されない環境があるため↓ if hHide= 1: ShowScrollBar wnd, 0, 0 :else: SetWindowPos wnd, 0, 0, 0, 0, 0, $37 if vHide= 1: ShowScrollBar wnd, 1, 0 :else: SetWindowPos wnd, 0, 0, 0, 0, 0, $37 return 1 *WHEEL sel= ginfo_sel : gsel ginfo_intid m= iparam= $20A : flag= 0 nPos= ginfo(8+m)-(wparam>>18) : goto *@f ;18で30ドット移動 19で15 *SCROLL //スクロールバー操作時の処理 if flag= 0 {flag= 1 : m= iparam= $115 sel= ginfo_sel : gsel ginfo_intid : nPos= ginfo(8+m) } Code= wParam &$FFFF : if Code= 8 : flag= 0 : gsel sel : return repeat 1 if Code= 5 : nPos= wParam>>16&$FFFF : break ; SB_THUMBTRACK if Code= 0 : nPos- 14 : break ; SB_LINEUP if Code= 1 : nPos+ 14 : break ; SB_LINEDOWN if Code= 2 : nPos-ginfo(12+m) : break ; SB_PAGEUP if Code= 3 : nPos+ginfo(12+m) : break ; SB_PAGEDOWN if Code= 4 : break ; SB_THUMBPOSITION if Code= 6 : nPos= 0 : break ; SB_TOP if Code= 7 : nPos= ginfo(26+m) : break ; SB_BOTTOM loop *@ SetScrollPos hwnd, m, nPos, 1 if m : groll2 ginfo_vx, nPos : :else: groll2 nPos, ginfo_vy if flag= 0 : gsel sel return #global ;----------------------- onexit gosub *owari onclick goto *picture_print sdim file, 64 sdim filelist, 64; dirlist filelist, "*.bmp", 0; // フォルダ内のBMPファイルリスト作成 notesel filelist; filenum = noteinfo( 0 ); // ファイル数を調べる lpx = 50; // サムネイル表示位置 lpy = 50; size = 100; // サムネイルサイズ dst = 50; // サムネイル表示間隔 snw = 5; // サムネイル最大表示列数 snh = ( filenum + snw - 1 ) / 5; // ファイル数から行数を算出 bsy = dst * ( snh + 1 ) + size * snh; // サムネイル領域の高さ(余白含む) bsx = 800; // 幅 // サムネイルウィンドウを初期化 if( bsy < 600 ) { screen 0, bsx, 600, 0; } else { screen 0, bsx, bsy, 0; } title "サムネイル作成中..."; ScrollBar; // スクロールバー付加 width 800, 600; // 表示サイズ設定 // 画像読み込み用バッファ作成 buffer 2, , , 0; // サムネイル作成 scnt = 0; // サムネイルを作った回数を計測 repeat snh slpy = lpy + ( size + dst ) * cnt; // Y座標計算 slpx = lpx; // X座標 repeat snw gsel 2; noteget file, scnt; // ファイル名取得 picload file; sx = ginfo_sx; // 画像サイズ取得 sy = ginfo_sy; gsel 0; // サムネイルの外枠 color 128, 128, 128; boxf slpx - 1, slpy - 1, slpx + size, slpy + size; color 255, 255, 255; boxf slpx, slpy, slpx + size - 1, slpy + size - 1; // 縦横比固定でサムネイル作成 if( sx > sy ) { ssy = size * sy / sx; pos slpx, slpy + ( size - ssy ) / 2; gzoom size, ssy, 2, 0, 0, sx, sy; } else { ssx = size * sx / sy; pos slpx + ( size - ssx ) / 2, slpy; gzoom ssx, size, 2, 0, 0, sx, sy; } slpx += size + dst; // X座標更新 scnt++; if( scnt == filenum ) { // 全ファイルのサムネイルが完成したらループから抜ける break; } loop loop // タイトル変更 title "サムネイルウィンドウ"; stop // クリックしたとき *picture_print if( ginfo_act == 0 ) { // サムネイルウィンドウをクリックした場合 // サムネイル範囲内にマウスがあるか確認 if( lpx < mousex && mousex < (bsx - dst) && lpy < mousey && mousey < (bsy - dst) ) { scl_py = ginfo_vy; // スクロールバーの位置記録 // マウスと重なってる可能性のあるサムネイルを算出 ppx = ( mousex - lpx ) / ( size + dst ); ppy = ( mousey + scl_py - lpy ) / ( size + dst ); // サムネイル表示位置計算から流用 slpx = lpx + ( size + dst ) * ppx; slpy = lpy + ( size + dst ) * ppy; // 可能性のあるサムネイルの範囲内と重なっているか判定 if( slpx <= mousex && mousex <= (slpx + size) && slpy <= (mousey + scl_py) && (mousey + scl_py) <= (slpy + size) ) { gsel 2; // サムネイルの画像読み込み noteget file, ppy * 5 + ppx; picload file; // 画像サイズ取得 sx = ginfo_sx; sy = ginfo_sy; // 画像表示ウィンドウ初期化 screen 1, 800, 600, 0; title "画像表示ウィンドウ" // 画像表示 pos 0, 0; gzoom 800, 600, 2, 0, 0, sx, sy; gsel 0; // 2回目以降のクリックに反応しないことがあるので描画先をサムネイルウィンドウに戻す } } } stop; *owari if iparam|wparam=0:end wait 20:gsel wparam, -1:return



あまま

リンク

2010/7/8(Thu) 02:29:10|NO.33587

ANTARESさんがすでに修正されていましたね・・・OTL
失礼しました。



アイルー

リンク

2010/7/8(Thu) 14:15:20|NO.33589

ANTARES 様


サンプルの作成ありがとうございます。

画像の読み込み部分のアドレスを変更し、実際に動作させていただきました。
自分の書いたソースだと、bufferやgselの指定もうまくいっていなかったんですね。

スクロールバーの表示にあたり、とてもシンプルに書いてくださったので、
わかりやすかったです。

縦に一列に表示するときなど、応用が効きそうですね。
画像に限らず、今後別の画面の作成時など、応用を利かせて使っていきたいと思います。

今回作成していただきました表示の座標計算などは、HSPに限らず、
別の言語でも利用できるものだと思います。
今後のことも考え、時間の余裕のあるときにしっかりとソースを追い、
知識として取り入れたいと思います。

とても勉強になりました。
ありがとうございました。



アイルー

リンク

2010/7/8(Thu) 14:26:58|NO.33590

あまま 様

ご返信ありがとうございます。
そしてサンプルスクリプトの作成もありがとうございます。

画像読み込み部分を修正し、実際に動作させてみたのですが、
自分の作りたいもののイメージにとても近かったです。

また、NO.33561で作成してくださったときにも、
変数をmesで表示させながら、途中動作を止めたりして、
なんとかソースの流れを追おうと努力はしていたのですが、
自分の知識では計算の部分で追い切れず、
何をやっているのか理解できないところがありました。

今回NO.33586のソースで詳細説明を入れてくださったおかげで、
どのようなときにどのような計算が必要なのかが
少しずつわかってきました。
(まだまだ一から作り上げるには勉強不足ですが…)

また、モジュールも最新ではなかったのですね。。
差し替えありがとうございます。


一点ご質問させていただいてもよろしいでしょうか。

219行目あたりの
gsel 0;
で、
// 2回目以降のクリックに反応しないことがあるので描画先をサムネイルウィンドウに戻す
とあるのですが、実際にサムネイルをクリックして描画先を表示させますと、
2〜3回目あたりで表示されなくなってしまいます。

この原因は、画像を保存しているbufferによるものなのでしょうか?

重ね重ね申し訳ありませんが、よろしくお願い致します。



あまま

リンク

2010/7/8(Thu) 16:04:45|NO.33591

> 219行目あたりの
>
> gsel 0;
> で、
>
> // 2回目以降のクリックに反応しないことがあるので描画先をサムネイルウィンドウに戻す
> とあるのですが、実際にサムネイルをクリックして描画先を表示させますと、
> 2〜3回目あたりで表示されなくなってしまいます。
>
> この原因は、画像を保存しているbufferによるものなのでしょうか?

それはもしかすると、画像表示ウィンドウを閉じた場合
それ以後表示しなくなるのではないでしょうか?
だとすると、すみません見落としていました。

最後の
*owari
if iparam|wparam=0:end wait 20:gsel wparam, -1:return
これが、サムネイルウィンドウ(ID0のウィンドウ)を閉じた場合は終了
ほかのウィンドウを閉じたときは、そのウィンドウを非表示にする。
このような意味になっているんですが、
そのときに描画対象が非表示にしたウィンドウになったままになっているので、
クリックしたときのマウス座標が
非表示ウィンドウ内のマウス座標参照
という形になってしまっていました。

なので、
>*owari
if iparam|wparam=0:end wait 20:gsel wparam, -1:gsel 0:return
と修正し、ご質問の箇所と同じく描画対象を
サムネイルウィンドウに戻すことで表示されるようになるはずです。



アイルー

リンク

2010/7/23(Fri) 18:03:42|NO.33861

あまま 様

こんにちは。
ご無沙汰しております。
家の仏事の都合で家に帰ることができず、
質問した状態のままお返事が出来ずに申し訳ありませんでした。
*owari
if iparam|wparam=0:end wait 20:gsel wparam, -1:gsel 0:return
教えていただいた通りにしたら、無事動作させることができました。

画像表示ウィンドウを閉じた後、
gsel 0でサムネイル表示ウィンドウに対象を移すということですよね。

今まで適当にgselを使用している部分がございましたが(gcopyとのセット等で…)、
gselの本来の使い方を覚えることができました。
(すごい基本的なことも知らず、お恥ずかしいのですが…)

今回はサムネイル表示の部分で、様々なことを勉強することができました。

こちらのサムネイル表示機能ですが、そのまま使用することは致しませんが、
表示方法など、一部使用させていただいてもよろしいでしょうか?

今後もまたわからない点などありましたら、
ご質問させていただくかとは思いますが、
出来る限り自分でも解決していけるよう、努力していきたいと思います。

ありがとうございました!



あまま

リンク

2010/7/26(Mon) 13:09:32|NO.33979

申し訳ありません
気づきませんでした。。。

> こちらのサムネイル表示機能ですが、そのまま使用することは致しませんが、
> 表示方法など、一部使用させていただいてもよろしいでしょうか?

著作権がどうのと言えるほどのものではありませんので・・・
ご自由にお使いください。



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