实现一Form成为另一个MDI窗口的子窗口

lp 2001-01-09 05:04:00
如何用API或其他方法将一个普通的Form设为一MDI窗口的子窗口.
我使用的是SetParent,但是结果并不理想,如果子窗口为活动窗口,MDI窗口就不是活动窗口了,当子窗口超出父窗口边界时也不会出现滚动条
怎样才能使实现后的结果和在工程中加一MdiForm并将另一个Form的Child的属性设为True的结果一样.
赐教!
...全文
379 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
playyuer 2001-07-30
  • 打赏
  • 举报
回复
你说的没错 SetParent 就是这效果!

When you call the SetParent function to allow a standard form to become a child form of a multiple-document interface (MDI) application, many child windowing features do not work.

http://support.microsoft.com/support/kb/articles/Q253/8/14.asp
PRB: SetParent Does Not Change Standard Forms into Child Wind
cainiaobus 2001-07-30
  • 打赏
  • 举报
回复
在看
riluo 2001-07-30
  • 打赏
  • 举报
回复
make a sign
glassnake 2001-01-15
  • 打赏
  • 举报
回复
运行这段代码并没有得到所要的效果,比如:子窗口最大化时的标题栏并没有并到mdi窗口的标题栏
glassnake 2001-01-10
  • 打赏
  • 举报
回复
MDI客户区窗口指的是什么
NiceFeather 2001-01-10
  • 打赏
  • 举报
回复
jifeng说的不错!
sbm 2001-01-10
  • 打赏
  • 举报
回复
mdichild属性的设置在运行时不能更改,只能用API实现。
jifeng 2001-01-10
  • 打赏
  • 举报
回复
to glassnake:
就是容纳MDI子窗体的那个窗口啊,可用FindwindowEx或GetWindow函数获得其HWND
【VB声明】
Private Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

【说明】
获得一个窗口的句柄,该窗口与某源窗口有特定的关系

【返回值】
Long,由wCmd决定的一个窗口的句柄。如没有找到相符窗口,或者遇到错误,则返回零值。会设置GetLastError

【备注】
兄弟或同级是指在整个分级结构中位于同一级别的窗口。如某个窗口有五个子窗口,那五个窗口就是兄弟窗口。尽管GetWindow可用于枚举窗口,但倘若要在枚举过程中重新定位、创建和清除窗口,那么EnumWindows和EnumChildWindows更为可靠

【参数表】
hwnd ----------- Long,源窗口

wCmd ----------- Long,指定结果窗口与源窗口的关系,它们建立在下述常数基础上:
GW_CHILD
寻找源窗口的第一个子窗口
GW_HWNDFIRST
为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口
GW_HWNDLAST
为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口
GW_HWNDNEXT
为源窗口寻找下一个兄弟窗口
GW_HWNDPREV
为源窗口寻找前一个兄弟窗口
GW_OWNER
寻找窗口的所有者

【VB声明】
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

【别名】
FindWindowExA

【说明】
在窗口列表中寻找与指定条件相符的第一个子窗口

【返回值】
Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError

【参数表】
hWnd1 ---------- Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)

hWnd2 ---------- Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索

lpsz1 ---------- String,欲搜索的类名。零表示忽略

lpsz2 ---------- String,欲搜索的类名。零表示忽略



jifeng 2001-01-10
  • 打赏
  • 举报
回复
Sorry,上面代码有点错误 MainForm.picPageBox.hwnd应为MDI客户区窗口的句柄
jifeng 2001-01-10
  • 打赏
  • 举报
回复
使用Setwindowlong函数修改Form的窗口样式,设置WS_CHILD

Dim OldWindowStyle As Long
Dim OldParent As Long


Private Sub Form_Load()
OldWindowStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
OldParent = SetParent(Me.hwnd, MainForm.picPageBox.hwnd)
Call SetWindowLong(Me.hwnd, GWL_STYLE, OldWindowStyle Or WS_CHILD)
End Sub

lp 2001-01-09
  • 打赏
  • 举报
回复
想不到有这么多同道朋友,我也在努力研究
不知 h_x_k(一缕清烟)朋友能否详细说明一下
glassnake 2001-01-09
  • 打赏
  • 举报
回复
这正是我想知道的
wywq 2001-01-09
  • 打赏
  • 举报
回复
关注!
vbdabster 2001-01-09
  • 打赏
  • 举报
回复
如果你能解决的话,我也想知道
dragonleon 2001-01-09
  • 打赏
  • 举报
回复
关注
h_x_k 2001-01-09
  • 打赏
  • 举报
回复
setwindowlong
xzjxu 2001-01-09
  • 打赏
  • 举报
回复
将子窗体的mdichild属性设为true

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧