vb 单机任务栏的窗口不能最小化

当borderstyle=none时,窗体就不能像borderstyle=sizable那样,在任务栏点窗口就可以最小化和还原窗口了,请问怎么解决因为我做的窗体不能有边框... 当borderstyle=none时,窗体就不能像borderstyle=sizable 那样,在任务栏点窗口就可以最小化和还原窗口了,请问怎么解决
因为我做的窗体不能有边框,自己做的按钮,这样就不能通过任务栏点击了,违背了用户习惯,不是很方便,希望能解决!
展开
 我来答
wanggang519999
推荐于2016-09-23 · TA获得超过513个赞
知道小有建树答主
回答量:450
采纳率:0%
帮助的人:219万
展开全部
这则代码告诉你如何在运行时显示或隐藏窗体的标题栏。要使一个窗口的标题栏消失,你必须去掉control box、最大化按钮和最小化按钮,并且将caption设为空。不幸的是,VB中窗体的ControlBox、MinButton和MaxButton属性在运行期是只读的,因此,你只能在设计时做这些事。其实,只要能熟练操作关于窗口式样的API,你同样能在运行时办到这一点。
新建一个项目,把以下代码写入窗体:

Private Declare Function SetWindowLong Lib user32 Alias SetWindowLongA _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function GetWindowLong Lib user32 Alias GetWindowLongA _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000 WS_BORDER 或 WS_DLGFRAME
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_SYSMENU = &H80000

Private Declare Function SetWindowPos Lib user32 _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, _
ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Enum ESetWindowPosStyles
SWP_SHOWWINDOW = &H40
SWP_HIDEWINDOW = &H80
SWP_FRAMECHANGED = &H20 The frame changed: send WM_NCCALCSIZE
SWP_NOACTIVATE = &H10
SWP_NOCOPYBITS = &H100
SWP_NOMOVE = &H2
SWP_NOOWNERZORDER = &H200 Dont do owner Z ordering
SWP_NOREDRAW = &H8
SWP_NOREPOSITION = SWP_NOOWNERZORDER
SWP_NOSIZE = &H1
SWP_NOZORDER = &H4
SWP_DRAWFRAME = SWP_FRAMECHANGED
HWND_NOTOPMOST = -2
End Enum

Private Declare Function GetWindowRect Lib user32 (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Function ShowTitleBar(ByVal bState As Boolean)
Dim lStyle As Long
Dim tR As RECT

获取窗口的位置:
GetWindowRect Me.hwnd, tR

调整标题栏是否可见:
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
If (bState) Then
Me.Caption = Me.Tag
If Me.ControlBox Then
lStyle = lStyle Or WS_SYSMENU
End If
If Me.MaxButton Then
lStyle = lStyle Or WS_MAXIMIZEBOX
End If
If Me.MinButton Then
lStyle = lStyle Or WS_MINIMIZEBOX
End If
If Me.Caption <> Then
lStyle = lStyle Or WS_CAPTION
End If
Else
Me.Tag = Me.Caption
Me.Caption =
lStyle = lStyle And Not WS_SYSMENU
lStyle = lStyle And Not WS_MAXIMIZEBOX
lStyle = lStyle And Not WS_MINIMIZEBOX
lStyle = lStyle And Not WS_CAPTION
End If
SetWindowLong Me.hwnd, GWL_STYLE, lStyle

重新设定窗口:
SetWindowPos Me.hwnd, 0, tR.Left, tR.Top, tR.Right - tR.Left, tR.Bottom - tR.Top, SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED
Me.Refresh

你可能需要在Form_Resize中加一点代码,因为客户区的大小已经改变:
Form_Resize

End Function

为了试验一下代码,在窗体上放一个CheckBox,将它的Value属性设为1 (Checked)。然后写入以下代码:

Private Sub Check1_Click()
If (Check1.Value = Checked) Then
ShowTitleBar True
Else
ShowTitleBar False
End If
End Sub

运行,当你点击这个CheckBox时,窗体的标题栏将会在隐藏或显示之间切换。

-------------------------------------------------------------------------------

Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16) '窗口样式

'窗口风格
Private Const WS_CAPTION = &HC00000 '带标题栏的窗口
Private Const WS_MAXIMIZEBOX = &H10000 '带最大化按钮的窗口
Private Const WS_MINIMIZEBOX = &H20000 '带最小化按钮的窗口
Private Const WS_SYSMENU = &H80000 '带系统菜单的窗口
Private Const WS_CLIPSIBLINGS = &H4000000 '不重绘层叠子窗口
Private Const WS_CLIPCHILDREN = &H2000000 '绘图时排子窗口区域
Private Const WS_OVERLAPPED = &H0& '具有标题栏和边框的层叠窗口
Private Const WS_THICKFRAME = &H40000 '具有可调边框
'WS_OVERLAPPEDWINDOW具有标题栏、窗口菜单、可调边框和最大化、最小化按钮的窗口
Private Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Private Const WS_GROUP = &H20000 '指定一组控制的第一个控制
Private Const WS_POPUP = &H80000000 '弹出式窗口
Private Const WS_BORDER = &H800000 '单边框窗口
Private Const WS_POPUPWINDOW = (WS_POPUP Or WS_BORDER Or WS_SYSMENU) '具有单边框、标题栏菜单的弹出式窗口
Private Const WS_MINIMIZE = &H20000000 '窗口最小化
Private Const WS_VISIBLE = &H10000000 '窗口可见
Private Const WS_DISABLED = &H8000000 '窗口被禁用
Private Const WS_MAXIMIZE = &H1000000 '窗口最大化
Private Const WS_DLGFRAME = &H400000 '对话框边框风格
Private Const WS_VSCROLL = &H200000 '具有垂直滚动条
Private Const WS_HSCROLL = &H100000 '具有水平滚动条
Private Const WS_TABSTOP = &H10000 '具有TAB键控制
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD) '具有子窗口

'扩展风格
Private Const WS_EX_WINDOWEDGE = &H100& '窗口具有凸起的3D边框
Private Const WS_EX_CLIENTEDGE = &H200& '窗口具有阴影边界
Private Const WS_EX_TOOLWINDOW = &H80& '小标题工具窗口
Private Const WS_EX_TOPMOST = &H8& '窗口总在顶层
Private Const WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE) 'WS_EX-CLIENTEDGE和WS_EX_WINDOWEDGE的组合
Private Const WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST) 'WS_EX_WINDOWEDGE和WS_EX_TOOLWINDOW和WS_EX_TOPMOST的组合
Private Const WS_EX_DLGMODALFRAME = &H1& '带双边的窗口
Private Const WS_EX_NOPARENTNOTIFY = &H4& '窗口在创建和销毁时不向父窗口发送WM_PARENTNOTIFY消息
Private Const WS_EX_TRANSPARENT = &H20& '窗口透眀
Private Const WS_EX_MDICHILD = &H40& 'MDI子窗口
Private Const WS_EX_CONTEXTHELP = &H400& '标题栏包含问号联机帮助按钮
Private Const WS_EX_RIGHT = &H1000& '窗口具有右对齐属性
Private Const WS_EX_RTLREADING = &H2000& '窗口文本自右向左显示
Private Const WS_EX_LEFTSCROLLBAR = &H4000& '标题栏在客户区的左边
Private Const WS_EX_CONTROLPARENT = &H10000 '允许用户使用Tab键在窗口的子窗口间搜索
Private Const WS_EX_STATICEDGE = &H20000 '为不接受用户输入的项创建一个三维边界风格
Private Const WS_EX_APPWINDOW = &H40000 '在任务栏上显示顶层窗口的标题按钮
Private Const WS_EX_LAYERED = &H80000 '窗口具有透眀属性(Win2000)以上
Private Const WS_EX_NOINHERITLAYOUT = &H100000 '窗口布局不传递给子窗口(Win2000)以上
Private Const WS_EX_LAYOUTRTL = &H400000 '水平起点在右边的窗口
Private Const WS_EX_NOACTIVATE = &H8000000 '窗口不会变成前台窗口(Win2000)以上
Private Const WS_EX_LEFT = &H0& '窗口具有左对齐属性
Private Const WS_EX_LTRREADING = &H0& '窗口文本自左向右显示
Private Const WS_EX_RIGHTSCROLLBAR = &H0& '垂直滚动条在窗口的右边界
Private Const WS_EX_ACCEPTFILES = &H10& '接受文件拖曳
Private Const WS_EX_COMPOSITED = &H2000000 '窗体所有子窗口使用双缓冲从低到高绘制(XP)

Private Sub Form_Initialize()

Dim lStyle As Long
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) '获取原风格

'lStyle = lStyle And Not WS_OVERLAPPEDWINDOW

lStyle = lStyle And Not WS_OVERLAPPED '去除不用的风格
lStyle = lStyle And Not WS_THICKFRAME
lStyle = lStyle And Not WS_MAXIMIZEBOX

lStyle = lStyle Or WS_SYSMENU '加上自定义风格
lStyle = lStyle Or WS_GROUP
lStyle = lStyle Or WS_MINIMIZEBOX

SetWindowLong Me.hwnd, GWL_STYLE, lStyle '设置新的风格

Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2

End Sub

Private Sub Form_Click()
End
End Sub
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式