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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

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

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

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

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

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

LONGSetWindowLong(

    HWNDhWnd,

    int nIndex,

    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

// 可变透明度窗体 先加上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 0case WM_COMMAND:  switch (LOWORD(wParam))  {  case IDCANCEL:   DeleteObject(s_hBitmapBrush);   EndDialog(hDlg, LOWORD(wParam));   return TRUE;  }  breakcase WM_HSCROLL: // slider control 滑块位置有变化时的响应函数  {   // 获取当前滑块位置   int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0);    // 设置新透明度   SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA);  }  breakcase WM_CTLCOLORDLG:  //对话框背影  return (BOOL)s_hBitmapBrush; } return FALSE;}

运行结果如下:

 

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

 

 

本文配套程序下载地址为:hhttp://download.csdn.net/download/morewindows/4947386

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8451632

欢迎关注微博:http://weibo.com/MoreWindows

 

 

 

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值