放大镜窗口应该是一个子窗口。因此它需要一个宿主父窗口。MSDN 上的示例代码显示了如何做到这一点:
BOOL CreateMagnifier(HINSTANCE hInstance)
{
// Register the host window class.
WNDCLASSEX wcex = {};
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = HostWndProc;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
wcex.lpszClassName = WindowClassName;
if (RegisterClassEx(&wcex) == 0)
return FALSE;
// Create the host window.
hwndHost = CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT,
WindowClassName, WindowTitle,
WS_CLIPCHILDREN,
0, 0, 0, 0,
NULL, NULL, hInstance, NULL);
if (!hwndHost)
{
return FALSE;
}
// Make the window opaque.
SetLayeredWindowAttributes(hwndHost, 0, 255, LWA_ALPHA);
// Create a magnifier control that fills the client area.
hwndMag = CreateWindow(WC_MAGNIFIER, TEXT("MagnifierWindow"),
WS_CHILD | MS_SHOWMAGNIFIEDCURSOR | WS_VISIBLE,
0, 0,
LENS_WIDTH,
LENS_HEIGHT,
hwndHost, NULL, hInstance, NULL );
if (!hwndMag)
{
return FALSE;
}
return TRUE;
}
同样的文档还说:
放大镜控件必须托管在使用 WS_EX_LAYERED 扩展样式创建的窗口中。创建宿主窗口后,调用 SetLayeredWindowAttributes 设置宿主窗口的不透明度。主机窗口通常设置为完全不透明,以防止显示底层屏幕内容。以下示例显示如何将主机窗口设置为完全不透明:
SetLayeredWindowAttributes(hwndHost, NULL, 255, LWA_ALPHA);
如果将 WS_EX_TRANSPARENT 样式应用于宿主窗口,则鼠标单击将传递到宿主窗口后面鼠标光标位置处的任何对象。请注意,由于主机窗口不处理鼠标点击,用户将无法使用鼠标移动或调整放大窗口的大小。
上面的 MSDN 示例说明了这一点。您链接到的 CodeProject 文章也遵守这些规则。你也必须这样做。