机房收费系统(一)MDI子窗体以及在其中应用Picturebox问题

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">敲机房收费系统时也遇到了各种问题,但正是这些各种各样的问题一步步让我们提高。</span>

(一)MDI子窗体和picturebox同级问题

主窗体由于是MDI窗体,因此要在里面加command控件就要先添加picturebox控件,然后在控件里面添加各种控件,这也就导致一个问题,当打开它的一个子窗体时,就会出现如下情况:

机房收费系统(一)MDI子窗体以及在其中应用Picturebox问题_第1张图片

如果图片框占据全屏,其他窗体就会被挡住,

这是因为 MDI 程序中子窗体实际上是位于 MDIClient 里,就是说子窗体的父窗体 是 MDIClient,而放置在MDI中的 picturebox 和MDIClient是同一级的层次结构

ThunderMDIForm--MDIForm1

--MDIClient

----ThunderFormDC--Form1 子窗体1

----ThunderFormDC--Form2 子窗体2

--ThunderPictureBoxDC MDI中 的 picturebox

此时可调用一个API

Public Declare Function SetParent Lib "User32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

然后使窗体加载时调用这个API即可

Call SetParent(form1.hWnd, fMainForm.Picture1.hWnd)
form1.show

如果form1为fmainform的子窗体,那么不加form1.show也可以,否则必须加。

注意,在这个过程中,form1.hwnd表示为子窗体句柄,不能直接放在fmainform父窗体中,否则最小化时图标就会消失,需要放在picture中,即fmainform.picture1.hwnd

(2)打开一个窗体,上一个窗体自动最小化问题

这个问题的解决是靠其他小伙伴的帮助才做到的,希望也可以帮助其他同学。

    Dim frm As Form
    For Each frm In Forms
    If frm.Name <> Me.Name And frm.Name <> fMainForm.Name Then
        frm.WindowState = 1
    End If
    Next
对于大家其他的方法,也很乐意交流。

(3)窗体最小化后不能获得焦点问题

当打开一个新的子窗体,上一个子窗体会自动最小化,但上一个窗体回复后就失去了焦点,很多控件不能用,

对此我的解决方案是将这些窗体去掉MDIchild属性设为false即不为MDI子窗体,可以达到和mdi子窗体相同的效果,当恢复大小后又能重新获得焦点。


你可能感兴趣的:(机房收费系统(一)MDI子窗体以及在其中应用Picturebox问题)