@@@@@@@关于窗体消息的问题。盼望各位达人予以指点@@@@@@@ ( 积分: 200 )

B

beeful

Unregistered / Unconfirmed
GUEST, unregistred user!
需求:<br> &nbsp; 1.前提: 在Form上面有Panel,Edit,Button,Label很多很多控件。<br> &nbsp; 2.效果: 用鼠标不管单击任何位置,都要能够捕获到这个消息,并且要对当前Form进行<br> &nbsp; &nbsp;BringToFront处理。因为我是多个Form都是创建到主窗体的Panel上面的类似于实现一 <br> &nbsp; 个类似MDI的效果(但不能用MDI)。<br> &nbsp; 3.要求: 别告诉我一个个写Click或者用Application.OnMessage。<br>企盼各位达人指点:
 
B

beeful

Unregistered / Unconfirmed
GUEST, unregistred user!
需求:<br> &nbsp; 1.前提: 在Form上面有Panel,Edit,Button,Label很多很多控件。<br> &nbsp; 2.效果: 用鼠标不管单击任何位置,都要能够捕获到这个消息,并且要对当前Form进行<br> &nbsp; &nbsp;BringToFront处理。因为我是多个Form都是创建到主窗体的Panel上面的类似于实现一 <br> &nbsp; 个类似MDI的效果(但不能用MDI)。<br> &nbsp; 3.要求: 别告诉我一个个写Click或者用Application.OnMessage。<br>企盼各位达人指点:
 
I

iamy

Unregistered / Unconfirmed
GUEST, unregistred user!
写一个WndProc<br><br>然后用遍历窗体里的足见<br>SetWindowLong(.......
 
A

app2001

Unregistered / Unconfirmed
GUEST, unregistred user!
看不大懂你的意思??要达到什么效果,窗体里Panel里的窗体要显到最前面???
 
B

beeful

Unregistered / Unconfirmed
GUEST, unregistred user!
To:app2001 谢谢关注 我把我的代码贴出来<br>我有一个主窗体,上面有一个 Panel。还有若干的 子窗体 <br>子窗体的创建代码如下<br>procedure ShowFormAsChild(var AForm:TForm; AFormClass:TClass;<br> &nbsp;AParent:TWinControl; AlignClient:Boolean = False);<br>var<br> &nbsp;acW, acH:Integer;<br> &nbsp;i:Integer;<br>begin<br> &nbsp;if not Assigned(AForm) then<br> &nbsp; &nbsp;Application.CreateForm(TComponentClass(AFormClass), AForm);<br> &nbsp;AForm.Parent := AParent;<br> &nbsp;AForm.Left := 0;<br> &nbsp;AForm.Top := 0;<br> &nbsp;if AlignClient then<br> &nbsp; &nbsp;AForm.Align := alClient;<br> &nbsp;acW := AForm.ClientWidth;<br> &nbsp;acH := AForm.ClientHeight;<br><br> &nbsp;SetWindowLong(AForm.Handle,<br> &nbsp; &nbsp;GWL_STYLE,<br> &nbsp; &nbsp;GetWindowLong(AForm.Handle, GWL_STYLE)<br> &nbsp; &nbsp;and<br> &nbsp; &nbsp;(not WS_CAPTION));<br><br> &nbsp;AForm.Width := acW;<br> &nbsp;AForm.Height := acH;<br> &nbsp;AForm.BringToFront;<br> &nbsp;AForm.Show;<br>end;<br><br>-------<br>在 主窗体中的调用 :<br> &nbsp;//创建 Form2到主窗体的 PanelMain<br> &nbsp;ShowFormAsChild(TForm(Form2), TForm2, panelMain);<br> //创建 Form3到主窗体的 panelMain<br> &nbsp;ShowFormAsChild(TForm(Form3), TForm3, panelMain);<br>这个时候 就形成了一个好似 MDI样子的 窗体,<br>但是 点在 某个 子Form上的时候我需要把 该 Form调到最前面来 <br>因为 子Form上面含有许多的控件。 不可能一个个去覆盖 WndProc<br>所以想请教各位有什么办法能实现点击 任何子Form就把它调到前面来。
 
Y

yostgxf

Unregistered / Unconfirmed
GUEST, unregistred user!
能否考虑用CM_MOUSEENTER消息来代替。鼠标进入哪个窗体就把哪个窗体显示在前面。这样上面再多的控件就不会影响了
 
B

beeful

Unregistered / Unconfirmed
GUEST, unregistred user!
TO:yostgxf,<br>CM_MOUSEENTER的确是可以的。但是这似乎有点不符合操作习惯阿。<br>不过还是谢谢你的建议。 我今天试验了一下钩子,由于我对windows API 认识浅薄 。<br>在钩子函数里面无法得到确定当前窗口的句柄。所以还是一筹莫展。往各位同行先进给我指点。。。。。。。。。。。
 
C

chenybin

Unregistered / Unconfirmed
GUEST, unregistred user!
看了很久,居然没看懂 ,<br>AForm.Align := alClient;<br>SetWindowLong(AForm.Handle,<br> &nbsp; &nbsp;GWL_STYLE,<br> &nbsp; &nbsp;GetWindowLong(AForm.Handle, GWL_STYLE)<br> &nbsp; &nbsp;and<br> &nbsp; &nbsp;(not WS_CAPTION));<br>这两个设置了以后这个Form就会填满整个Panel,而且没有标题,所以其他的在Panel上面,其他的Form是没有机会被点到的,但是为什么楼主说可以呢
 

寻路

Unregistered / Unconfirmed
GUEST, unregistred user!
不知道你为什么要这样做:<br>1、为什么不用DOCKING功能,我想你现在要实现的功能用DOCKING会更好。<br>2、为什么TApplicaion.OnMessage不行,很实际的,也觉得很好用,或者Screen.ActiveForm也不错啊。<br>如在 TApplicaion.OnMessage 中, if Screen.ActiveForm is TYourForm then ...<br>或者我没有看懂你要干什么!
 
B

beeful

Unregistered / Unconfirmed
GUEST, unregistred user!
TO:chenybin,谢谢您提醒我<br>惭愧,我这段代码面把创建的窗体平铺了整个Panel,因为我自己试验的代码里面加入了还原窗体大小的代码。<br>改成<br> &nbsp; &nbsp;AForm.Align := alNone;<br> &nbsp; &nbsp;AForm.WindowState := wsNormal;<br>就可以了<br>TO:寻路感谢您的回复。<br>我不是要实现DOCK的功能,其实我是想模仿MDI的效果。正好碰到这个问题。所以上来求救。<br>以前我还不知道有Screen.ActiveForm 这个属性。<br>我用ApplicationEvents试验了一下。<br>顺便问您一个问题。如果我获取到一个对象的Handle是不是能够找到该对象的所在Form
 
K

kk2000

Unregistered / Unconfirmed
GUEST, unregistred user!
如果我获取到一个对象的Handle是不是能够找到该对象的所在Form如果我获取到一个对象的Handle是不是能够找到该对象的所在Form<br> 使用 FindControl(Handle); 可以解决你上面的问题!<br><br>真的有看不明白你的意思! <br>你是想切换界面吗? 比如说 Form2 到Form3, Form3 到Form2, 等.....<br>这样的话考虑使用<br>SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);<br>就不用再使用FindControl(Handle); &nbsp;去查找了! 只要知道句柄就完事了.<br>可能也是傻说了一通! 不太了解楼主意思
 
B

beeful

Unregistered / Unconfirmed
GUEST, unregistred user!
TO :kk2000 暂时解决了这个问题了,感谢您提供的一个建议,虽然您没有看懂我要做什么。说实话这个效果也不是我自己愿意搞那么麻烦。公司领导建议要写一个类似MDI的窗体模型。但是又不能用MDI,所以我只有出此下策了,背景一个主窗体,然后创建出来的子窗体的Parent全部指定为主窗体的Panel.但是那样的话。就会有诸多限制。比如B窗体创建后把A窗体遮住了,用户点A窗体的时候A窗体不能到前面来。还有拖动。最小化,最大化。关闭。。。。。。。都要自己实现。本来我以为在Application.OnMessage里面会很复杂,但是经过楼上几位点拨之后。我茅塞顿开。刚刚写了一段测试代码。可以实现效果,代码如下:<br>procedure TForm1.ApplicationEvents1Message(var Msg:tagMSG;<br> &nbsp;var Handled:Boolean);<br>var<br> &nbsp;lControl:TWinControl;<br>begin<br> &nbsp;lControl := nil;<br> &nbsp;lControl := FindControl(Msg.hwnd);<br> &nbsp;if (Msg.hwnd &lt;&gt; 0)<br> &nbsp; &nbsp;and (Msg.message = WM_LBUTTONDOWN)<br> &nbsp; &nbsp;and (lControl &lt;&gt; nil) then<br> &nbsp;begin<br> &nbsp; &nbsp;if lControl is TForm then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;(lControl as TForm).BringToFront;<br> &nbsp; &nbsp;end<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;lControl := TWinControl(lControl.Owner);<br> &nbsp; &nbsp; &nbsp;(lControl as TForm).BringToFront;<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br>end;
 
C

chenybin

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,印证了软件工程里面的一句经典的话,<br><br>当你为了一个问题苦思冥想了几天的时候,如果有人从你身边走过,不管他是谁,一定要拉住他[:D][:D]
 
S

sbzldlb

Unregistered / Unconfirmed
GUEST, unregistred user!
当你在创建另外一个窗体的时候,你可以判断panel上面有没有窗体,如果有的话,就关闭,没有的话,那创建<br>这样可以避免一个窗体回覆盖另外一个
 
B

beeful

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
888
DelphiTeacher的专栏
D
I
回复
0
查看
554
import
I
I
回复
0
查看
509
import
I
顶部