windowsSDK利用子窗口控件設置窗口透明


在看對話框之前,還是覺得有必要先看一下子窗口控件,很多對話框的知識點都涉及到子窗口控件。

正好看到學長的一篇實現窗口透明化的文章,對它比較感興趣,於是就想拿這個例子來練練手吐舌頭


首先先介紹下窗口透明化的實現:

首先是下面這個函數

LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong);

SetWindowLong該函數改變指定窗口的屬性.函數也將指定的一個32位值設置在窗口的額外存儲空間的指定偏移位置。

 SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_LAYERED);
上面這條代碼擴展了一種窗口風格,其中GWL_EXSTYLE設定一個新的擴展風格

接下來我們就可以使用下面這個函數來實現窗口的透明化:

BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window 透明窗體的句柄
COLORREF crKey, // specifies the color key 顏色值
BYTE bAlpha, // value for the blend function 透明度,取值范圍是[0,255]
DWORD dwFlags // action 透明方式,可以取兩個值:
 );

  當取值為LWA_ALPHA時,crKey參數無效,bAlpha參數有效; 
  當取值為LWA_COLORKEY時,bAlpha參數有效,而窗體中的所有顏色為crKey的地方將變為透明。

其中dwFlags有LWA_ALPHA(值為2)和LWA_COLORKEY(值為1)兩種設置,如果LWA_ALPHA被設置的話,通過bAlpha參數指定窗體的透明度;如果LWA_COLORKEY標志被設置的話,則指定關鍵色為crKey,該顏色所覆蓋的區域將從窗體去除,去除后的區域將不再進行點擊檢測,其他顏色則正常顯示。如果阿爾法混合值設置為0,其窗口區域同樣不進行點擊檢測。

以上這些就是有關窗口透明度實現的方法了,好,現在我結合子窗口控件來具體實現它。代碼如下:

#include <windows.h>

#define ID_EDIT 1 //定義編輯框ID
#define ID_BUTTON 2 //定義確定按鈕ID

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName,
TEXT ("The Hello Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{


static HWND hwndEdit ;
static HWND hwndButton ;
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
TCHAR str[20];
int i;

switch (message)
{
case WM_CREATE:
//產生子窗口控件:編輯框
hwndEdit = CreateWindow (TEXT ("edit"), NULL,
WS_CHILD | WS_VISIBLE |
WS_BORDER | ES_LEFT |
ES_AUTOHSCROLL | ES_AUTOVSCROLL,
0, 0, 0, 0, hwnd, (HMENU) ID_EDIT,
((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
//產生子窗口控件:按鈕
hwndButton = CreateWindow(TEXT("button"),
TEXT("確定"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
100,50,
50,20,
hwnd,(HMENU) ID_BUTTON,
((LPCREATESTRUCT) lParam) -> hInstance, NULL);
//增加窗口樣式
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_LAYERED);
//設置窗口透明度
SetLayeredWindowAttributes(hwnd, RGB(255,255,255), 255, LWA_ALPHA);
return 0 ;

case WM_SETFOCUS :
SetFocus (hwndEdit) ;//設置輸入焦點
return 0 ;

case WM_SIZE ://創建文本框窗口大小
MoveWindow (hwndEdit, 0, 0, LOWORD (lParam)/4, HIWORD (lParam)/16, TRUE) ;
return 0 ;

case WM_COMMAND :
switch (LOWORD (wParam))
case ID_BUTTON://將從編輯框獲得的數值應用到窗口透明度里面去
{
GetDlgItemText(hwnd, ID_EDIT, str, sizeof(str)/sizeof(TCHAR));
i = _wtoi(str);
SetLayeredWindowAttributes(hwnd, RGB(255,255,255), i, LWA_ALPHA);
}
return 0;
return 0;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

在編輯框里輸入0-255的任意數字,點擊確定,窗口就能實現透明化的設置了。

接下來的任務我打算在看完對話框之后再用對話框實現窗口透明的效果,增加滾動條的實現,鼠標的實現,更好地理解和學習對話框微笑

我是一個新手,希望大家能幫我指出錯誤我好加以改正,謝謝~~



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com