首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

怎样通过API去除一个窗口的标题栏和边框?解决方法

2012-01-12 
怎样通过API去除一个窗口的标题栏和边框?能提供窗口的句柄,这个窗口不是我的软件的,也不是我设计的。[解决

怎样通过API去除一个窗口的标题栏和边框?
能提供窗口的句柄,这个窗口不是我的软件的,也不是我设计的。

[解决办法]
不好意思啊,给你的代码差点误导你了!
本来想回答你怎样知道有没有边框的,谁知道得到的结果却在我的意料之外,于是就研究了一下,却发现窗口其实不是想象的简单。以下是测试有没有边框的代码:
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等风格,于是修改代码如下:

VB code
Dim Style As LongStyle = GetWindowLong(hwnd, GWL_STYLE)Style = Style And Not WS_CAPTION ‘这里改成位运算,不会出现进退位问题Style = Style And Not WS_SYSMENUStyle = Style And Not WS_MAXIMIZEBOXStyle = Style And Not WS_MINIMIZEBOXStyle = Style And Not WS_SIZEBOXSetWindowLong 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重新设置
VB code
Dim Style As LongStyle = GetWindowLong(hwnd, GWL_STYLE)Style = Style And Not WS_CAPTIONStyle = Style And Not WS_SYSMENUStyle = Style And Not WS_MAXIMIZEBOXStyle = Style And Not WS_MINIMIZEBOXStyle = Style And Not WS_SIZEBOXSetWindowLong hwnd, GWL_STYLE, Style'SetWindowLong hwnd, GWL_EXSTYLE, 0Dim swpFlag As LongswpFlag = 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_NCCALCSIZESetWindowPos 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

热点排行