отображать скрытый элемент управления на растровом изображении - PullRequest
0 голосов
/ 06 марта 2012

У меня есть HDC = hdc битовой карты, прямоугольник R с логическими координатами в hdc и HWND = hwnd элемента управления прокруткой, созданного CreateWindow с помощью SBS_HORZ.Элемент прокрутки является дочерним элементом другого окна.Я хочу отобразить элемент управления прокруткой на растровом изображении в прямоугольнике R.

Я получил HDC для элемента управления прокруткой и использовал BitBlt для копирования элемента управления в прямоугольник.Все работает хорошо, если весь родительский элемент прокрутки виден в его родительском элементе, НО, если полоса прокрутки скрыта, я получаю то, что когда-либо находится над панелью.Если элемент управления отключен от экрана, я ничего не получаю.

Это все часть усилий по периодическому сохранению изображения экрана приложения на случай, если вам интересно, как можно скрыть полосу прокрутки.Я не хочу переносить родителя полосы прокрутки на передний план.

Можно ли в любом случае получить истинное изображение полосы прокрутки в этих условиях?

Или, альтернативно, можно ли как-нибудьполоса прокрутки, которая не отображается, чье содержимое я могу скопировать?Я знаю все необходимые параметры.

1 Ответ

0 голосов
/ 07 марта 2012

Я обнаружил, что следующее работает, даже если элемент управления скрыт или находится за пределами экрана. Создайте 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);
...