找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 597|回复: 2

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

[复制链接]

52

主题

62

回帖

0

积分

版主

积分
0
发表于 2013-10-6 22:56:50 | 显示全部楼层 |阅读模式
                  上一篇《Windows界面编程第一篇 位图背景与位图画刷》介绍了通过WM_CTLCOLORDLG消息来来设置对话框的背景以及位图画刷的使用。本篇将介绍动态调节窗体透明度的方法。
    调节窗体透明度可以先使用SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用来SetLayeredWindowAttributes指定窗体的透明度。这样就可以在程序运行时动态的调节窗体的透明度了。
    下面先介绍下SetWindowLongSetLayeredWindowAttributes函数。
SetWindowLong可以用来设置窗口的一些属性,其函数原型如下:
LONGSetWindowLong(
    HWNDhWnd,
    int nIndex,
    LONGdwNewLong

);
第一个参数表示窗口句柄。
第二个参数代表要设置的哪一种值,如GWL_STYLE表示将设置窗口的风格,这个参数还可以取GWL_EXSTYLEGWL_WNDPROCDWL_DLGPROCGWL_HINSTANCEGWL_USERDATA等等。
第三个参数表示要设置的值。
比如要设置对话框也能够可调节窗口大小,可以用:
// 设置对话框大小可调节
SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);
SetLayeredWindowAttributesMSDN上解释如下:

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_HSCROLLWM_VSCROLL来响应消息。

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

[attachment=1111]

在本篇文章中我们通过SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用SetLayeredWindowAttributes完成窗体的透明度调节。下面两篇也将使用这两个函数来完成另一个功能??异形窗口(异形窗体)。异形窗口可以使得窗口更加美观,它能灵活的变动窗口的形状。

本章源代码回复可见!!
[attachment=1112]


1

主题

23

回帖

0

积分

新手上路

积分
0
发表于 2013-10-15 09:14:03 | 显示全部楼层
:                                    

0

主题

7

回帖

0

积分

新手上路

积分
0
发表于 2013-11-22 17:13:06 | 显示全部楼层
看起来很不错.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 14:03 , Processed in 0.076939 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表