Kri*_*oks 28 winapi getwindowlong setwindowlong
我有一个窗口,周围有一个坚固的边框.如何使用SetWindowLong和GetWindowLong删除边框(所有非客户区域)?
Joh*_*ler 49
在C/C++中
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);
Run Code Online (Sandbox Code Playgroud)
WS_CAPTION定义为(WS_BORDER | WS_DLGFRAME).你可以通过删除这两种样式来逃避,因为当标题消失时,最小化最大化和系统菜单将消失,但最好也删除它们.
最好删除扩展边框样式.
LONG lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle);
Run Code Online (Sandbox Code Playgroud)
最后,要使用更改的样式重新绘制窗口,可以使用SetWindowPos.
SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
Run Code Online (Sandbox Code Playgroud)
以下Delphi代码执行此操作:
SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_BORDER and not WS_SIZEBOX and not WS_DLGFRAME );
SetWindowPos(Handle, HWND_TOP, Left, Top, Width, Height, SWP_FRAMECHANGED);
Run Code Online (Sandbox Code Playgroud)
当然,这些API调用在所有语言中看起来都是一样的.
小智 6
下面这行代码删除了任何给定窗口的边框,并且只保留其客户端:
SetWindowLong(hWnd /*The handle of the window to remove its borders*/, GWL_STYLE, WS_POPUP);
Run Code Online (Sandbox Code Playgroud)
您可以WS_POPUPWINDOW
在SetWindowLong
函数的第三个参数中使用.它还删除了给定窗口的边框并且也可以工作,但区别在于它还在窗口的其余客户端上绘制了轮廓黑色矩形.轮廓矩形的厚度为1像素.WS_POPUP
不绘制那个矩形,实际上它不绘制任何东西,只是删除窗口的边框.
如果您要返回窗口的边框,在使用我上面发布的代码行之前,请先调用以下代码行:
GetWindowLong(hWnd /*The handle of the window that you want to remove its borders and later return them back to it*/, GWL_STYLE);
Run Code Online (Sandbox Code Playgroud)
但是当然这个函数会返回窗口的样式,所以创建将保留这些样式的新变量,即将此变量设置为该函数的返回值.
然后你使用SetWindowLong
我上面显示的方法来删除它的边框,当你想稍后恢复它的边框时,再次回想一下SetWindowLong
,前两个参数是相同的(hWnd和GWL_STYLE),但第三个参数是窗口的样式从...返回GetWindowLong
.如果您不想调用GetWindowLong
,但仍然返回窗口的边框,那么您可以使用SetWindowLong
相同的前两个参数,而在第三个参数中,您可以使用以下之一:WS_OVERLAPPED
或/和WS_OVERLAPPEDWINDOW
/和WS_SIZEFRAME
.
注:如果您尝试我的答案,但它不为你工作,这样就可以了,因为这两个功能SetWindowLong
,并GetWindowLong
已经被取代和不为你工作,是因为他们是兼容只有 32位版本的Windows.也许你正在使用64位版本的Windows,然后使用SetWindowLongPtr
和GetWindowLongPtr
替代,这是兼容两种 32位和64位 Windows版本.MSDN在Note部分中告知了这些函数.只需在该网站中搜索它们即可.以下是他们的链接:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ ms633584(v = vs.85)的.aspx
希望这一切都能回答你的问题.
归档时间: |
|
查看次数: |
56664 次 |
最近记录: |