如何创build不透明内容的完全透明的窗口?

我试过这个:

#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; } 

它创build的窗口看上去是透明的,因为它与屏幕上显示的一样,但移动窗口主窗口背景保持不变。 我想问问,问题可能在哪里。

PS它只是testing代码,所以,请不要写不适合我的问题的意见。

谢谢。

编辑:我想这是因为我要为不知道如何做一些东西的用户做一些帮手。 结果应该是像某些程序视图一样定期标出来的点,什么意思是按这里,什么时候在这里,那么在这里等等。

我认为你的出发点应该是在分层的Windows上看看

http://msdn.microsoft.com/en-us/library/ms997507.aspx

这是玩自定义形状和(半)透明窗口最常见的方式。

UPD。 还有用于制作自定义窗口的旧API:

 int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw );