zoukankan      html  css  js  c++  java
  • windows笔记API实现透明窗体

    win7的透明的透明效果看起来炫吧 ^_-。

    其实用简单的系统API就可以实现了。如下:

    SetLayeredWindowAttributes:

    BOOL SetLayeredWindowAttributes(
                      HWND hwnd,      // 透明窗体的句柄
                      COLORREF crKey, // 掩码的颜色
                      BYTE bAlpha,    // 不透明度
                      DWORD dwFlags   // 透明方式
                      );

    dwFlags :
    当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效。
    当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。

    也可以取两个值的组合:LWA_ALPHA | LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。

    WS_EX_LAYERED

    要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性。

        LONG nRet = ::GetWindowLong(hWnd, GWL_EXSTYLE);
        nRet = nRet | WS_EX_LAYERED;
        ::SetWindowLong(hWnd, GWL_EXSTYLE, nRet);

    例子:

    // ------------------------------------------------------------------------- 
    //    文件名        :    WinMain.cpp
    //    创建者        :    方煜宽
    //    邮箱          :   fangyukuan@gmail.com
    //    功能描述      :    透明窗体
    //
    // -------------------------------------------------------------------------
    #include<windows.h>
    
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    
    const int X0 = 120;
    const int Y0 = 50;
    const int WIDTH = 800;
    const int HEIGHT = 600;
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nShowCmd)
    {
        HWND hWnd;
        MSG msg;
        TCHAR lpszClassName[] = TEXT("窗口");
    
        WNDCLASS wc;
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = WndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInstance;
        wc.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
        wc.hCursor = ::LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName = NULL;
        wc.lpszClassName = lpszClassName;
    
        RegisterClass(&wc);
    
        hWnd = CreateWindow(lpszClassName,
            TEXT("Windows"),
            WS_OVERLAPPEDWINDOW,
            X0, Y0, WIDTH, HEIGHT,
            NULL,
            NULL,
            hInstance,
            NULL);
    
        ::ShowWindow(hWnd, SW_SHOWNORMAL);
        ::UpdateWindow(hWnd);
    
        // 实现透明必须设置WS_EX_LAYERED标志
        LONG nRet = ::GetWindowLong(hWnd, GWL_EXSTYLE);
        nRet = nRet | WS_EX_LAYERED;
        ::SetWindowLong(hWnd, GWL_EXSTYLE, nRet);
    
        while(::GetMessage(&msg, NULL, 0, 0))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd,
                            UINT msg,
                            WPARAM wParam,
                            LPARAM lParam)
    {
        switch(msg)
        {
        case WM_LBUTTONDOWN:
            {
                ::MessageBeep(0); 
                ::SetLayeredWindowAttributes(hWnd, 0, 123, LWA_ALPHA);    // 设置半透明
            }
            break;
        case WM_RBUTTONDOWN:
            {
                ::MessageBeep(0); 
                ::SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);    // 设置不透明
            }
            break;
        case WM_DESTROY:
            ::PostQuitMessage(0);
            break;
        default:
            return ::DefWindowProc(hWnd, msg, wParam, lParam);
        }
        return 0;
    }

    效果:

    参考资料:http://baike.baidu.com/view/1329156.htm

    本文地址:http://www.cnblogs.com/fangyukuan/archive/2012/04/18/2454660.html 

  • 相关阅读:
    获取Delphi焦点位置的方法,及所在的控件、以及如何通过控件名称访问控件并赋值
    常用自定义函数
    Delphi编程SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法
    throw new Error() 真实的用法和throw error 的却别
    分别基于和不基于unittest单元测试框架对一个加法做单元测试
    PAT 甲级 1073 Scientific Notation (20 分) (根据科学计数法写出数)
    python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承...
    第一章 概述
    python flask框架学习(三)——豆瓣微信小程序案例
    python flask框架学习——开启debug模式
  • 原文地址:https://www.cnblogs.com/fangyukuan/p/2454660.html
Copyright © 2011-2022 走看看