C++ 如何在win32 c+中复制窗口的可视内容并将其放在新窗口上+;?
我读过一些关于GetDIBits或BitBlt的文章,但我不理解它们C++ 如何在win32 c+中复制窗口的可视内容并将其放在新窗口上+;?,c++,windows,winapi,win32gui,C++,Windows,Winapi,Win32gui,我读过一些关于GetDIBits或BitBlt的文章,但我不理解它们 这可能是因为我不明白Windows实际上是如何处理Windows上的图形的。如果有人能把我推荐到一个可以让我了解这些事情的页面,那就太好了!:) 您可能会幸运地向窗口发送消息。对于使用DirectX或OpenGL的windows,这可能无法正常工作 在启用Aero的系统上使用WM_PRINTCLIENT可能会出现一些问题(例如,当DWM处于活动状态时)。如果系统确实激活了DWM,那么它可能会提供访问窗口备份存储的方法,但我以前
这可能是因为我不明白Windows实际上是如何处理Windows上的图形的。如果有人能把我推荐到一个可以让我了解这些事情的页面,那就太好了!:) 您可能会幸运地向窗口发送消息。对于使用DirectX或OpenGL的windows,这可能无法正常工作
在启用Aero的系统上使用WM_PRINTCLIENT可能会出现一些问题(例如,当DWM处于活动状态时)。如果系统确实激活了DWM,那么它可能会提供访问窗口备份存储的方法,但我以前没有深入研究过这样做。您可能会幸运地向窗口发送消息。对于使用DirectX或OpenGL的windows,这可能无法正常工作 在启用Aero的系统上使用WM_PRINTCLIENT可能会出现一些问题(例如,当DWM处于活动状态时)。如果系统确实激活了DWM,那么它可能会提供访问窗口备份存储的方法,但我以前没有深入研究过这样做。您想要的是:
void CopyWndToClipboard(CWnd *pWnd)
{
CBitmap bitmap;
CClientDC dc(pWnd);
CDC memDC;
CRect rect;
memDC.CreateCompatibleDC(&dc);
pWnd->GetWindowRect(rect);
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
pWnd->OpenClipboard() ;
EmptyClipboard() ;
SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle()) ;
CloseClipboard() ;
memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}
您想要的是:
void CopyWndToClipboard(CWnd *pWnd)
{
CBitmap bitmap;
CClientDC dc(pWnd);
CDC memDC;
CRect rect;
memDC.CreateCompatibleDC(&dc);
pWnd->GetWindowRect(rect);
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
pWnd->OpenClipboard() ;
EmptyClipboard() ;
SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle()) ;
CloseClipboard() ;
memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}
我在windows WM_PAINT中使用此代码解决了这个问题。它现在显示与目标窗口完全相同的内容
PAINTSTRUCT ps;
HDC hdc = BeginPaint(MainWindow, &ps);
HDC TargetDC = GetDC(TargetWindow);
RECT rect;
GetWindowRect(TargetWindow, &rect);
BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,TargetDC,0,0,SRCCOPY);
EndPaint(MainWindow, &ps);
我在windows WM_PAINT中使用此代码解决了这个问题。它现在显示与目标窗口完全相同的内容
PAINTSTRUCT ps;
HDC hdc = BeginPaint(MainWindow, &ps);
HDC TargetDC = GetDC(TargetWindow);
RECT rect;
GetWindowRect(TargetWindow, &rect);
BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,TargetDC,0,0,SRCCOPY);
EndPaint(MainWindow, &ps);
嗯,你想做什么?例如,如果我有计算器窗口句柄,我想复制该窗口的所有视觉内容,并复制该窗口的完全相同的副本,但在我的程序制作的另一个窗口句柄中!我认为你需要学习一点gdi。试着看看这个:如果你想要一个没有编辑的完美副本,你可以使用DWM缩略图。那么,你想做什么?例如,如果我有计算器窗口句柄,我想复制该窗口的所有视觉内容,并复制该窗口的完全相同的副本,但在我的程序制作的另一个窗口句柄中!我认为你需要学习一点gdi。试试看这个:如果你想要一个没有编辑的完美拷贝,你可以使用DWM缩略图。谢谢!但我仍然不知道设备上下文(DC)是如何工作的,也不知道如何在WM_PRINTCLIENT消息中使用它们。不过,还是要感谢路上的帮助!您不需要真正了解设备上下文本身是如何工作的-它是设备的抽象,可以是图形适配器、位图或打印机等。它只是提供了一种统一的绘制方式。谢谢!但我仍然不知道设备上下文(DC)是如何工作的,也不知道如何在WM_PRINTCLIENT消息中使用它们。不过,还是要感谢路上的帮助!你其实不需要知道设备上下文本身是如何工作的——它是一个设备的抽象,可以是图形适配器、位图或打印机等。它只是提供了一种统一的绘图方式。谢谢,但我没有MFC。我只需要使用windows就可以了。没有其他图书馆。还有办法吗?我能用同样的原理做吗?:)你走哪条路线?尝试了WM_PAINT和WM_PRINTCLIENT吗?是的,通过向目标窗口发送WM_PRINTCLIENT消息并将HDC作为wParam,然后尝试将其绘制到主窗口,但没有成功。在代码的每一行之间使用GetLastError(),它只返回零。谢谢,但我没有MFC。我只需要使用windows就可以了。没有其他图书馆。还有办法吗?我能用同样的原理做吗?:)你走哪条路线?尝试了WM_PAINT和WM_PRINTCLIENT吗?是的,通过向目标窗口发送WM_PRINTCLIENT消息并将HDC作为wParam,然后尝试将其绘制到主窗口,但没有成功。在我的代码中的每一行之间使用GetLastError(),它只返回零。可能需要一些调整才能使用多个监视器,特别是如果两个窗口都显示在两个监视器上(每个监视器上显示其内容的一半)。可能需要一些调整才能使用多个监视器,特别是如果两个窗口都显示在两个显示器上(每个显示器上显示其内容的一半)。