千千静听那样的 主窗体 始终在两个 子窗体 下面怎么做? ( 积分: 100 )

  • 主题发起人 主题发起人 lanmanck
  • 开始时间 开始时间
L

lanmanck

Unregistered / Unconfirmed
GUEST, unregistred user!
不知道大家用过千千静听没有。
她的主窗体 始终在两个 子窗体 下面,2个子窗体可以像普通窗体一样,点谁谁就在最前,而且别的程序窗口还能把他们覆盖掉;
我试了很久没出来,像setwindowpos,showwindow之类、拦截WM_SETFOCUS之类的消息都没搞出来,可能是思路不对吧,
如果setfocus用setwindowpos(TOPMOST),然后在kissfocus用NOTOPMOST,那么窗口会闪烁!
大家帮忙啊
 
直接用Form.Show不就是这样咯
 
那个只是窗口的磁化效果
 
我不要磁化,在一个exe里我只要一个窗体始终在另一个窗体之上,但是不影响别的exe应用程序!
 
当然showmodel之类的就不要回答了:)
附图:
111.gif
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2;

type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
protected
//获取本进程内除了自己以外屏幕上最下层的窗口句柄
Function GetBottomForm():HWND;
//处理WM_WINDOWPOSCHANGING消息
procedure WMWindowPosChanging(var Message: TWMWindowPosChanging);
message WM_WINDOWPOSCHANGING;
public

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }


procedure TForm1.FormShow(Sender: TObject);
begin
//创建几个别的窗口.
TForm2.Create(Self).Show();
TForm2.Create(Self).Show();
TForm2.Create(Self).Show();
TForm2.Create(Self).Show();
end;

//获取本进程内除了自己以外屏幕上最下层的窗口句柄
function TForm1.GetBottomForm: HWND;
var
I : Integer;
begin
Result := 0;
for I := 0 to Screen.FormCount - 1 do
if (Screen.Forms <> Self) then
Result := Screen.Forms.Handle;
end;

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
if Self.Visible then
Message.WindowPos^.hwndInsertAfter := GetBottomForm();
inherited;
end;

end.
 
form。show是可以达到这个效果!绝对可以覆盖,这是非模态调用
 
呵呵,.show确实可以,
wr960204兄的程序运行以后会把自己放到别的程序下面,而且不能让本进程的跑到上面;不过还是感谢
 
还有个问题,我是在C++builder 2007实现的,你们在delphi哪个版本实现的?因为用delphi6.0实现不出来,为什么啊?是不是有什么设置?
另外,我想让下面窗体(主)move的时候,上面窗体跟着move,发现如下现象:
拦截WM_MOVE消息,如果拦截下面窗体的消息,然后处理上面窗体,就会出错,例如:
void __fastcall TForm1::HandleMOVE( TMessage&amp; msg)
{
if(msg.Msg==WM_MOVE)
{
Form2->Top=Top+10;
Form2->Left=Left+10;
}
}
但是反过来拦截上面的去处理下面的就不会出错,这是怎么回事?
 
大富翁也有啊,子窗体的OnCreate里面添加
SetWindowPos(Handle,HWND_TOPMOST ,Left,Top,Width,Height,SWP_DRAWFRAME);
然后show出来就行了。标题栏要自己做,这样就完全一样了。
最后一个参数随便加的,还有SWP_NOMOVE , SWP_NOSIZE ... 自己需要用吧
 
楼上那样是不行的,不能让本进程的窗体置于别的进程窗体上面,所以你setwindowpos以后还要在killfocus后再次setwindowpos(notopmost)
 
我搞定了,哈哈,用moving就可以了,谢谢大家支持
 
后退
顶部