
作者共發了8篇帖子。
![]() |
![]() |
![]() |
【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; } |
![]() |
默認的透明色是黑色,可以用下面的方法更換成其他顏色。
【更換透明色的方法】 #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; } |
![]() |
此時,如果注釋掉DwmExtendFrameIntoClientArea(hWnd, &margins);的話,那麼窗口背景就是完全透明的(但是不能點擊窗口下面的內容)
![]() |
![]() |
![]() 有一個bug:休眠後喚醒計算機,aero效果消失。 |
![]() |
回復5樓 @巨大八爪鱼 的內容:有一個bug:休眠後喚醒計算機,aero效果消失。
![]() 所以應該加一段處理休眠後喚醒消息的程序,重新執行DwmExtendFrameIntoClientArea(hWnd, &margins);
|
![]() |
我最喜歡這個程序。
|
![]() |
@圓環之理 圓神覺得這個窗口好看不
|