CGビュワーを作ってみる

CGビュワーを作ってみよう

ふと思い付いて、CGビュワーなるものを作って見ようと思い立ちました。 いろいろ仕様が欲しかったので、自分で作ってみます。
タイトルバーにファイル名と画像サイズが出れば便利だし。 RGB値も簡単に見れれば嬉しい。後はちょこちょこと機能追加のつもりです。

このツール、Alkett GraphicView と名前を付けてみました。通称、Alkett。


まずはBMPとJPGの読込みです。
まぁ、これはDelphi側でサポートしてますから大丈夫です。
これを「開く」機能。 それと拡張子との関連付け。 エクスプローラー等からのドラッグ&ドロップ。 クリップボードからのコピー。及びクリップボードへの貼り付け。

ファイルを開く

まず普通にファイルを開く処理を入れてみます。 開くボタンがあって、それを押したらダイアログが開いてファイル選択です。

DelphiのOpenDialogコンポーネントでも使いましょう。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    FileName := OpenDialog1.FileName;
    //これでFileNameに処理したいファイル名が来ます。
    //後はプログラム側で、画像のロードと表示を行います。
    //・・省略・・
  end;
end;
後はオブジェクトインスペクタで、 OpenDialog1のFilterプロパティの拡張子設定をしておけば良いです。

エクスプローラー等からのドラッグ&ドロップ

CGビュワーにファイルをドラッグドロップ出来るようにします。 CGビュワーを開いておいて、 ファイルをマウスでずりずり持ってきて落とすとCGが開く、と言うものです。
やってみれば結構難しかったりします。
まず、uses節にShellapiを加えて・・っと。
procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle,True);
end;
・・これでフォームがドラッグドロップを受取れるようになります。

WM_DROPFILESメッセージを処理します。フォームのPrivate 宣言にでも、
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
を置いて、TForm1.WMDropFilesで処理する訳です。

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  iFile: array[0..MAX_PATH] of Char;
begin
  try
    if DragQueryFile( Msg.Drop, 0, iFile, MAX_PATH ) > 0 then
    begin
      FileName := iFile;
      //これでFileNameに処理したいファイル名が来ます。
      //後はプログラム側で、画像のロードと表示を行います。
      //・・省略・・
      Msg.Result := 0
    end;
  finally
    DragFinish(Msg.Drop)
  end;
end;

拡張子との連動

エクスプローラー等で、ファイルをダブルクリックしたら開くようにします。

TForm1.FormCreateで、ParamCountをチェックします。 ParamCountにはコマンド行に渡されたパラメータの数が入ります。 1以上で何か来たよって事。

  If ParamCount > 0 then
  begin
    FileName := ParamStr(1);
    //これでFileNameに処理したいファイル名が来ます。
    //後はプログラム側で、画像のロードと表示を行います。
    //・・省略・・
  end;
普通のファイルだったら、これでOKです。 ParamStr(1)には処理したいファイルのフルパスが入ります。

でも、パスにスペースがあったらそこで区切られて、フルパスになりません。 ですからParamStrを結合します。上のプログラムを書き換えてみます。

var
  i: Integer;
  iTempFile: String;
・
・
・
  If ParamCount > 0 then
  begin
    for i := 1 to ParamCount do
      iTempFile := iTempFile + ' ' + ParamStr(i);
    Delete(iTempFile, 1, 1);
    FileName := iTempFile; 
    //これでFileNameに処理したいファイル名が来ます。
    //後はプログラム側で、画像のロードと表示を行います。
    //・・省略・・
  end;
これでスペースが混ざっても大丈夫です。

それで、次に拡張子との関連付けを行う必要があります。

エクスプローラーの表示>オプションを選択。
ファイルタイプを選んで、変えたい拡張子、 ここではBMPとかJPGを選んで編集します。無ければ追加登録して下さい。

そうそう。エクスプローラーで関連付けが変更出来ないケースもあります。 こういう時はファイルマネージャーを使って下さい。 Windows3.1からのツールですが、Windows95/98にも入ってます。


クリップボード

次はクリップボードからの貼り付け。及びクリップボードへのコピー。 uses節に Clipbrdを追加して下さい。これで扱えるようになります。

  //ビットマップBitmapMainから、クリップボードにコピーする場合・・
  Clipboard.Assign(BitmapMain);

  //クリップボードからコピーする場合・・
  If Clipboard.HasFormat(CF_BITMAP) then
  begin
    BitmapMain.Assign(Clipboard);
  end;

他のファイル形式も読込みたい

BMPやJPGも良いけど他のファイル形式も対応したいですね。 例えばPNGとか、MAGとか・・。
ここではコンポーネントを使ってみます。 コンポーネントとはプログラムの部品です。 BMPやJPG以外のファイル形式はこちらで読込ませてみます。
インターネットで探せばいろいろ見つかります。
フォームの設計

・・こんな感じで必要なコントロールを貼り付けていきます。 上の方ではファイルの[開く]はコマンドボタンって書いてましたが、 結局メニューに仕様を変更しました。

フォームに入りきらないCGはスクロールさせる必要がある訳で・・ DelphiではフォームのAutoScrollプロパティをTrueにすれば自動スクロールが出来ます。

でもAlkettでは上のようにスクロールバーを配置して自前でこれを行います。 これも結構大変だったりします。等倍だけなら楽ですが、拡大縮小モードもありますし。 座標を内部で頑張って計算します。


Alkett GraphicView

そんなこんなで、作ってみたのがこのAlkettです。
ver0.20から公開してます(この画面がver0.20・・懐かしい)
今はAlkettMVの中に入っています。

Alkettの詳細については、こちらでどうぞ。