SetLayeredWindowAttributes 设置窗口透明度

SetLayeredWindowAttributes

 编辑

此函数用于设置分层窗口透明度,常和 UpdateLayeredWindow 函数结合使用。

外文名

SetLayeredWindowAttributes

用    于

设置分层窗口透明度

结    合

UpdateLayeredWindow 函数

类    型

VB申明,C++申明

目录

  1. 声明
  2. ▪ VB申明:
  3. ▪ C++申明:
  4. 创建透明窗口
  5. VC6.0调用
  6. C++ 宏值定义

声明

编辑

VB申明:

Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

C++申明:

BOOL SetLayeredWindowAttributes(

HWND hwnd, // 指定分层窗口句柄

COLORREF crKey, // 指定需要透明的背景颜色值,可用RGB()宏

BYTE bAlpha, // 设置透明度,0表示完全透明,255表示不透明

DWORD dwFlags // 透明方式

);

其中,dwFlags参数可取以下值:

LWA_ALPHA时:crKey参数无效,bAlpha参数有效;

LWA_COLORKEY:窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。其常量值为1。

LWA_ALPHA | LWA_COLORKEY:crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。

创建透明窗口

编辑

要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性,方法可以在CreateWindowEx时指定,也可以SetWindowLong动态设置。如下代码可设置分层窗口:

LONG t = GetWindowLong(m_hWnd, GWL_EXSTYLE);

t |= WS_EX_LAYERED;

SetWindowLong(m_hWnd, GWL_EXSTYLE, t);

VC6.0调用

编辑

此函数在VC6.0中没有声明,需要自定义后在user32.dll后动态获取地址后调用。在VC9.0(VS2008)及其之后版本中可以直接调用

动态调用user32.dll中的SetLayeredWindowAttributes函数

typedef BOOL (FAR WINAPI *LAYERFUNC)(HWND,COLORREF,BYTE,DWORD);

BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags)

{

LAYERFUNC SetLayer;

HMODULE hmod = LoadLibrary("user32.dll");

SetLayer=(LAYERFUNC)GetProcAddress(hmod,"SetLayeredWindowAttributes");

BOOL bReturn = SetLayer(hwnd,crKey,bAlpha,dwFlags);

FreeLibrary(hmod);

return bReturn;

}

C++ 宏值定义

编辑

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

#define LWA_COLORKEY 0x00000001

#define LWA_ALPHA 0x00000002

	SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ 0x80000);
	HINSTANCE  hInst = LoadLibraryA("User32.DLL");
	if (hInst != NULL)
	{
		typedef BOOL(WINAPI *MYFUNC)(HWND, COLORREF, BYTE, DWORD);
		
		MYFUNC pFunc = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
		if (pFunc != NULL)
		{
			pFunc(m_hWnd, RGB(255,255,255), 0, 1);
		}
		FreeLibrary(hInst);
		hInst = NULL;
	}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 `SetLayeredWindowAttributes` 函数将窗口设置为半透明的示例代码: ```c++ #include <Windows.h> // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: // 设置窗口样式为 WS_EX_LAYERED 扩展样式 SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); // 设置窗口为半透明 SetLayeredWindowAttributes(hwnd, 0, 128, LWA_ALPHA); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } // 程序入口函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASS wc = { 0 }; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = L"TransparentWindow"; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindowEx(WS_EX_LAYERED, L"TransparentWindow", L"Transparent Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); if (hwnd == NULL) { return 0; } // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } ``` 在这个示例代码中,我们创建了一个名为 `TransparentWindow` 的窗口,并将其样式设置为 `WS_EX_LAYERED` 扩展样式,以便使用 `SetLayeredWindowAttributes` 函数来设置窗口透明度。在窗口创建时,我们调用了 `SetLayeredWindowAttributes` 函数,将窗口的 Alpha 值设置为 128,从而使窗口半透明。需要注意的是,我们在 `SetLayeredWindowAttributes` 函数中指定的第一个参数为 0,表示对整个窗口进行操作。 当窗口收到 `WM_DESTROY` 消息时,我们使用 `PostQuitMessage` 函数将一个退出消息发送到消息队列,并在消息循环中退出程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值