MDI动态子窗口的问题

kkkgho 2008-05-11 03:57:24
1.如何获得子窗口数量?
2.利用动态方式创建的窗口后,
Dim f As New Form1
f.Show

如何切换到指定的某个子窗口,(由于动态创建的子窗口名称都是form1,没办法确定是切换哪个窗体)
...全文
137 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbcontrols 2008-05-18
  • 打赏
  • 举报
回复
不用这么麻烦的
[Quote=引用 6 楼 Sandrer 的回复:]
我的做法是子类化MDI主窗体中的客户区窗体(类名为:MDIClient,需要用FindWindowEx函数查找)
你的第一个问题,设置一个全局变量
拦截消息WM_MDICREATE,则增加一个子窗体(全局变量+1)
拦截消息WM_MDIDESTROY,则减少一个子窗体(全局变量-1)

第二个问题
用SendMessage发送WM_MDIGETACTIVE给客户端,获得当前获得焦点的窗体
用SendMessage发送消息WM_MDIACTIVATE给客户端,则可以设置某个窗体获得焦点


给…
[/Quote]
kkkgho 2008-05-17
  • 打赏
  • 举报
回复
巨汗,太复杂了,我研究一下
Sandrer 2008-05-15
  • 打赏
  • 举报
回复
下面是效果图,点击选项卡的时候会自动切换到特定窗体
因为选项卡中每个卡中都保存了特定窗体的句柄,点击选项卡的时候发送WM_MDIACTIVATE消息给客户区

Sandrer 2008-05-15
  • 打赏
  • 举报
回复
我的做法是子类化MDI主窗体中的客户区窗体(类名为:MDIClient,需要用FindWindowEx函数查找)
你的第一个问题,设置一个全局变量
拦截消息WM_MDICREATE,则增加一个子窗体(全局变量+1)
拦截消息WM_MDIDESTROY,则减少一个子窗体(全局变量-1)

第二个问题
用SendMessage发送WM_MDIGETACTIVE给客户端,获得当前获得焦点的窗体
用SendMessage发送消息WM_MDIACTIVATE给客户端,则可以设置某个窗体获得焦点


给段代码你参考一下
'客户区回调函数
Function WndProc_MDIClient(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Rtn As Long
Dim TCI As TCITEM
Dim strBuffer As String
Dim strWindowText As String
Dim lngBufferSize As Long
Dim lngWindowIcon As Long
Dim lngTabsCount As Long
Dim lngIconCount As Long
Dim i As Long

Select Case Msg
Case WM_KILLFOCUS '检测用户在客户区中更换了哪个窗口,并将该窗口对应的选项卡设置焦点
'获取选项卡窗格数量
lngTabsCount = SendMessage(tcWnd, TCM_GETITEMCOUNT, 0, ByVal 0&)
'设置窗格返回值有效标志(自定义项)
TCI.mask = TCIF_PARAM
For i = 0 To lngTabsCount - 1
With TCI
'获取选项卡第i个窗格
SendMessage tcWnd, TCM_GETITEMA, i, TCI
If .lParam = wParam Then
'如果当前获得焦点的窗口句柄与选项卡中记载的句柄相同,则激活该选项卡窗格
SendMessage tcWnd, TCM_SETCURFOCUS, i, ByVal 0&
'退出循环
Exit For
End If
End With
Next i
Case WM_MDICREATE '子窗口增加
glngWindowCount = glngWindowCount + 1
ShowWindow tcBGWnd, IIf(glngWindowCount > 0, SW_SHOW, SW_HIDE)
Case WM_MDIDESTROY '子窗口删除
'记录当前子窗口数量
glngWindowCount = glngWindowCount - 1
'设置窗格返回值有效标志(自定义项)
TCI.mask = TCIF_PARAM
'获得选项卡窗格数量
lngTabsCount = SendMessage(tcWnd, TCM_GETITEMCOUNT, 0, ByVal 0&)
For i = 0 To lngTabsCount - 1
With TCI
'获取选项卡第i个窗格
SendMessage tcWnd, TCM_GETITEMA, i, TCI
'判断窗格所对应的窗口句柄是否等于正在被消除的窗口句柄
If .lParam = wParam Then
'删除第i个窗格
SendMessage tcWnd, TCM_DELETEITEM, i, ByVal 0&
'获取当前正被消除的子窗口的下一个子窗口句柄
mlngActivateWindow = GetWindow(wParam, GW_HWNDNEXT)
'使下一个子窗口所对应的窗格获得焦点
If IsWindow(mlngActivateWindow) = 1 And mlngActivateWindow <> wParam Then SendMessage tcWnd, TCM_SETCURFOCUS, i, ByVal 0&
Exit For
End If
End With
Next i
'如果当前客户区中没有任何子窗口,则隐藏选项卡
ShowWindow tcBGWnd, IIf(glngWindowCount > 0, SW_SHOW, SW_HIDE)
'如果当前客户区中没有任何子窗口,则删除选项卡图象列表中的所有图象
If glngWindowCount <= 0 Then
'获得图象总数
lngIconCount = ImageList_GetImageCount(tchIml)
For i = 0 To lngIconCount - 1
ImageList_Remove tchIml, i
Next i
End If
Case WM_MDIACTIVATE, WM_MDIMAXIMIZE
'获得窗口标题字符
strWindowText = GetWindowText(wParam)

'判断选项卡中是否有重复项
TCI.mask = TCIF_PARAM
StartCheckTab:
lngTabsCount = SendMessage(tcWnd, TCM_GETITEMCOUNT, 0, ByVal 0&)
For i = 0 To lngTabsCount - 1
With TCI
SendMessage tcWnd, TCM_GETITEMA, i, TCI
If IsWindow(.lParam) = 0 Or GetParent(.lParam) <> MDIClient Then
SendMessage tcWnd, TCM_DELETEITEM, i, ByVal 0&
GoTo StartCheckTab
End If
If .lParam = wParam Then GoTo KeepGoing
End With
Next i

'选项卡插入新窗格
If tcWnd Then
With TCI
.mask = TCIF_TEXT Or TCIF_PARAM
.pszText = strWindowText
.lParam = wParam
End With
SendMessage tcWnd, TCM_INSERTITEMA, lngTabsCount, TCI
End If
Case WM_PAINT '当客户区重画时,重新判断选项卡中的每个窗格是否已有图标。如没有则设置一个。
lngTabsCount = SendMessage(tcWnd, TCM_GETITEMCOUNT, 0, ByVal 0&)
If lngTabsCount = 0 Then GoTo KeepGoing
For i = 0 To lngTabsCount - 1
With TCI
.mask = TCIF_PARAM Or TCIF_IMAGE Or TCIF_TEXT
TCI.cchTextMax = MAX_BUFFER_SIZE
TCI.pszText = String(MAX_BUFFER_SIZE, vbNullChar)
SendMessage tcWnd, TCM_GETITEMA, i, TCI
If IsWindow(.lParam) = 0 Then GoTo CheckNextTab
TCI.pszText = Left$(TCI.pszText, InStr(TCI.pszText, vbNullChar) - 1)
strBuffer = GetWindowText(.lParam)
If strBuffer <> TCI.pszText Then TCI.pszText = strBuffer
If .iImage > -1 Then GoTo CheckNextTab
lngWindowIcon = SendMessage(.lParam, WM_GETICON, ICON_SMALL, ByVal 0&)
If lngWindowIcon = 0 Then lngWindowIcon = GetClassLong(.lParam, GCL_HICONSM)
If lngWindowIcon = 0 Then GoTo CheckNextTab
ImageList_AddIcon tchIml, lngWindowIcon
DestroyIcon lngWindowIcon
.iImage = ImageList_GetImageCount(tchIml) - 1
SendMessage tcWnd, TCM_SETITEMA, i, TCI
End With
CheckNextTab:
Next i
End Select

KeepGoing:
WndProc_MDIClient = CallWindowProc(glngMDICPrevWnd, hWnd, Msg, wParam, lParam)
End Function
kkkgho 2008-05-14
  • 打赏
  • 举报
回复
UP
kkkgho 2008-05-13
  • 打赏
  • 举报
回复
如果是多窗口可以form1.text=form1.text+form2.text+form3.text+.......
问题是动态创建的MDI怎么实现
kkkgho 2008-05-13
  • 打赏
  • 举报
回复
第2点不是这个意思,我要将所有子窗口的某个文本框的内容全部连接到一个变量里面,所以想知道如何让mdi搞清楚我现在在获取那个子窗口的内容,总不可能用x=f.text1.text吧??
vansoft 2008-05-11
  • 打赏
  • 举报
回复
第一个问题应该有COUNT属性,
如果没有,请使用FOR EACH来循环累计。

第二个,不用你指定,MDI自己的WINDOWS菜单里他分得清,
这个菜单是自动的,不用你写代码,在菜单设计器里有个属性勾上就OK了。
当多一个窗体就会多一个条目,你点一下就会切换到相应的窗体,不用你写任何代码。
仅仅是设置某个菜单的某个属性而已。
kkkgho 2008-05-11
  • 打赏
  • 举报
回复
UP

7,763

社区成员

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

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