ウインドウを隠したり表示させたりする方法は?

解決


かなもの  2003-10-16 13:20:29  No: 5230

2度目の質問になります かなもの  と申します

さて、前回の質問の
https://www.petitmonte.com/bbs/answers?question_id=997
は長時間の検証の結果、無事解決した事が分かりました。有難うございました。

さて、今回は全く別のプログラムを作っている件なのですが、
ウインドウを隠したり表示させたりする方法は?というタイトルですが、
内容としては、ずばりこのソフトの隠蔽機能というのを再現したいのです。
http://homepage3.nifty.com/Junnya/soft/mfclock.htm

マウスカーソルを合わせるとウインドウが消え、移動させると表示を戻す・・・というものです。
そのアプリは、親子とかの関係はなく、フォームがForm1しか存在しない単体のものです。

まだ未熟の為、どういう命令を使ったら良いのか?という所から探す事になるのですが、
まったく検討が付きませんでした。

私の現段階の知識では
http://130.158.124.192/~takeuchi/delphi/article/009/009641.html
このサイトの情報と下に、ウインドウの出し入れを認識し、試しにSetWindowPosのSWP_HIDEWINDOWで隠してみた・・・
という所までしか分かりませんでした。当然画面は復帰しません。

恐らく根本の考えそのものが違うような気がしているのですが、
これ以上の情報を集める事が出来ませんでした。

皆様のお知恵をお借りしたいです。
足りない情報がありましたら、追ってご連絡致します。
ご回答よろしくお願い致します。

環境:Windows XP Pro SP1 + Delphi 6 Personal SP2


にしの  2003-10-16 17:32:14  No: 5231

前にそういう機能を組み込んだことがあります。
Datulaというメーラのプラグインで、HeaderCheckという、メールヘッダの内容によりパネルを表示するというもので、マウスが重なると消すというものでした。
そのときも苦労した気がします。
今はソースが消えてしまい、確認はできませんが、たしか、TTimerを使ったと思います。

CM_MOUSEENTERで消すときに、ウィンドウの位置・サイズを記憶し、TTimerをEnabledにします。
TTimerのOnTimerイベントで、現在のマウス位置が、保存したウィンドウの位置・サイズの中にあればそのまま。外にあれば、ウィンドウを再表示させ、TTimerはDisabledにします。


masayan  2003-10-16 22:44:34  No: 5232

単純なサンプルですが、こんな感じでどうでしょう?

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private 宣言 }
    ARect : TRect;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  P : TPoint;
begin
  if Self.Visible then
  begin
    ARect.Top    := Top;
    ARect.Left   := Left;
    ARect.Bottom := Top  + Height;
    ARect.Right  := Left + Width;
  end;

  GetCursorPos(P);
  if     (P.X >= ARect.Left) and (P.X <= ARect.Right)
     and (P.Y >= ARect.Top ) and (P.Y <= ARect.Bottom) then
  begin
    Visible := False;
  end
  else
  begin
    Visible := True;
  end;

end;

Timer1のIntervalは、適当に設定してくださいね。
ただ、このプログラム、フォームの×で終了できません。(笑)


Halbow  2003-10-17 02:14:09  No: 5233

Halbow です。

masayan さんのコードをちょっと変えて実行してみました。おもしろいですね。

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Visible then ARect := BoundsRect;
  Visible := not PtInRect(ARect,Mouse.CursorPos);
end;


かなもの  2003-10-17 06:00:55  No: 5234

皆様ありがとうございます。
今回の質問は、自分にはムリかな?と思っていましたが
サンプルまで頂けるとは嬉しいかぎりです。

ダメ元でサンプルを元に練ってみたいと思います。

結果は追ってご報告致します。


かなもの  2003-10-17 06:56:25  No: 5235

報告の結果です。

Halbowさんの短いものは、masayanのものを単略可したというか、
こういう関数もあるのかと勉強になりました。
まだ理屈だけで、感覚では分かっていない部分はありますが、
これで理想の動作となりました。

procedure TForm1.Timer1Timer(Sender: TObject);
var
  P : TPoint;
begin

        if Visible then
         ARect := BoundsRect;

       if GetKeyState( VK_CONTROL ) >= 0 then
        Visible := not PtInRect(ARect,Mouse.CursorPos);

end;

これでコントロールキーが押しっぱなしの時に画面は隠れずに操作出来るようになりました。

ARect := BoundsRect;
まさかこれで座標が一発で記憶出来るのかぁと・・・そして
Mouse.CursorPos
この辺りも今回初めてみたものです。
今回は大変勉強になりました。

タスクバーが消えるのは割合しまして、このままで行きます。

有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加