您的位置:首页 > 编程语言

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

2013-03-15 20:07 316 查看
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?

// 可变透明度窗体 先加上WS_EX_LAYERED属性再SetLayeredWindowAttributes设置透明度 
//By MoreWindows-(http://blog.csdn.net/MoreWindows) 
#include <windows.h> 
#include <commctrl.h> 
#include "resource.h" 
constchar 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) 


    constint 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; 


// 可变透明度窗体 先加上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界面编程 第四篇异形窗体 高富帅版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Windows界面编程 VC MFC