• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Woosa

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Windows界面编程第二篇 半透明窗体

Windows界面编程第二篇半透明窗体

    上一篇《Windows界面编程第一篇 位图背景与位图画刷》介绍了通过WM_CTLCOLORDLG消息来来设置对话框的背景以及位图画刷的使用。本篇将介绍动态调节窗体透明度的方法。

    调节窗体透明度可以先使用SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用来SetLayeredWindowAttributes指定窗体的透明度。这样就可以在程序运行时动态的调节窗体的透明度了。

    下面先介绍下SetWindowLong和SetLayeredWindowAttributes函数。

SetWindowLong可以用来设置窗口的一些属性,其函数原型如下:

LONGSetWindowLong(

    HWNDhWnd,

    intnIndex,

    LONGdwNewLong

);

第一个参数表示窗口句柄。

第二个参数代表要设置的哪一种值,如GWL_STYLE表示将设置窗口的风格,这个参数还可以取GWL_EXSTYLE,GWL_WNDPROC,DWL_DLGPROC,GWL_HINSTANCE,GWL_USERDATA等等。

第三个参数表示要设置的值。

比如要设置对话框也能够可调节窗口大小,可以用:

//设置对话框大小可调节

SetWindowLong(hDlg,GWL_STYLE, GetWindowLong(hDlg,GWL_STYLE) | WS_SIZEBOX);

SetLayeredWindowAttributes在MSDN上解释如下:

The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.

其函数原型为:

BOOLSetLayeredWindowAttributes(

    HWNDhwnd,

    COLORREFcrKey,

    BYTEbAlpha,

    DWORDdwFlags

);

第一个参数表示窗口句柄。

第二个参数表示透明色。

第三个参数表示透明度。

第四个参数表示函数将完成什么样的功能,设置成LWA_COLORKEY表示为窗口指定了透明色,设置成LWA_ALPHA表示将调整窗口的透明度,可以同时设置这两种功能。

程序代码还将用到Slider控件,这种控件可以有如下操作:

1.通过SendMessage+ TBM_SETRANGE来设置滑块变化的范围。

2.通过SendMessage+ TBM_SETPOS来设置滑块当前位置。

3.通过SendMessage+ TBM_GETPOS来获得滑块当前位置。

4.当滑块位置发生变化时,在其父窗口中通过WM_HSCROLL或WM_VSCROLL来响应消息。

下面给出完整的源代码(下载地址:http://download.csdn.net/download/morewindows/4947386)

[cpp]view plaincopyprint?
  1. // 可变透明度窗体 先加上WS_EX_LAYERED属性再SetLayeredWindowAttributes设置透明度 
  2. //By MoreWindows-(http://blog.csdn.net/MoreWindows) 
  3. #include <windows.h> 
  4. #include <commctrl.h> 
  5. #include "resource.h" 
  6. constchar szDlgTitle[] = "可变透明度窗体 MoreWindows-(http://blog.csdn.net/MoreWindows)"; 
  7. // 对话框消息处理函数 
  8. BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam); 
  9.  
  10. int APIENTRY WinMain(HINSTANCE hInstance, 
  11.                     HINSTANCE hPrevInstance, 
  12.                      LPSTR     lpCmdLine, 
  13.                     int       nCmdShow) 
  14. { 
  15.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); 
  16.     return 0; 
  17. } 
  18.  
  19.  
  20. BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam) 
  21. { 
  22.     constint INIT_TRANSPARENT = 200; //窗体初始透明度 
  23.     static HBRUSH    s_hBitmapBrush;//位图画刷 
  24.  
  25.     switch (message) 
  26.     { 
  27.     case WM_INITDIALOG: 
  28.         // 设置对话框标题 
  29.         SetWindowText(hDlg, szDlgTitle); 
  30.  
  31.         // 加载背影图片 
  32.         HBITMAP hBitmap; 
  33.         hBitmap = (HBITMAP)LoadImage(NULL,"005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); 
  34.         if (hBitmap == NULL) 
  35.         { 
  36.             MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR); 
  37.             exit(0); 
  38.         }        
  39.  
  40.         // 创建位图画刷 
  41.         s_hBitmapBrush = CreatePatternBrush(hBitmap); 
  42.  
  43.         // 设置分层属性 
  44.         SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED); 
  45.         // 设置透明度 0 - completely transparent   255 - opaque 
  46.         SetLayeredWindowAttributes(hDlg, 0, INIT_TRANSPARENT, LWA_ALPHA); 
  47.  
  48.         // 设置滑动条变化范围 
  49.         SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETRANGE, (WPARAM)FALSE, MAKELONG(0, 255)); 
  50.         // 设置滑块初始位置 
  51.         SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETPOS, (WPARAM)TRUE, INIT_TRANSPARENT); 
  52.         return 0; 
  53.  
  54.  
  55.     case WM_COMMAND: 
  56.         switch (LOWORD(wParam)) 
  57.         { 
  58.         case IDCANCEL: 
  59.             DeleteObject(s_hBitmapBrush); 
  60.             EndDialog(hDlg, LOWORD(wParam)); 
  61.             return TRUE; 
  62.         } 
  63.         break; 
  64.  
  65.  
  66.     case WM_HSCROLL:// slider control 滑块位置有变化时的响应函数 
  67.         { 
  68.             // 获取当前滑块位置 
  69.             int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0);  
  70.             // 设置新透明度 
  71.             SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA); 
  72.         } 
  73.         break; 
  74.  
  75.  
  76.     case WM_CTLCOLORDLG: //对话框背影 
  77.         return (BOOL)s_hBitmapBrush; 
  78.     } 
  79.     return FALSE; 
  80. } 
// 可变透明度窗体 先加上WS_EX_LAYERED属性再SetLayeredWindowAttributes设置透明度
//By MoreWindows-(http://blog.csdn.net/MoreWindows)
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
const char szDlgTitle[] = "可变透明度窗体 MoreWindows-(http://blog.csdn.net/MoreWindows)";
// 对话框消息处理函数
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR     lpCmdLine,
					 int       nCmdShow)
{
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
	return 0;
}


BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	const int INIT_TRANSPARENT = 200; //窗体初始透明度
	static HBRUSH    s_hBitmapBrush; //位图画刷

	switch (message)
	{
	case WM_INITDIALOG:
		// 设置对话框标题
		SetWindowText(hDlg, szDlgTitle);

		// 加载背影图片
		HBITMAP hBitmap;
		hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
		if (hBitmap == NULL)
		{
			MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);
			exit(0);
		}		

		// 创建位图画刷
		s_hBitmapBrush = CreatePatternBrush(hBitmap);

		// 设置分层属性
		SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED);
		// 设置透明度 0 - completely transparent   255 - opaque
		SetLayeredWindowAttributes(hDlg, 0, INIT_TRANSPARENT, LWA_ALPHA);

		// 设置滑动条变化范围
		SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETRANGE, (WPARAM)FALSE, MAKELONG(0, 255));
		// 设置滑块初始位置
		SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETPOS, (WPARAM)TRUE, INIT_TRANSPARENT);
		return 0;


	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDCANCEL:
			DeleteObject(s_hBitmapBrush);
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		break;


	case WM_HSCROLL: // slider control 滑块位置有变化时的响应函数
		{
			// 获取当前滑块位置
			int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0); 
			// 设置新透明度
			SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA);
		}
		break;


	case WM_CTLCOLORDLG:  //对话框背影
		return (BOOL)s_hBitmapBrush;
	}
	return FALSE;
}

运行结果如下:

在本篇文章中我们通过SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用SetLayeredWindowAttributes完成窗体的透明度调节。下面两篇也将使用这两个函数来完成另一个功能——异形窗口(异形窗体)。异形窗口可以使得窗口更加美观,它能灵活的变动窗口的形状。欢迎继续浏览《Windows界面编程 第三篇异形窗体 普通版》和《Windows界面编程 第四篇异形窗体 高富帅版》

posted on 2013-03-15 20:07  Woosa  阅读(201)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3