アプリ起動時にアプリのタイトルのようなJPEGイメージを描画したいと思
っております。
現在はフォーム上にあるTImageにJPEGを読み込ませ描画しているのですが、
当たり前ですが、この方法だとフォームを描画した後イメージを描画してし
まいしっくりきません。なぜならフォームの描画の際、灰色の画面が出てし
まい、それからイメージの描画を行うからです。これを防ぐにはフォームを
描画せずにJPEGイメージを描画する方法しかないと思っています。
何かよい方法はありますでしょうか?
要するにスプラッシュウィンドウを出したいということですよね?!
それであれば、下記のように簡単にできます。
Form1がメインフォームだとして、スプラッシュしたい画像をはりつけた
ウィンドウをForm2としてプロジェクトに追加します。
あとはForm2に次のとおりコーディングします。
Initialization
Form := TForm2.Create(Nil);
Form2.Show;
Form2.Update;
end. //<--end;ではない。
また同じくForm2のディアクティブイベントにもコードを書きます。
Procedure Form2.FormDeactivate(Sender: TObject);
begin
Release;
end;
基本はこれだけです。こうしてInitialization部を記述すれば、
メインフォームのForm1が表示される前にForm2が表示されForm1が
表示されると自動的にForm2が消えます。
あとはスプラッシュウィンドウを決まった時間だけ表示させたければ
タイマーを使うという方法もあります。
説明下手で申し訳ありません。
ご丁寧に返信ありがとうございます。
Formにイメージを貼り付けてしまうと、イメージが描画される前に
Formが描画されますよね、そうすると灰色(これがForm)の枠が
描画され、その次にイメージを描画します。この灰色の枠(というかForm)
を描画させたくないのです。
雰囲気的にはコンソールアプリでJPEGイメージを描画する・・・
と言った方が○な気がしてきました。(最初からそう書けって)
要するにFormを使わずJPEGイメージを描画したいのです。
こんな感じなのですが、どうでしょう・・・。
フォーム一瞬たりとも出したくないというのであれば、ImageコンポーネントのalignをalClient
に設定し、FormのBorderStyleをbsNoneにするだけで
フォームなんかは消すことできると思いますが。
それは試してみました。でもやっぱりダメでした。
で、今はJPEGをリソースに取り込んでメインフォームや
子フォームなどにImageコンポーネントを貼り付けることなく
描画する方法を考えています。
やっぱり描画するときにCanvasか何かで描画しないと描画できない
んですよね?だとすると、イメージを描画する土台(要はフォーム)
が必要になるわけで・・・・。やっぱりフォームを使わないと
描画できないんでしょうか・・・。
(諦めるべきでしょうか???)
ImageコンポーネントのalignをalClient
に設定し、FormのBorderStyleをbsNoneに設定する際ですが、
画像をロードしていますか?それともImageコンポーネントの
Pictureに最初から設定していますか?
Pictureに設定している場合、フォームは見えなくなりましたけど。
>ImageコンポーネントのalignをalClient
A.しています。
>Pictureに最初から設定していますか?
A.はい、JPEGImageを設定しています。
>Pictureに設定している場合、フォームは見えなくなりましたけど。
A.はい、フォームは見えなくなりますが、イメージ画像が描画され
るまでのほんのちょっとの間、灰色の画面が出ませんか?
ちょっとの間、灰色の画面が出てからイメージが出ると思うのですが・・。
出ないでしょうか・・・。この灰色の画面を出したくないんです・・・。
マシン性能が原因ではなのであれば、スプラッシュウィンドウを表示している間に処理しているものが原因でしょう。
遅くならない程度に、Application.ProcessMessages;を実行させてください。
マシン性能が原因であれば、プログラムから解決するのはほぼ不可能です。
画面が乱れてよいのであれば、デスクトップに直接描画する方法があります。
平蔵様、にしの様、ご教授ありがとうございました。
イメージを描画しているフォームの背景を透明にすることにより解決したっぽいです。
procedure TForm1.EraseBG(var Msg:TWMEraseBkgnd);
begin
DefWindowProc(Handle, WM_ICONERASEBKGND, Msg.DC, 0);
Msg.Result := 1;
end;
貴重なお時間を費やしていただき、本当にありがとうございました。
って、解決チェック忘れ・・・^^;
ツイート | ![]() |