Windows界面编程第二篇 半透明窗体
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,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,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,INIT_TRANSPARENT,LWA_ALPHA);
// 设置滑动条变化范围
SendMessage(GetDlgItem(hDlg,IDC_SLIDER_TRANSPARENT),TBM_SETRANGE,(WPARAM)FALSE,MAKELONG(0,255));
// 设置滑块初始位置
SendMessage(GetDlgItem(hDlg,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,TBM_GETPOS,0);
// 设置新透明度
SetLayeredWindowAttributes(hDlg,nTransparent,LWA_ALPHA);
}
break;
case WM_CTLCOLORDLG: //对话框背影
return (BOOL)s_hBitmapBrush;
}
return FALSE;
}
运行结果如下: ? 在本篇文章中我们通过SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用SetLayeredWindowAttributes完成窗体的透明度调节。下面两篇也将使用这两个函数来完成另一个功能——异形窗口(异形窗体)。异形窗口可以使得窗口更加美观,它能灵活的变动窗口的形状。欢迎继续浏览《Windows界面编程 第三篇异形窗体 普通版》和《Windows界面编程 第四篇异形窗体 高富帅版》 ? ? ? 本文配套程序下载地址为:hhttp://download.csdn.net/download/morewindows/4947386 转载请标明出处,原文地址:http://www.voidcn.com/article/p-vgggdjqw-yt.html 欢迎关注微博:http://weibo.com/MoreWindows ? ? ? 再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |