我想用SetWindowLong
时间: 2023-06-16 21:05:30 浏览: 46
SetWindowLong是一个Windows API函数,用于设置窗口的属性,例如窗口风格、扩展风格、窗口过程等。它可以用于在运行时修改窗口的属性,以实现一些高级的窗口操作,如窗口拖动、绘制等。
以下是SetWindowLong的函数原型:
```
LONG SetWindowLong(
HWND hWnd, // 窗口句柄
int nIndex, // 窗口属性索引
LONG dwNewLong // 新的属性值
);
```
其中,hWnd是要设置属性的窗口句柄,nIndex是属性索引,dwNewLong是新的属性值。属性索引是一个整数值,用于指定要设置的属性类型。例如,如果要设置窗口风格,可以将nIndex设置为GWL_STYLE;如果要设置窗口过程,可以将nIndex设置为GWL_WNDPROC。
需要注意的是,SetWindowLong在64位Windows系统上已经被淘汰,取而代之的是SetWindowLongPtr函数。这两个函数的区别在于返回值类型不同,SetWindowLong返回一个LONG类型的值,而SetWindowLongPtr返回一个LONG_PTR类型的值,用于适应64位系统的地址长度。
相关问题
SetWindowLong参数
SetWindowLong函数是Windows操作系统中的一个API函数,用于修改窗口的属性。它的参数包括:
1. hWnd:要修改属性的窗口句柄。
2. nIndex:指定要修改的窗口属性索引。
3. dwNewLong:指定新的属性值。
4. 返回值:如果函数调用成功,则返回指定窗口属性的先前值;如果调用失败,则返回0。
需要注意的是,SetWindowLong函数已经被微软官方弃用,推荐使用SetWindowLongPtr函数来替代。
用SetWindowLong给无边框窗口增加边框
您可以使用SetWindowLong函数来给无边窗口增加边框。以下是一个示例代码:
```cpp
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_NCCALCSIZE:
{
// 获取窗口的边框尺寸
NCCALCSIZE_PARAMS* params = reinterpret_cast<NCCALCSIZE_PARAMS*>(lParam);
params->rgrc[0].left += 4;
params->rgrc[0].top += 4;
params->rgrc[0].right -= 4;
params->rgrc[0].bottom -= 4;
return 0;
}
case WM_NCHITTEST:
{
// 设置鼠标在窗口边框上时显示调整大小的光标
LRESULT hit = DefWindowProc(hwnd, msg, wParam, lParam);
if (hit == HTCLIENT)
return HTBORDER;
else
return hit;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int main()
{
// 创建窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX) };
wc.lpfnWndProc = WndProc;
wc.hInstance = GetModuleHandle(nullptr);
wc.lpszClassName = L"BorderWindow";
// 注册窗口类
RegisterClassEx(&wc);
// 创建窗口
HWND hwnd = CreateWindowEx(
0,
L"BorderWindow",
L"无边框窗口",
WS_POPUP | WS_VISIBLE,
100,
100,
400,
300,
nullptr,
nullptr,
GetModuleHandle(nullptr),
nullptr);
// 设置窗口样式
LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);
SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_BORDER);
// 消息循环
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return static_cast<int>(msg.wParam);
}
```
在上述代码中,我们通过在窗口过程(WndProc)中处理WM_NCCALCSIZE和WM_NCHITTEST消息来实现给无边框窗口增加边框的效果。在WM_NCCALCSIZE消息中,我们修改窗口的边框尺寸,使得客户区(即窗口的工作区域)相应地减小。在WM_NCHITTEST消息中,我们设置鼠标在窗口边框上时显示调整大小的光标。
请注意,以上代码仅为示例,您可能需要根据自己的需求进行适当的修改。