很多时候我们并不需要用.net窗口弹出消息,因为.net窗口是很多功能的,所以难免用多了会有资源的浪费。仅仅为了显示一个消息或者做个窗体投影,这是没必要用form窗体的,那么只需要一个创建出来没有额外功能的窗口是最简洁的。
用什么方法才能不用form类弹出窗口呢?
1.用control类,当然form也是派生至control类,相对来说control类使用起来大致消耗资源仅仅是一个控件那么多。control类作为弹出窗体也很简单,用settoplevel这个方法设置为true即可
但是具体如何去除标题栏。接下来为在介绍nativewindow这个类时会说到
2.使用dropdownmenu,这个控件啊,我相信作为弹出菜单使用是相当方便的。不需要额外的代码。
3.用api从头到尾创建一个窗体,首先是注册类名,然后registerclass,设置回调函数,创建句柄,最后才能用createwindowex这个api进行窗口的创建,具体我觉得太繁琐了,用.net实现还是有点难,当然有c基础的这个应该不在话下
4.用.net一切窗口出发的父类,nativewindow.这个类已经把第三种的所有步骤封装进去了。而且没有额外一些其他的功能,微软称之为低级封装的窗口过程。
接下来进入我们的nativewindow的创建窗体
Imports System.Runtime.InteropServices
Public Class SimpleForm
Inherits NativeWindow
Public Const WS_POPUP = &H80000000 '设置为弹出窗口
Public Const WS_BORDER = &H800000 '设置单边框
Public Const WS_THICKFRAME = &H40000 '拥有可改变大小的边框
Public Const WS_SYSMENU = &H80000 '设置拥有系统菜单
Public Const WS_CAPTION = &HC00000 '标题
'扩展样式常量
Public Const WS_EX_TOOLWINDOW = &H80 '设置为工具窗口
Public Const WS_EX_LAYERED = &H80000 '设置为分层窗口
Public Const WS_EX_APPWINDOW = &H40000 '设置为应用窗口
Public Const WS_EX_CONTROLPARENT = &H10000 '设置为控件容器
'展示窗体
<DllImport("user32")>
Private Shared Function ShowWindow(hwnd As Integer, cmshow As Integer) As Integer
End Function
'移动大小和改变位置
<DllImport("user32")>
Private Shared Function MoveWindow(hwnd As Integer, x As Integer, y As Integer, cwidth As Integer, cheight As Integer, repaint As Boolean) As Integer
End Function
Public Sub Show()
ShowWindow(Handle, 4)
MoveWindow(Handle, 100, 100, 400, 400, False)
End Sub
Public Sub New()
Dim cp As New CreateParams
cp.Caption = "这是nativewindow"
cp.Style = cp.Style Or WS_CAPTION Or WS_SYSMENU '带有标题和菜单按钮
cp.ExStyle = cp.ExStyle Or WS_EX_TOOLWINDOW '作为工具窗体,不显示任务栏
CreateHandle(cp) '创建窗体句柄,这句很重要,没有它就没有后面的一切
End Sub
End Sub
现在已经完成了,可以show我们这个nativewindow了
这个窗体就是最简洁的窗体了,具体要怎么弄,可以在消息处理函数下面进行一个处理比如绘制消息等等,可以弄成分层窗体进行贴图操作。当然了一旦用这个类就意味着得用winapi改变它一切的属性了。但是仅仅显示简单功能,用它很节省资源。