VisualFreeBasic控件_Form窗口

2026-1-20 / 0 评论 / 82 阅读

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

在设置界面的右边,是可以改变窗口的属性,还可以查看该窗口的全部事件和成员。
鼠标双击窗口,就进入控件代码

窗口分类

  1. 主窗口(启动窗口) =================================
    当打开一个EXE后,有一个窗口会自动显示出来,称为 主窗口,这是窗口是唯一性的,当关闭这个窗口后,整个软件就关闭了。 主窗口是生产出软件后自动显示出来的,可以在工程属性中,指定一个窗口为主窗口。在工程属性里称为“启动窗口”
  2. 副窗口 ==========================================
    在工程中,新增窗口,然后代码中显示出的窗口,都是副窗口,副窗口随意关闭,不会影响到整个软件
    点击“+”号,选择“新增窗体”(窗口和窗体,意思是相同的,只是个名词,以后遇到,有时会说窗口,有时会说窗体,其实是一个意思,明白就可以,不用纠结。)

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

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

    可以在窗口属性中看出来

窗口名词,默认是英文的,可以在属性里设置为中文的,下列是显示副窗口代码

怪物信息.Show 

主窗口和副窗口,相互独立,互不干扰。

  1. 从窗口 ========================================
    显示的窗口,永远在主窗口上面,激活这个窗口,同时也会激活主窗口,这个窗口就叫从窗口。
    显示从窗口的代码,就是增加一个主窗口句柄。

    怪物信息.Show(Form1.hWnd)

    此时,“怪物信息”窗口就是“Form1”窗口的从窗口,它们的关系,称为“主从”关系
    注意:建立起“主从”关系的后窗口,当关闭主窗口后,从窗口也会被自动关闭
    这里的“主从”关系的 主窗口,并不是单指窗口分类的主窗口,副窗口,也可以有从窗口,当关闭副窗口后,副窗口的从窗口都会被自动关闭,而且被自动关闭的从窗口不会产生“WM_Close”关闭事件,但会有“WM_Destroy”销毁事件

  2. 模式窗口 =============================
    模式窗口是从窗口的扩展功能。也属于从窗口。比方对话框窗口,就是模式窗口。
    显示窗口代码,第2个参数为 True 时,此时显示窗口后,主窗口或副窗口,将会被禁止使用,而且代码执行会在此行等待,一直到这个从窗口关闭以后,才会继续执行下一行代码。

    怪物信息.Show(Form1.hWnd,True)
    下一行代码,需要等待从窗口关闭才继续执行
  3. 子窗口 ========================================
    一个窗口在另一个窗口里面,称为子窗口,要想让一个窗口成为子窗口,需要设置窗口属性“子窗口”

    然后显示窗口代码就是和显示从窗口一样,它们的关系,称为“父子”关系,“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 

评论一下?

OωO
取消