之所以想要创建一个透明的窗口是因为想要把qq的登陆界面改成透明的!所以才学习以哈如何创建一个透明的窗口!然而,qq是个还算三个比较大的软件,其功能相对分散,想要对其进行修改还是要费电心思的!
创建透明的窗口用到的主要函数是SetLayeredWindowAttributes
其原型:
================================================================
BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
================================================================
由于这是win2k下新增的函数,参照一篇文章要用用GetModuleHandle()装USER32.DLL 模块并调用GetProcAddress()得到函数SetLayeredWindowAttributes()在User32.dll 中的指针后就可以通过SetLayeredWindowAttributes()函数将窗体设置为半透明了!
另外还要对窗口添加WS_EX_LAYERED 标志位,并在做如下宏定义:
#define WS_EX_LAYERED 0x00080000
程序原码如下:
================================================================
/*-------------------------------------------------*/
/* Create a translucent window */
/* s91 s91.ctgu.cn@gmail.com */
/* 2006.2.1 */
/*-------------------------------------------------*/
#define WS_EX_LAYERED 0x00080000
#include <windows.h>
#include <Winbase.h>
typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
lpfn g_pSetLayeredWindowAttributes;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstanc,
LPSTR lpCmdLine,int nShowCmd)
{
static TCHAR szAppName [] =TEXT ("MY WORK");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
LONG lWindowLong;
HMODULE hUser32;
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("错误"),TEXT("worng"),MB_ICONERROR);
return 0;
}
hwnd = CreateWindow (szAppName,
TEXT("透明窗口!"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
200,
200,
NULL,
NULL,
hInstance,
NULL);
lWindowLong = GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED;
SetWindowLong(hwnd, GWL_EXSTYLE, lWindowLong); /*为窗口添加WS_EX_LAYERED标志位*/
hUser32 = GetModuleHandle(TEXT("USER32.DLL")); /*获得user32.dll的句柄*/
g_pSetLayeredWindowAttributes = (lpfn) GetProcAddress (hUser32,"SetLayeredWindowAttributes"); /*获得SetLayeredWindowAttributes在user32.dll的地址*/
g_pSetLayeredWindowAttributes (hwnd,0,190,2); /*设置窗口的透明属性*/
FreeLibrary(hUser32); /*释放user32.dll*/
ShowWindow (hwnd,nShowCmd);
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)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd,&ps);
GetClientRect (hwnd,&rect);
DrawText (hdc,TEXT("透明窗口!"), -1,&rect,
DT_SINGLELINE |DT_CENTER | DT_VCENTER);
EndPaint (hwnd,&ps);
return 0;
case WM_LBUTTONDOWN:
MessageBox (NULL,TEXT("*^_^*"),TEXT("透明窗口"),0);
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd,message,wParam,lParam);
}
================================================================