目前共有9篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:台灣正體▼
 
點擊 回復
1055 8
【窗口程序】Win32全透明Aero窗口
一派掌門 二十級
1樓 發表于:2016-3-9 10:10
一派掌門 二十級
2樓 發表于:2016-3-9 10:11
【C++代碼】
#include <Dwmapi.h>
#include <tchar.h>
#include <Windows.h>
#include <Commctrl.h>

#define TRANSPARENT_COLOR RGB(0, 0, 0)

#pragma comment(lib, "Comctl32.lib")
#pragma comment(lib, "Dwmapi.lib")

#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    MARGINS margins = {-1};

    switch (uMsg)
    {
    case WM_CREATE:
        DwmExtendFrameIntoClientArea(hWnd, &margins);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return FALSE;
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hbrBackground = CreateSolidBrush(TRANSPARENT_COLOR);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    LoadIconMetric(NULL, IDI_APPLICATION, LIM_SMALL, &wcex.hIconSm);
    wcex.hInstance = hInstance;
    wcex.lpfnWndProc = WndProc;
    wcex.lpszClassName = TEXT("MainWindow");
    wcex.lpszMenuName = NULL;
    wcex.style = NULL;
    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindow(wcex.lpszClassName, TEXT("My Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    if (!hWnd)
        return 1;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
一派掌門 二十級
3樓 發表于:2016-3-9 12:54
默認的透明色是黑色,可以用下面的方法更換成其他顏色。
【更換透明色的方法】
#include <Dwmapi.h>
#include <tchar.h>
#include <Windows.h>
#include <Commctrl.h>

#define TRANSPARENT_COLOR RGB(122, 122, 222) // 新的透明色

#pragma comment(lib, "Comctl32.lib")
#pragma comment(lib, "Dwmapi.lib")

#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    MARGINS margins = {-1};

    switch (uMsg)
    {
    case WM_CREATE:
        SetLayeredWindowAttributes(hWnd, TRANSPARENT_COLOR, 0, LWA_COLORKEY); // 設置透明色
        DwmExtendFrameIntoClientArea(hWnd, &margins);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return FALSE;
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hbrBackground = CreateSolidBrush(TRANSPARENT_COLOR); // 默認用透明色填充客戶區
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    LoadIconMetric(NULL, IDI_APPLICATION, LIM_SMALL, &wcex.hIconSm);
    wcex.hInstance = hInstance;
    wcex.lpfnWndProc = WndProc;
    wcex.lpszClassName = TEXT("MainWindow");
    wcex.lpszMenuName = NULL;
    wcex.style = NULL;
    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindowEx(WS_EX_LAYERED, wcex.lpszClassName, TEXT("My Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); // 添加了擴展樣式WS_EX_LAYERED
    if (!hWnd)
        return 1;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
一派掌門 二十級
4樓 發表于:2016-3-9 12:56
此時,如果注釋掉DwmExtendFrameIntoClientArea(hWnd, &margins);的話,那麼窗口背景就是完全透明的(但是不能點擊窗口下面的內容)
 
一派掌門 二十級
5樓 發表于:2016-3-13 22:16

有一個bug:休眠後喚醒計算機,aero效果消失。
 
一派掌門 二十級
6樓 發表于:2016-3-13 22:16
回復5樓 @巨大八爪鱼 的內容:
有一個bug:休眠後喚醒計算機,aero效果消失。
所以應該加一段處理休眠後喚醒消息的程序,重新執行DwmExtendFrameIntoClientArea(hWnd, &margins);
 
一派掌門 二十級
7樓 發表于:2024-4-3 16:46
我最喜歡這個程序。
 
一派掌門 二十級
8樓 發表于:2024-4-3 16:55
@圓環之理  圓神覺得這個窗口好看不
 
大魔導士 十七級
9樓 發表于:2024-4-3 16:56
回復8樓 @巨大八爪鱼 的內容:
@圓環之理  圓神覺得這個窗口好看不
嗯啊,挺好看滴~
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:1055 回複數:8
評論數: ?
作者:巨大八爪鱼
最後回復:圆环之理
最後回復時間:2024-4-3 16:56
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。