【问题标题】:display obscured control on bitmap在位图上显示模糊控件
【发布时间】:2012-03-24 06:32:31
【问题描述】:

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

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

这是定期保存应用程序屏幕图像的一部分,以防您想知道如何隐藏滚动条。我不想将滚动条的父级放在前面。

在这些条件下我是否可以得到滚动条的真实图像?

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

【问题讨论】:

    标签: windows api gdi


    【解决方案1】:

    我发现即使控件被遮挡或不在屏幕上,以下内容似乎也能正常工作。从控件创建一个 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);
    

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2014-11-06
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2017-11-23
      相关资源
      最近更新 更多