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 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;これでスペースが混ざっても大丈夫です。 それで、次に拡張子との関連付けを行う必要があります。
エクスプローラーの表示>オプションを選択。
そうそう。エクスプローラーで関連付けが変更出来ないケースもあります。
こういう時はファイルマネージャーを使って下さい。
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の詳細については、こちらでどうぞ。
|