レイヤードウインドウを使い文字だけを表示し、他を透過させるプログラムを作成しているのですが、文字以外の部分をマウスでクリックすることが出来なくなります。
そこで、そのウインドウの下にアルファ値1のウインドウを置いてマウスの処理をさせたいと思いました。
Form1の移動をWM_MOVEで検出しForm1をForm2の裏にするように
procedure TForm1.WMMove(var Msg: TWMMove);
begin
// とりあえず、Form2の移動は記述していません
if Assigned(Form2) then
SetWindowPos(Handle, Form2.Handle, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;
と記述し、確かに移動時はForm2の裏に表示されるのですがマウスのボタンを上げるとForm1がForm2の上に表示されてしまいました。
また、WM_WINDOWPOSCHANGINGで下記のようにForm2を前にもってこようとしたのですが、効果がありませんでした。
procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
if Assigned(Form2) then
Msg.WindowPos^.hwndInsertAfter:=Form2.Handle;
end;
常にForm1の手前にForm2を表示する方法はありますでしょうか?
開発環境は、
Windows XP SP2
Delphi6 Personal
です。
参考にしたページ
http://www.sutosoft.com/room/archives/000035.html
Owned Windowを使用すると、Form2を常に特定のウィンドウ
の手前に表示するようにできます。
方法ですがTForm2のCreateParamsをオーバライドして、
Params.WndParentにForm1のハンドルを与えてあげると、
Form2はOwned Windowになります。
かみづさんありがとうございました。
おかげさまで1週間悩んでいたことが解決されました。
感謝感激です^^
ツイート | ![]() |