创建透明窗口


    之所以想要创建一个透明的窗口是因为想要把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);
}

================================================================

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值