显示位图上的模糊控件

时间:2012-03-06 18:13:12

标签: windows api gdi

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

我为滚动控件获取了一个HDC,并使用BitBlt将控件复制到矩形。如果整个滚动控件在它的父级中可见,但是如果滚动条被遮挡,那么一切都很好用,我得到了条形图的顶部。如果控件不在屏幕上,我什么也得不到。

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

无论如何我能在这些条件下得到滚动条的真实图像吗?

或者,我可以以某种方式制作一个没有显示我可以复制的内容的滚动条吗?我知道所需的所有参数。

1 个答案:

答案 0 :(得分:0)

我发现即使控件被遮挡或脱离屏幕,以下似乎也能正常工作。从控件创建DC和兼容的位图。向控件发送一条WM_PRINT消息,要求它在DC / Bitmap中打印自己。然后使用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);