zoukankan      html  css  js  c++  java
  • Windows界面编程第二篇 半透明窗体

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

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

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

        下面先介绍下SetWindowLongSetLayeredWindowAttributes函数。

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

    LONGSetWindowLong(

        HWNDhWnd,

        intnIndex,

        LONGdwNewLong

    );

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

    第二个参数代表要设置的哪一种值,如GWL_STYLE表示将设置窗口的风格,这个参数还可以取GWL_EXSTYLEGWL_WNDPROCDWL_DLGPROCGWL_HINSTANCEGWL_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_HSCROLLWM_VSCROLL来响应消息。

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

    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.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); 
    15.     return 0; 
    16.  
    17.  
    18. BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam) 
    19.     constint INIT_TRANSPARENT = 200; //窗体初始透明度 
    20.     static HBRUSH    s_hBitmapBrush;//位图画刷 
    21.  
    22.     switch (message) 
    23.     { 
    24.     case WM_INITDIALOG: 
    25.         // 设置对话框标题 
    26.         SetWindowText(hDlg, szDlgTitle); 
    27.  
    28.         // 加载背影图片 
    29.         HBITMAP hBitmap; 
    30.         hBitmap = (HBITMAP)LoadImage(NULL,"005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); 
    31.         if (hBitmap == NULL) 
    32.         { 
    33.             MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR); 
    34.             exit(0); 
    35.         }        
    36.  
    37.         // 创建位图画刷 
    38.         s_hBitmapBrush = CreatePatternBrush(hBitmap); 
    39.  
    40.         // 设置分层属性 
    41.         SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED); 
    42.         // 设置透明度 0 - completely transparent   255 - opaque 
    43.         SetLayeredWindowAttributes(hDlg, 0, INIT_TRANSPARENT, LWA_ALPHA); 
    44.  
    45.         // 设置滑动条变化范围 
    46.         SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETRANGE, (WPARAM)FALSE, MAKELONG(0, 255)); 
    47.         // 设置滑块初始位置 
    48.         SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETPOS, (WPARAM)TRUE, INIT_TRANSPARENT); 
    49.         return 0; 
    50.  
    51.  
    52.     case WM_COMMAND: 
    53.         switch (LOWORD(wParam)) 
    54.         { 
    55.         case IDCANCEL: 
    56.             DeleteObject(s_hBitmapBrush); 
    57.             EndDialog(hDlg, LOWORD(wParam)); 
    58.             return TRUE; 
    59.         } 
    60.         break
    61.  
    62.  
    63.     case WM_HSCROLL:// slider control 滑块位置有变化时的响应函数 
    64.         { 
    65.             // 获取当前滑块位置 
    66.             int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0);  
    67.             // 设置新透明度 
    68.             SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA); 
    69.         } 
    70.         break
    71.  
    72.  
    73.     case WM_CTLCOLORDLG: //对话框背影 
    74.         return (BOOL)s_hBitmapBrush; 
    75.     } 
    76.     return FALSE; 

    运行结果如下:

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

  • 相关阅读:
    [网络流24题(1/24)] 最小路径覆盖问题(洛谷P2764)
    Codeforces 1082 G(最大权闭合子图)
    bzoj 1497(最大权闭合图/最小割)
    loj 515(bitset优化dp)
    bzoj 3998 (后缀自动机)
    HDU 6071(同余最短路)
    SPOJ COT2 (树上莫队)
    Atcoder Grand Contest 20 C(bitset优化背包)
    hdu 6480-6489 (2018 黑龙江省大学生程序设计竞赛)
    POJ 2594 Treasure Exploration(可重点最小路径覆盖)
  • 原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589197.html
Copyright © 2011-2022 走看看