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;
うん。難しい(^^;
私はuses節にShellapiを加えるのを忘れていて、なかなか動きませんでした(^^;;
拡張子との連動。
エクスプローラー等で、ファイルをダブルクリックしたら開くようにします。
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以外のファイル形式はこちらで読込ませてみます。
インターネット等で探してみて下さい。例えばこことか。
Delphian World
http://home1.infonia.ne.jp/~delphian/delphi/
フォームの設計。

・・こんな感じで必要なコントロールを貼り付けていきます。
上の方ではファイルの[開く]はコマンドボタンって書いてましたが、
結局メニューに仕様を変更しました(^^;
フォームに入りきらないCGはスクロールさせる必要がある訳で・・
DelphiではフォームのAutoScrollプロパティをTrueにすれば自動スクロールが出来ます。
でもAlkettでは上のようにスクロールバーを配置して自前でこれを行います。
これも結構大変だったりします。等倍だけなら楽ですが、拡大縮小モードもありますし。
座標を内部で頑張って計算します。
Alkett GraphicView

そんなこんなで、作ってみたのがこのAlkettです。
ver0.20から公開してます(この画面がver0.20・・懐かしい^^;)。
今はAlkettMVの中に入っています。
Alkettの詳細については、こちらでどうぞ。
Delphiページへ戻る
|