关于在SetWindowLong函数中使用cbWndExtra的一点总结

感谢chehw的指点:

cbWndExtra其实是在SetWindowLong函数中对应标识GWL_USERDATA的使用

 

wndclass.cbWndExtra = 2*sizeof (long) ;该语句在窗口中额外留了8字节的空间

 

当用SetWindowLong(hwnd,iData,dData)函数设置额外空间中的值时,当iData为0时,是设置额外空间中的前4个字节的值为dData;为1时,是设置后4个字节的值为dData;4个字节为一个单位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UpdateLayeredWindow是Win32 API的一个函数,可以用来在窗口上绘制具有透明度的图像。使用UpdateLayeredWindow需要以下步骤: 1. 创建一个窗口,并设置窗口的样式为WS_EX_LAYERED。 2. 加载要绘制的图像,并将其转换为位图数据。 3. 使用CreateCompatibleDC函数创建一个兼容的设备上下文。 4. 使用CreateCompatibleBitmap函数创建一个兼容的位图。 5. 使用SelectObject函数将位图选入设备上下文。 6. 使用BitBlt函数将图像绘制到位图。 7. 使用UpdateLayeredWindow函数将位图绘制到窗口上。 以下是一个简单的示例代码: ```c++ // 定义窗口过程函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); // 加载位图 HBITMAP hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1)); // 获取位图信息 BITMAP bmpInfo; GetObject(hBitmap, sizeof(BITMAP), &bmpInfo); // 创建兼容的设备上下文 HDC hdcBitmap = CreateCompatibleDC(NULL); // 创建兼容的位图 HBITMAP hBitmapNew = CreateCompatibleBitmap(hdcBitmap, bmpInfo.bmWidth, bmpInfo.bmHeight); // 选入位图 HGDIOBJ hOldBitmap = SelectObject(hdcBitmap, hBitmapNew); // 绘制位图 BitBlt(hdcBitmap, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, GetDC(NULL), 0, 0, SRCCOPY); // 更新窗口 POINT ptZero = { 0, 0 }; SIZE szWnd = { bmpInfo.bmWidth, bmpInfo.bmHeight }; BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; UpdateLayeredWindow(hWnd, NULL, NULL, &szWnd, hdcBitmap, &ptZero, RGB(0, 0, 0), &blend, ULW_ALPHA); // 释放资源 SelectObject(hdcBitmap, hOldBitmap); DeleteObject(hBitmap); DeleteObject(hBitmapNew); DeleteDC(hdcBitmap); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // 程序入口函数 int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); if (!RegisterClassEx(&wcex)) { MessageBox(NULL, L"窗口类注册失败!", L"错误", MB_OK | MB_ICONERROR); return 1; } // 创建窗口 hInst = hInstance; HWND hWnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, NULL, NULL, hInstance, NULL); if (!hWnd) { MessageBox(NULL, L"窗口创建失败!", L"错误", MB_OK | MB_ICONERROR); return 1; } // 显示窗口 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值