LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static HDC hdc[2], hmdc[2]; static HBITMAP hbmp = NULL; HBITMAP pre; static RECT rc; POINT p; switch (msg) { case WM_CREATE: hdc[0] = GetDC(hWnd); hdc[1] = GetDC(NULL); hmdc[0] = CreateCompatibleDC(hdc[0]); hmdc[1] = CreateCompatibleDC(hdc[1]); SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE)|WS_EX_LAYERED); SetLayeredWindowAttributes(hWnd, 0, 0xFF, LWA_ALPHA); break; case WM_LBUTTONDOWN: GetClientRect(hWnd, &rc); p.x = rc.left; p.y = rc.top; ClientToScreen(hWnd, &p); SetLayeredWindowAttributes(hWnd, 0, 0x00, LWA_ALPHA); if (hbmp!=NULL) { SelectObject(hmdc[1], pre); DeleteObject(hbmp); } hbmp = CreateCompatibleBitmap(hdc[1], rc.right, rc.bottom); pre = (HBITMAP)SelectObject(hmdc[1], hbmp); BitBlt(hmdc[1], 0, 0, rc.right, rc.bottom, hdc[1], p.x, p.y, SRCCOPY); SelectObject(hmdc[1], pre); SelectObject(hmdc[0], hbmp); SetLayeredWindowAttributes(hWnd, 0, 0xFF, LWA_ALPHA); InvalidateRect(hWnd, NULL, FALSE); break; case WM_PAINT: if (hbmp!=NULL) BitBlt(hdc[0], 0, 0, rc.right, rc.bottom, hmdc[0], 0, 0, SRCCOPY); break; case WM_CLOSE: DeleteObject(hbmp); SelectObject(hmdc[0], pre); DeleteDC(hmdc[1]); DeleteDC(hmdc[0]); ReleaseDC(NULL, hdc[1]); ReleaseDC(hWnd, hdc[0]); DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wp, lp); }