Dim Style As Long Style = GetWindowLong(Me.hwnd, GWL_STYLE) Style = Style - WS_BORDER - WS_CAPTION '去除边框和标题栏风格 SetWindowLong Me.hwnd, GWL_STYLE, Style
'Api声明: Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const GWL_STYLE = (-16) Private Const WS_BORDER = &H800000 Private Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME
好的谢谢,再补充问一个问题:怎么从获得的Style中知道到底有没有边框之类的信息?
不好意思啊,给你的代码差点误导你了! 本来想回答你怎样知道有没有边框的,谁知道得到的结果却在我的意料之外,于是就研究了一下,却发现窗口其实不是想象的简单。以下是测试有没有边框的代码: Dim Style As Long Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE) If Style And WS_BORDER Then MsgBox "有边框" Else MsgBox "无边框" End If 原本想去掉窗口的WS_BORDER 和 WS_CAPTION风格就可以解决问题了,于是给了你上面的代码,却发现边框还在,研究了一下,发现WS_CAPTION是WS_BORDER Or WS_DLGFRAME(其实从API浏览器复制过来的声明中就有注释的,没细看!呵呵!),加上做的是减运算(会有进退位),所以问题就来了,不好意思!对比了一下由窗体属性设置的无边框窗口,发现VB6还去掉了窗口的WS_MAXIMIZEBOX等风格,于是修改代码如下:Dim Style As Long Style = GetWindowLong(hwnd, GWL_STYLE) Style = Style And Not WS_CAPTION ‘这里改成位运算,不会出现进退位问题 Style = Style And Not WS_SYSMENU Style = Style And Not WS_MAXIMIZEBOX Style = Style And Not WS_MINIMIZEBOX Style = Style And Not WS_SIZEBOX SetWindowLong hwnd, GWL_STYLE, Style '下一句去掉窗口的扩展风格,不去掉窗口显示会有问题,实际去掉的是什么风格,我没测试,这里的"0”是从VB6窗口属性设置的无边框窗口得到的,应用到其它含有和边框无关的扩展风格的窗口可能会有问题 SetWindowLong hwnd, GWL_EXSTYLE, 0
Dim Style As Long Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE) If Style And WS_BORDER Then MsgBox "有边框" Else MsgBox "无边框" End If 中的Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE) 改为Style = GetWindowLong(Me.hwnd, GWL_STYLE)
刚才又测试了一下,显示不正常与扩展风格无关,是窗口的大小改变了引起的,用SetWindowPos重新设置Dim Style As Long Style = GetWindowLong(hwnd, GWL_STYLE)Style = Style And Not WS_CAPTION Style = Style And Not WS_SYSMENU Style = Style And Not WS_MAXIMIZEBOX Style = Style And Not WS_MINIMIZEBOX Style = Style And Not WS_SIZEBOXSetWindowLong hwnd, GWL_STYLE, Style'SetWindowLong hwnd, GWL_EXSTYLE, 0 Dim swpFlag As Long swpFlag = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOREDRAW Or SWP_NOOWNERZORDER Or SWP_NOCOPYBITS Or SWP_NOACTIVATE Or SWP_FRAMECHANGED Or WM_NCCALCSIZE SetWindowPos hwnd, 0, 0, 0, 0, 0, swpFlag试了几个其它窗口,没发现问题
这是查看窗口有没有边框的代码: Dim Style As Long Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE) If Style And WS_BORDER Then MsgBox "有边框" Else MsgBox "无边框" End If
Style = GetWindowLong(Me.hwnd, GWL_STYLE)
Style = Style - WS_BORDER - WS_CAPTION '去除边框和标题栏风格
SetWindowLong Me.hwnd, GWL_STYLE, Style
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_BORDER = &H800000
Private Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME
本来想回答你怎样知道有没有边框的,谁知道得到的结果却在我的意料之外,于是就研究了一下,却发现窗口其实不是想象的简单。以下是测试有没有边框的代码:
Dim Style As Long
Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
If Style And WS_BORDER Then
MsgBox "有边框"
Else
MsgBox "无边框"
End If
原本想去掉窗口的WS_BORDER 和 WS_CAPTION风格就可以解决问题了,于是给了你上面的代码,却发现边框还在,研究了一下,发现WS_CAPTION是WS_BORDER Or WS_DLGFRAME(其实从API浏览器复制过来的声明中就有注释的,没细看!呵呵!),加上做的是减运算(会有进退位),所以问题就来了,不好意思!对比了一下由窗体属性设置的无边框窗口,发现VB6还去掉了窗口的WS_MAXIMIZEBOX等风格,于是修改代码如下:Dim Style As Long
Style = GetWindowLong(hwnd, GWL_STYLE)
Style = Style And Not WS_CAPTION ‘这里改成位运算,不会出现进退位问题
Style = Style And Not WS_SYSMENU
Style = Style And Not WS_MAXIMIZEBOX
Style = Style And Not WS_MINIMIZEBOX
Style = Style And Not WS_SIZEBOX
SetWindowLong hwnd, GWL_STYLE, Style
'下一句去掉窗口的扩展风格,不去掉窗口显示会有问题,实际去掉的是什么风格,我没测试,这里的"0”是从VB6窗口属性设置的无边框窗口得到的,应用到其它含有和边框无关的扩展风格的窗口可能会有问题
SetWindowLong hwnd, GWL_EXSTYLE, 0
Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
If Style And WS_BORDER Then
MsgBox "有边框"
Else
MsgBox "无边框"
End If
中的Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
改为Style = GetWindowLong(Me.hwnd, GWL_STYLE)
Style = GetWindowLong(hwnd, GWL_STYLE)Style = Style And Not WS_CAPTION
Style = Style And Not WS_SYSMENU
Style = Style And Not WS_MAXIMIZEBOX
Style = Style And Not WS_MINIMIZEBOX
Style = Style And Not WS_SIZEBOXSetWindowLong hwnd, GWL_STYLE, Style'SetWindowLong hwnd, GWL_EXSTYLE, 0
Dim swpFlag As Long
swpFlag = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOREDRAW Or SWP_NOOWNERZORDER Or SWP_NOCOPYBITS Or SWP_NOACTIVATE Or SWP_FRAMECHANGED Or WM_NCCALCSIZE
SetWindowPos hwnd, 0, 0, 0, 0, 0, swpFlag试了几个其它窗口,没发现问题
Dim Style As Long
Style = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
If Style And WS_BORDER Then
MsgBox "有边框"
Else
MsgBox "无边框"
End If