首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

关于窗体置顶有关问题

2012-12-20 
关于窗体置顶问题如题,我知道用SetWindowPos,HWND_TOPMOST 可以让窗体置顶,但是多个窗体好像不行,比如有两

关于窗体置顶问题
如题,我知道用SetWindowPos,HWND_TOPMOST 可以让窗体置顶,但是多个窗体好像不行,比如有两个窗体Form1和Form2,分别在Form_Load中用SetWindowPos设置顶层,然后开始Form1先显示,再显示Form2, 但是两个窗体可以互相覆盖,就是用鼠标点击其中一个都可以覆盖另外一个,编译后也一样,按道理Form1先置顶,然后Form2再置顶,那么Form1应该不可以覆盖Form2的,我想要实现Form1不能覆盖Form2这样的效果,就像在Form2的Load中Me.Show ,Form1这样的效果,不过有个窗体是我自己CreateWindowEx的,不能用xxx.Show ,OwnerForm,请问还有什么Api可以实现的吗?vb的xxx.Show,OwnerForm是怎么实现的? 求解,请有懂的人告诉一下,谢谢!
[最优解释]
其实很简单,你的思路根本错了。

只要用
SetParent将窗口设置为你CreateWindow的子窗口就行了。
[其他解释]
+ ws_overlappedwindow

createwindowex x,x,x,ws_overlappedwindow or ws_visible... owner.hwnd

no ws_child

sub owner_formload()

  first line: createwindowex....
  second line: setwindowpos owner.hwnd,-1....

[其他解释]
你需要你的form2在form1上面

那么就在把form2设置成form1的子窗体就好了
[其他解释]


'标准模块代码
Option Explicit
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
                                            ByVal hWndInsertAfter As Long, _
                                            ByVal x As Long, _
                                            ByVal y As Long, _
                                            ByVal cx As Long, _
                                            ByVal cy As Long, _
                                            ByVal wFlags As Long) As Long
Public Const HWND_TOPMOST = -1
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOZORDER = &H8

Public Sub SetFormTopmost(TheForm As Form)
    SetWindowPos TheForm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOZORDER + SWP_NOMOVE + SWP_NOSIZE
End Sub

'窗体代码
Option Explicit

Private Sub Command1_Click()
    SetFormTopmost frmMain
End Sub


------其他解决方案--------------------


该回复于2012-12-08 14:13:04被管理员删除
[其他解释]
Up一下,在补充一点,如果是模式窗体就不要了
[其他解释]
非常感谢你的回复,但是不能达到我的要求,如果工程里有多个窗体都置顶就不行,如Form1先SetFormTopmost之后启动窗体Form2,然后Form2也SetFormTopmost,Form1一样可以挡住Form2,Form2无法在Form1的顶层,我的目的是做一个登陆窗体,然后置顶层,之后我调用CreateWindowEx创建了一个类似ToolTip气泡类型的提示窗体,就好像QQ的“大写锁定已打开”,然后我也将它置顶,但是我激活登陆窗体的时候提示窗体就跑到后面去了,被登陆窗体挡住了……我想让提示窗体一直显示在登陆窗体前面
[其他解释]

如上图,现在我是让提示窗体跟随登陆窗体一起移动的,就是子类登陆窗体,然后用SetWindowPos移动提示窗体,所以移动的时候可以看见提示窗体在登陆窗体之前,但是移动完成后提示窗体就会跑到后面去,被登陆窗体挡住了,我的登陆窗体是无标题栏边框的,移动是用Call SendMessage(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, ByVal 0&)移动,请指点一下,谢谢!
[其他解释]
谢谢PctGL,我去试试先……不过ws_overlappedwindow不能单独关闭窗体,好像也去不了边框
[其他解释]
这也是 Form.Show [Modal, Owner]的原理。
[其他解释]
谢谢caozhy、clear_zero,我试着新建了一个工程,然后调用SetParent,结果Form1成了MDI窗体,Form2在Form1的内部,与Form.Show [Modal, Owner]不太一样。要怎么把Form2弄到Form1的外部呢?
[其他解释]
谢谢各位的热心帮助,总算可以了,原来要WS_POPUP风格,在CreateWindowEx的时候hwndParent指定父窗口就可以了。参考了http://blog.csdn.net/oldmtn/article/details/7197026之后迷迷糊糊知道了一点。结贴!

热点排行