主窗体是个MDI窗体,现在想要把MDI子窗体都封装在dll中。
如果把dll中的窗体设为mdichild的话,运行时就说没有MDI窗体,因为dll的工程中确实没有MDI窗体;如果把dll中的窗体不设为mdichild的话,调用后又不能作为mdi子窗体运行。
调用时使用SetParent将dll中的窗体的父窗体指向主窗体,这样的效果也没有完全达到MDI子窗体的那种效果。
哪位高手告诉下怎么解决啊!
如果把dll中的窗体设为mdichild的话,运行时就说没有MDI窗体,因为dll的工程中确实没有MDI窗体;如果把dll中的窗体不设为mdichild的话,调用后又不能作为mdi子窗体运行。
调用时使用SetParent将dll中的窗体的父窗体指向主窗体,这样的效果也没有完全达到MDI子窗体的那种效果。
哪位高手告诉下怎么解决啊!
微软提示的解决方案是SetParent,
但这个根本不理想。另外一个开源的示例,无法正确显示窗体风格,比如子窗体设置的风格,进去后不是这个风格。还有一个控件,比较满意,但不开源,弹出对话框什么的,需要购买。总之,我到现在没有找到满意的。
将你需要实现的MDI子窗体全部做成UserControl,主工程中加一个空白的子窗体frmChild;
打开某个子窗体界面只要新建frmChild实例,然后通过它的Controls.Add()创建对应的UserControl实例。
当时用以说明此类用法的例子。
留传一下有缘人啊。
Email:[email protected]
果然是焦点到最后不管用。
·MDIExtender是最方便的,就是要花钱
·在不花钱的方案中,用 UserControl 是对现有程序改动最小的方案,除了对 Tab、Shift+Tab 按键消息的额外处理,剩下的就是依葫芦画瓢没什么难度。
http://econet.zjgsu.edu.cn/cy_filesxxx/vbsrc/MDIFormSnapIn.rar因为是硬编码,所以理论上会有一些几率出现XX说明: 1.因为这个窗体拦截类(g_oWCHooker)会拦截所有的窗体创建过程,所以,务必要指定需要处理的目标窗体(Form1)。具体方法就是在设计环境中为目标窗体(Form1)指定一个约定的窗体标题(即Caption属性设为我模块中写的那个TARGET_WINDOW_CAPTION常量的值“frmTargetWindow”)2.完事之后记得在MDIForm_Unload事件中卸载目标窗体(Form1)
Private Sub (Cancel As Integer)
Unload Form1
End Sub3.有事先闪,下次再说
但这个是程序本身的窗体。现在的要求是将DLL里出来的窗体变为自己的子窗体。我一上来就加个DLL工程,把FORM2加了进来。
结果不行,原来FORM2里还有代码。搞了一下,没成功,太晚了,休息。
今天继续。
1. VisualBasic 中创建新的标准 EXE 项目。 默认情况下创建 Form 1。
2. 在 项目 菜单上, 单击 Form 1 删除 。
3. 在 项目 菜单上, 单击 添加 MDI 窗体 。 MDIForm1 添加到 Project 1。
4. 在 项目 菜单上, 单击 Project 1 属性 , 并设置到 MDIForm1 Startup 对象。
5. 添加下列代码后面 MDIForm1:Private Sub MDIForm_Click()
Dim x As Class1
Set x = New Class1
x.ShowChildForm MDIForm1.hWnd
End Sub
6. 在 文件 菜单上, 单击 AddProject@@@ 。 要创建项目组, 添加一个新的 ActiveXDLL 项目。 默认情况下创建 Class 1。
7. 以下代码添加到 Class 1:
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As LongPrivate Declare Function SetParent Lib "user32" _
(ByVal hWndChild As Long, ByVal hWndNewParent As Long) As LongPrivate Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As LongConst GWL_STYLE = (-16)
Const WS_POPUP = &H80000000Public Function ShowChildForm(ByVal hWndMDIForm As Long)
Dim Ret As Long
Dim CurrentStyle As Long
Ret = SetParent(Form1.hwnd, hWndMDIForm)
CurrentStyle = GetWindowLong(Form1.hwnd, GWL_STYLE)
Ret = SetWindowLong(Form1.hwnd, GWL_STYLE, CurrentStyle Or WS_POPUP)
Form1.Show
End Function
8. 在 项目 菜单上, 单击 添加窗体 。 Form 1 添加到 Project 2。
9. 在 @ @ @ ProjectExplorer@@, 单击 Project 1 以激活 Project 1
10. 在 项目 菜单上, 单击 References , 并添加一个引用到 Project 2 。
11. 按 F 5 键运行该程序。
12. 单击 MDIForm1 的客户端区域。 注意 Form 1 (从 Project 2) 在工作区的 MDI 窗体是立即可见。
以下列表包括一部分, 实现 SetParent 方法时可能遇到问题: ? MDI 父级的标题栏不显示从动态链接库 (DLL) 窗体具有焦点时, 它是活动窗口。
不从 DLL 中窗体菜单不合并与的 MDI 父窗体菜单。
当窗体从 DLL 是最大化, DLL 表单的标题栏是仍然可见。
MDI 子窗体是 MDI 项目的一部分收到焦点, 时它们不从 DLL 出现顶部窗体。
可通过 MDI 项目中存在一个工具栏移动窗体从 DLL。
当 DLL 表单出的可见区域的 MDI 窗体, 移动滚动条不显示 MDI 父级上。
这代码偶测试通过 XP(SP2)
也不知道抛到哪里去了
这些对搂在没帮助。