Windows 在位图上显示模糊控件

Windows 在位图上显示模糊控件,windows,api,gdi,Windows,Api,Gdi,我有一个位图的HDC=HDC,一个在HDC中有逻辑坐标的矩形R,还有一个由CreateWindow和SBS_HORZ创建的滚动控件的HWND=HWND。滚动控件是另一个窗口的子窗口。我想在矩形R中显示位图上的滚动控件 我为scroll控件获得了一个HDC,并使用BitBlt将控件复制到矩形中。如果整个滚动控件在其父控件中可见,则所有操作都可以正常工作,但如果滚动条被遮挡,则会得到位于滚动条顶部的内容。如果控件不在屏幕上,我什么也得不到 这是定期保存应用程序屏幕图像的全部工作的一部分,以防您想知道

我有一个位图的HDC=HDC,一个在HDC中有逻辑坐标的矩形R,还有一个由CreateWindow和SBS_HORZ创建的滚动控件的HWND=HWND。滚动控件是另一个窗口的子窗口。我想在矩形R中显示位图上的滚动控件

我为scroll控件获得了一个HDC,并使用BitBlt将控件复制到矩形中。如果整个滚动控件在其父控件中可见,则所有操作都可以正常工作,但如果滚动条被遮挡,则会得到位于滚动条顶部的内容。如果控件不在屏幕上,我什么也得不到

这是定期保存应用程序屏幕图像的全部工作的一部分,以防您想知道滚动条是如何被遮挡的。我不想将滚动条的父项带到前面

在这种情况下,我能得到滚动条的真实图像吗


或者,我可以制作一个没有显示的滚动条,我可以复制谁的内容?我确实知道所需的所有参数。

我发现,即使控件被遮挡或不在屏幕上,下列参数似乎也能工作。从控件创建DC和兼容位图。向控件发送WM_打印消息,要求其在DC/位图中打印自身。然后使用BitBlt复制位图

很难看!有更好的办法吗

像这样的

            HDC                 hdcScroll;
            WINDOWPLACEMENT     WP;
            HDC                 memdc;
            HBITMAP             membit;

            hdcScroll = GetDC (hwndScroll);
            GetWindowPlacement (hwndScroll, &WP);
            int Height = WP.rcNormalPosition.bottom - WP.rcNormalPosition.top;
            int Width  = WP.rcNormalPosition.right  - WP.rcNormalPosition.left;
            memdc = CreateCompatibleDC(hdcScroll);                          // destination DC
            membit = CreateCompatibleBitmap(hdcScroll, Width, Height);      //  destination bitmap
            HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);  //   add bitmap to DC
            SendMessage (hwndScroll,WM_PRINT,(WPARAM) memdc, PRF_CLIENT);

            BitBlt 
                (hdc,                               // destination HDC
                 rt_scroll.left,                    // dest upper left corner X
                 rt_scroll.top,                     // dest upper left corner Y
                 rt_scroll.right-rt_scroll.left+1,  // width of dest rectangle
                 rt_scroll.bottom-rt_scroll.top+1,  // height of dest rectangle

                 memdc,                             // source HDC
                 0,                                 // source upper left corner X
                 0,                                 // source upper left cornet Y

                 SRCCOPY
                );

            SelectObject(memdc, hOldBitMap);
            DeleteObject (membit);
            DeleteDC (memdc);
            ReleaseDC (hwndScroll, hdcScroll);