一个应用软件,都会有一个窗口

在设置界面的右边,是可以改变窗口的属性,还可以查看该窗口的全部事件和成员。
鼠标双击窗口,就进入控件代码
窗口分类
- 主窗口(启动窗口) =================================
当打开一个EXE后,有一个窗口会自动显示出来,称为 主窗口,这是窗口是唯一性的,当关闭这个窗口后,整个软件就关闭了。 主窗口是生产出软件后自动显示出来的,可以在工程属性中,指定一个窗口为主窗口。在工程属性里称为“启动窗口”

- 副窗口 ==========================================
在工程中,新增窗口,然后代码中显示出的窗口,都是副窗口,副窗口随意关闭,不会影响到整个软件
点击“+”号,选择“新增窗体”(窗口和窗体,意思是相同的,只是个名词,以后遇到,有时会说窗口,有时会说窗体,其实是一个意思,明白就可以,不用纠结。)

在标签上显示的是,窗口名词和文件名

可以设置备注,那么就显示备注,而不是窗口名

可以在窗口属性中看出来

窗口名词,默认是英文的,可以在属性里设置为中文的,下列是显示副窗口代码
怪物信息.Show
主窗口和副窗口,相互独立,互不干扰。
-
从窗口 ========================================
显示的窗口,永远在主窗口上面,激活这个窗口,同时也会激活主窗口,这个窗口就叫从窗口。
显示从窗口的代码,就是增加一个主窗口句柄。怪物信息.Show(Form1.hWnd)此时,“怪物信息”窗口就是“Form1”窗口的从窗口,它们的关系,称为“主从”关系
注意:建立起“主从”关系的后窗口,当关闭主窗口后,从窗口也会被自动关闭
这里的“主从”关系的 主窗口,并不是单指窗口分类的主窗口,副窗口,也可以有从窗口,当关闭副窗口后,副窗口的从窗口都会被自动关闭,而且被自动关闭的从窗口不会产生“WM_Close”关闭事件,但会有“WM_Destroy”销毁事件 -
模式窗口 =============================
模式窗口是从窗口的扩展功能。也属于从窗口。比方对话框窗口,就是模式窗口。
显示窗口代码,第2个参数为 True 时,此时显示窗口后,主窗口或副窗口,将会被禁止使用,而且代码执行会在此行等待,一直到这个从窗口关闭以后,才会继续执行下一行代码。怪物信息.Show(Form1.hWnd,True) 下一行代码,需要等待从窗口关闭才继续执行 -
子窗口 ========================================
一个窗口在另一个窗口里面,称为子窗口,要想让一个窗口成为子窗口,需要设置窗口属性“子窗口”

然后显示窗口代码就是和显示从窗口一样,它们的关系,称为“父子”关系,“Form1”是父窗口。怪物信息.Show(Form1.hWnd) 怪物信息.Move 0, 0 ‘重新设置位置,此位置是相对于父窗口执行代码后,会发现窗口里面有窗口

当然,这样的方式,还可以再套娃,子窗口里面也可以套子窗口,一直下去........
子窗口还有一个 MDI子窗口,这个是在 WIN3.x 版时比较流行,后来就逐渐消失,虽然如今的 WIn系统还是支持,我觉得也没有学习的必要,感兴趣的话就自己网上搜索。窗口显示
显示窗口代码,后面有3个可选参数
Form2.Show '显示副窗口
Form2.Show(Form1.hWnd) '显示从窗口
Form2.Show(Form1.hWnd, True) '显示模式窗口
Form2.Show(,, 99) '传递用户自定义参数
注意:这里的“.Show” 显示窗口,其实有2个功能,1.先创建窗口实体,2.显示出窗口。源自VB6的做法,假如窗口没用“.Show” 显示出来,因为窗口实体根本不存在,对于 Form2 的任何操作都是无效的操作。要想对一个窗口操作,必须先创建实体,就是用“.Show”
当窗口被创建出实体后,可以用以下代码显示和隐藏窗口
Form2.Visible = True '显示窗口
Form2.Visible = False '隐藏窗口
下面说一下,传递的用户自定义参数,传递到什么地方?两个地方,就是创建事件和显示事件(注意是第一次显示,以后隐藏再显示是不会触发此事件)
'[Form1]事件 : 完成创建窗口及所有的控件后,此时窗口还未显示。注:自定义消息里 WM_Create 此时还未创建控件和初始赋值。
'hWndForm 当前窗口的句柄(WIN系统用来识别窗口的一个编号,如果多开本窗口,必须 Me.hWndForm = hWndForm 后才可以执行后续操作本窗口的代码)
'UserData 来自显示窗口最后1个参数,例: Form2.Show(父窗口句柄,模式,UserData)
Sub Form1_WM_Create(hWndForm As hWnd,UserData As Integer)
End Sub
'[Form1]事件 : 窗口完全显示后。
'hWndForm 当前窗口的句柄(WIN系统用来识别窗口的一个编号,如果多开本窗口,必须 Me.hWndForm = hWndForm 后才可以执行后续操作本窗口的代码)
'UserData 来自显示窗口最后1个参数,例: Form2.Show(父窗口句柄,模式,UserData)
Sub Form1_Shown(hWndForm As hWnd, UserData As Integer)
End Sub
重复显示
默认情况下,你执行2次显示窗口代码,是无法显示出2个窗口的
Form2.Show '显示副窗口
Form2.Show '显示副窗口
此时只显示一个,需要在窗口属性中,选择多开属性,才会执行几次,重复创建并显示出这个窗口

重复开启窗口以后,你要设置该窗口属性,但由于重复开了N个窗口,代码是无法知道你具体给那个窗口操作的,因此这里就必须用到了窗口句柄,当你创建一个窗口后,WIn操作系统就给该窗口分配一个唯一的数值,称为窗口句柄
在没个窗口或控件的事件,都有主窗口句柄
Sub Form2_Shown(hWndForm As hWnd,UserData As Integer)
Form2.hWndForm = hWndForm
Form2.Visible =True
End Sub
Sub Form2_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)
Form2.Command1.hWndForm = hWndForm
Form2.Command1.Visible = True
End Sub
以上是自己窗口事件里,使用多开窗口的控件方法,要是在别的地方使用,就需要自己事先管理好重复多开的窗口句柄
Dim 多开窗口句柄 As hWnd
多开窗口句柄 = Form2.Show() '显示副窗口
显示窗口属性,返回的是该窗口实体的窗口句柄。
具体如何管理,这看你自己的实际需求和代码逻辑了。这里就不过多阐述。
因此,重复多开窗口后,想修改控件,必须先设置窗口句柄。
窗口类名
窗口有一个特殊属性名字,类名。意思就是分类的名字,同一个软件下面,窗口的分类名是唯一的,不允许重复。

类名,也可以用来搜索窗口,获得其句柄
Dim 窗口句柄 As hWnd
窗口句柄= FindWindow ("类名","窗口标题")
窗口句柄= FindWindowEx (父窗口句柄,窗口句柄之后, "类名","窗口标题")
NULL 表示所有的
窗口句柄= FindWindow (NULL,NULL)
窗口句柄= FindWindowEx (父窗口句柄,窗口句柄之后, NULL,NULL)
常见窗口相关的API
父 窗 口: API:GetParent(HWnd)
窗口标识:(控件ID) API:GetDlgCtrlID(HWnd)
窗口样式:AfxGetWindowStyle
If (Style And WS_BORDER)=WS_BORDER Then
WS_CLIPCHILDREN 排除在父窗口内绘图时子窗口占用的区域。创建父窗口时使用此样式。
WS_CLIPSIBLINGS 当某个子窗口收到WM_PAINT消息时,WS_CLIPSIBLINGS样式会将所有其他重叠的子窗口剪切到要更新的子窗口的区域之外。
WS_GROUP 窗口有一个水平滚动条
WS_MAXIMIZEBOX 窗口有一个最大化按钮。
WS_MINIMIZEBOX 窗口有一个最小化按钮。
WS_OVERLAPPED 窗口是一个重叠的窗口。重叠的窗口有标题栏和边框。
WS_POPUP 窗口是一个弹出窗口。
WS_SIZEBOX 窗口有一个尺寸边框。
WS_SYSMENU 窗口的标题栏上有一个窗口菜单。
WS_TABSTOP 窗口是一个控件,当用户按下TAB键时可以接收键盘焦点。
WS_TILED 窗口是一个重叠的窗口。重叠的窗口有标题栏和边框。
WS_VISIBLE 窗口最初是可见的。
扩展样式:AfxGetWindowExStyle
WS_EX_CLIENTEDGE 窗口边缘有凹陷的边缘。
WS_EX_LAYERED 窗口是分层的窗口。请注意,这不能用于子窗口。
WS_EX_LEFT 该窗口具有通用的左对齐属性。这是默认设置。
WS_EX_LTRREADING 使用从左至右的阅读顺序属性显示窗口文本。这是默认设置。
WS_EX_RIGHTSCROLLBAR 垂直滚动条(如果存在)位于客户区的右侧。这是默认设置。
WS_EX_WINDOWEDGE 窗口边缘有凸起的边缘。
----------------------------------------
桌面位置: API:GetWindowRect
父窗位置: API:MapWindowPoints
客 户 区: API:GetClientRect
----------------------------------------
实例句柄:API:GetWindowLongPtr(HWND, GWLP_HINSTANCE) 带Ptr 是64位32位通用,常量里多了 LP
菜单句柄:API:GetMenu(HWND)
过程地址:API:GetWindowLongPtr(HWND, GWLP_WNDPROC)
窗口进程: API:GetClassLong(HWND, GCLP_WNDPROC)
用户数据:API:GetWindowLongPtr(HWND, GWLP_USERDATA)
----------------------------------------
是否可见:API:IsWindowVisible(Hwnd)
允许使用:API:IsWindowEnabled(Hwnd)
是否置顶:API:(AfxGetWindowExStyle(hwnd) And WS_EX_TOPMOST) =WS_EX_TOPMOST
最小化否:API:IsIconic(hwnd)
最大化否:API:IsZoomed(hwnd)
宽字符窗:API:IsWindowUnicode(hwnd)
当前窗口
在自己的窗口写代码,可以用 me 来表示
下面的代码是等效的
Me.Enabled = True
Form1.Enabled =True
Me.Command1.Enabled = True
Form1.Command1.Enabled = True
me 在那个窗口的代码中,就表示那个窗口。
在自己窗口中,可以省略窗口名,直接打控件名来操作控件
Command1.Enabled = True
当在其它窗口中,你就必须加上窗口名称
Form1.Command1.Enabled = True
评论一下?