2012-03-06 87 views
0

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

我获得了滚动控件的HDC,并使用BitBlt将控件复制到矩形中。如果整个滚动控件在其父窗口中都可见,所有的效果都很好,但是如果滚动条被遮住了,我可以看到任何东西在酒吧的顶部。如果控制不在屏幕上,我什么也得不到。

这是所有努力的一部分,定期保存应用程序的屏幕图像,以防止您想知道滚动条如何被遮挡。我不想将滚动条的父项放在前面。

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

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

回答

0

我发现以下似乎工作,即使控制被遮挡或关闭屏幕。从控件创建一个DC和兼容的位图。向控件发送一条WM_PRINT消息,要求它在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);