[BlueLeaf1336]> PROBLEMS> JunkCrusher>

バシバシ消せる画像ビューア JunkCrusher > たたき台

historyTOP

2008/03/10:作成

downloadTOP

最新版 20080310_1_JunkCrusher_src.zip(351,340bytes)

注意:最新版はかなり怪しいです。で、次の機能を付け加えながら気づいたところを修正するわけですが、新しい機能の不具合も一緒に付け加えるわけで。なので、ダウンロードできるファイルはすべて怪しいです。

はじめにTOP

これまでずーっと画像ビューアに、IrfanView を使ってきました。今でも最新版を追いかけています。自分の必要な範囲ではほぼ無敵です。速いし。見たこともない形式にも対応してるし。

ただ、たった一つ気に入らない点があります。今見ている画像があって、その画像が入っているフォルダがいらないときってありますか? あります。しかし IrfanView は表示中の画像が入っているフォルダを「つかむ」らしくて消させてくれません。おまけにもうその画像を見ていないときでも「つかみ」っぱなしのときさえあります。

別に消さないならいいんです。でも消したいんです。

このプログラムの想定する環境TOP

それはこんな感じです。

そういうことです。いつものことながら探せばいくらでもありそうですけど。

利用したものTOP

画像を表示するのはいいんですが、アプリケーション以外に DLL などはできるだけ使いたくないなぁと。で、Windows の 2000 か XP から利用できる GDI+ をかつてやってみようと思ったんですが...あっちゅうまにくじけました。その代わりに、Delphi で使えるようにいい感じにしてくれてる unit を見つけました。

ここ(だったと思うんですが)からダウンロードできる gdiplus.zip(1,170,664bytes/サイズは当時のもの) を展開してできるいくつかのファイルのうち、

を、プロジェクトフォルダに置いて、くちゃくちゃとやると、.png や .gif など Delphi 標準では表示の面倒な画像をパチャッと表示できるようになります。

参考までに、こんな感じです。いったんメモリ上に書き込んでから PaintBox に書き出していますが、流れは簡単です。TGPgraphics と Canvas を関連付け。TGPImage と ファイル を関連付け。TGPgraphics に TGPImage を DrawImage する。以上の3ステップです。

少し躓いたのは、毎回 Create/Free をやらないとだめみたい、という点です。少なくとも TGPgraphics だけでも生成/破棄の回数を減らしたくなるのが人情ですが、だめみたいです。

uses
    GDIPOBJ, GDIPAPI;

//-----------------------------------------------------------------------------
//  画像描画
procedure TForm2.PaintBoxPaint(Sender: TObject);
var
    LFileName: String;
    LBox: TPaintBox;
    LGPImage: TGPImage;
    LGraphics: TGPGraphics;
    LHeight: Integer;
    LWidth: Integer;
begin
    LFileName := Self.Caption;

    LBox := TPaintBox(Sender);
    //  背景クリア
    FBitmap.Canvas.FillRect(LBox.ClientRect);
    //  ファイルの存在チェック
    if (FileExists(LFileName)) then
    begin
        //  GDI+ クラスに読み込ませる
        LGraphics := TGPgraphics.Create(FBitmap.Canvas.Handle);
        LGPImage := TGPImage.Create(LFileName);
        //  画像ファイルなら
        if (LGPImage.GetType = ImageTypeBitmap) then
        begin
            //  画像高さ
            LHeight := LGPImage.GetHeight;
            //  画像幅
            LWidth := LGPImage.GetWidth;
            //  原寸
            LGraphics.DrawImage(LGPImage, 0, 0, LWidth, LHeight);
        end;
        LGPImage.Free();
        LGraphics.Free();
    end;
    //  画面に転送
    BitBlt(LBox.Canvas.Handle, 0, 0, LBox.Width, LBox.Height,
            FBitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;

スクリーンショットTOP

起動したところです。左・中・右のうっとうしい三分割画面です。
タイトルバー:今いるフォルダです。
左:そのフォルダのサブフォルダの一覧です。
中:サブフォルダ一覧で選択されているフォルダの中に入っているファイル一覧です。
右:ファイル一覧で選択されているファイルが画像なら描画します。全体が入るように縮小します。

フォルダ一覧で、適当なフォルダまで移動して「Enter」キーで中に入れます(面倒だったので、マウスのダブルクリックとかでは入れません)。
このとき「+」マークの付いているフォルダはサブフォルダがあることを表現しているんですが、サブフォルダがあるフォルダだけに入れます。右にファイルの一覧を表示しているので、サブフォルダがないフォルダには入る必要がないんです。
逆に、一階層フォルダをあがる場合は「BkSpace」です。

矢印キーの左右でフォルダ一覧とファイル一覧を行き来できます。もしファイル一覧で選択しているファイルが画像なら、一番右に表示します。

で、まあここまではレベルゼロのビューアです。それでも「Enter」と「BkSpace」と「矢印キー」だけで移動できるので結構快適な気がします。自分で気に入るように作ってるんでそりゃそうですが。

さて、フォルダ一覧にフォーカスがある状態で(一覧が青いとき)、「Delete」キーを押すと...

そのフォルダをゴミ箱に移せます。消してしまうのは後悔が激しいのでやめました。それからサブフォルダをひとつでも含んでいるフォルダは消せません。怖いので。

それから、ファイル一覧にフォーカスがある状態で、「Delete」キーを押すと...

そのファイルをゴミ箱に移せます。

唯一の難点は、右側に表示するときに収まるように縮小していることです。ここにスクロールしてでも原寸表示するか悩んだんですが...やめました。制御が面倒なので。

使っている最中のことを考えると

ってやりたいんですが、TScrollBox ってどうやって使うのかよくわからないのでやめました。

でも、今のところ単品じゃない画像ファイルは、IrfanView を使わずにこのプログラムを使っていてそんなにいやじゃないので、もう何回かは更新しそうです。

MediaSkipper のところでも書いたんですが、やっぱり動画や画像のビューアには、捨てやすさを助ける機能も必要だと思います。あとやるとしたら仕分けか。

EOFTOP