我有一个位图的HDC = hdc,一个逻辑坐标在hdc中的矩形R,以及由CreateWindow用SBS_HORZ创建的滚动控件的HWND = hwnd。滚动控件是另一个窗口的子项。我想在矩形R中的位图上显示滚动控件。
我为滚动控件获取了一个HDC,并使用BitBlt将控件复制到矩形。如果整个滚动控件在它的父级中可见,但是如果滚动条被遮挡,那么一切都很好用,我得到了条形图的顶部。如果控件不在屏幕上,我什么也得不到。
这是定期保存应用程序的屏幕图像的一部分,以防您想知道滚动条是如何被遮挡的。我不想把滚动条的父母带到前面。
无论如何我能在这些条件下得到滚动条的真实图像吗?
或者,我可以以某种方式制作一个没有显示我可以复制的内容的滚动条吗?我知道所需的所有参数。
答案 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);