我试过这个:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
case WM_MOVE:
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
return 0;
}
case WM_CTLCOLORSTATIC:
{
HDC hdc = (HDC) wParam;
SetBkMode (hdc, TRANSPARENT);
return (LRESULT)(GetStockObject(NULL_BRUSH));
}
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int main()
{
WNDCLASSEX wc;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = NULL;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)(GetStockObject(NULL_BRUSH));
wc.lpszMenuName = NULL;
wc.lpszClassName = L"MY CLASS";
wc.hIconSm = NULL;
RegisterClassEx(&wc);
HWND hwnd = CreateWindowEx(0, L"MY CLASS", NULL, WS_VISIBLE, 0, 0, 640, 480, NULL, NULL, NULL, NULL);
HWND child = CreateWindowEx(0, L"STATIC", L"Text", WS_VISIBLE | WS_CHILD , 50, 50, 50, 50, hwnd, NULL, NULL, NULL);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
它创建的窗口看起来是透明的,因为它显示的内容与屏幕上的相同,但是移动窗口后主窗口背景保持不变。我想问一下,问题可能出在哪里。
附言这只是测试代码,所以请不要写不适合我的问题的建议。
谢谢。
编辑:我想要这个是因为我将为不知道如何做某些事情的用户制作一些帮助程序。结果应该类似于一些带有标记点的常规程序 View ,这意味着按此处、按此处、按此处等。
最佳答案
我认为你的起点应该是看一下 Layered Windows
http://msdn.microsoft.com/en-us/library/ms997507.aspx
这是玩自定义形状和(半)透明窗口的最常见方式。
更新。还有用于制作自定义形状窗口的旧 API:
int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw );
关于c++ - 如何创建没有透明内容的完全透明窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18677703/