Hello,

I'm currently busy making dockable tool windows for my program. I've conceived a "dock server" window that permits its "dock clients" (the tool windows) to become its children, along with another window which is the application workspace. I feel a tree coming on...
Code:
Application Frame Window
              |
         Dock Server-----------------------Undocked Tool Windows
              |                       \
       Workspace Window           Docked Tool Windows
In my indeed infinite wisdom, I decreed that the dock server should be an "invisible" window, i.e. although it has a region that covers the client area of the frame window, it is transparent. With that in mind, I set its extended style to WS_EX_TRANSPARENT.

This works fine until I actually dock a tool window and the workspace window is resized to give the docked window room. Because the frame window's style includes WS_CLIPCHILDREN, it doesn't erase the background underneath its children. This would normally be good (prevents flickering), but for a transparent window...

So, I tried using this in my dock server's WindowProc:-
Code:
case WM_ERASEBKGND:
{
    HRGN hRgn, hrgnChild;
    RECT rc;
    t_dockserver *info;

    hRgn = CreateRectRgn(0, 0, 0, 0);
    // Got update?
    if (GetUpdateRgn(hWnd, hRgn, FALSE) != NULLREGION)
    {
        info = (t_dockserver *)GetWindowLong(hWnd, 0);
        // Do we have a workspace?
        if (info->hwndChild)
        {
            // Clip it from the update region
            GetWindowRect(info->hwndChild, &rc);
            MapWindowPoints(NULL, hWnd, (LPPOINT)&rc, 2);
            hrgnChild = CreateRectRgnIndirect(&rc);
            CombineRgn(hRgn, hRgn, hrgnChild, RGN_DIFF);
        }

        // Redraw this bit please
        InvalidateRgn(GetParent(hWnd), hRgn, TRUE);
    }

    DeleteObject(hRgn);
    return TRUE;
}
This doesn't quite work, however. Any ideas?