生活随笔
收集整理的這篇文章主要介紹了
VC半透明窗体
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Windows界面編程第二篇 半透明窗體
分類: Windows編程 Windows界面編程 2013-01-07 10:05 9280人閱讀 收藏舉報
SetLayeredWindowAttrWindows界面編程WS_EX_LAYERED半透明窗口透明度調節
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 plaincopy
????#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);????????????????????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:???????????{????????????????????????????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界面編程 第四篇異形窗體 高富帥版》
?
?
本文配套程序下載地址為:hhttp://download.csdn.net/download/morewindows/4947386
轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/8451632
歡迎關注微博:http://weibo.com/MoreWindows
?
總結
以上是生活随笔為你收集整理的VC半透明窗体的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。