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
前にそういう機能を組み込んだことがあります。
Datulaというメーラのプラグインで、HeaderCheckという、メールヘッダの内容によりパネルを表示するというもので、マウスが重なると消すというものでした。
そのときも苦労した気がします。
今はソースが消えてしまい、確認はできませんが、たしか、TTimerを使ったと思います。
CM_MOUSEENTERで消すときに、ウィンドウの位置・サイズを記憶し、TTimerをEnabledにします。
TTimerのOnTimerイベントで、現在のマウス位置が、保存したウィンドウの位置・サイズの中にあればそのまま。外にあれば、ウィンドウを再表示させ、TTimerはDisabledにします。
単純なサンプルですが、こんな感じでどうでしょう?
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 です。
masayan さんのコードをちょっと変えて実行してみました。おもしろいですね。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Visible then ARect := BoundsRect;
Visible := not PtInRect(ARect,Mouse.CursorPos);
end;
皆様ありがとうございます。
今回の質問は、自分にはムリかな?と思っていましたが
サンプルまで頂けるとは嬉しいかぎりです。
ダメ元でサンプルを元に練ってみたいと思います。
結果は追ってご報告致します。
報告の結果です。
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
この辺りも今回初めてみたものです。
今回は大変勉強になりました。
タスクバーが消えるのは割合しまして、このままで行きます。
有難うございました。
ツイート | ![]() |