2012-03-06 117 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);