我刚开始使用MFC所以请宽容;)。 我写过(它主要是为了诚实而生成)一个简单的应用程序,应该执行Paint杂务:绘制线条,矩形,椭圆,更改要绘制的对象的颜色等。
我需要将屏幕上绘制的内容保存到bmp文件中。任何想法我怎样才能做到这一点?
我不知道这是否相关,但我在屏幕上绘制对象而不使用任何CBitmaps或类似的东西。以下是负责绘图的代码的一部分:
CPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
Anchor.x=point.x;
Anchor.y=point.y;
OldPoint.x=Anchor.x;
OldPoint.y=Anchor.y;
if(pDoc->shapeCount>=MAX_SHAPES) return;
pDoc->shapeCount++;
if(bFreehand)
{
pDoc->m_shape[pDoc->shapeCount-1] = new Shape;
pDoc->m_shape[pDoc->shapeCount-1]->shape = ePoint;
}
if(bLine)
{
pDoc->m_shape[pDoc->shapeCount-1] = new CLine;
pDoc->m_shape[pDoc->shapeCount-1]->shape = eLine;
}
if(bRectangle)
{
pDoc->m_shape[pDoc->shapeCount-1] = new CRectangle;
pDoc->m_shape[pDoc->shapeCount-1]->shape = eRectangle;
}
if(bEllipse)
{
pDoc->m_shape[pDoc->shapeCount-1] = new CEllipse;
pDoc->m_shape[pDoc->shapeCount-1]->shape=eEllipse;
}
pDoc->m_shape[pDoc->shapeCount-1]->x=point.x;
pDoc->m_shape[pDoc->shapeCount-1]->y=point.y;
pDoc->m_shape[pDoc->shapeCount-1]->x2=point.x;
pDoc->m_shape[pDoc->shapeCount-1]->y2=point.y;
pDoc->m_shape[pDoc->shapeCount-1]->Pen=CurrentPen;
pDoc->m_shape[pDoc->shapeCount-1]->Brush=CurrentBrush;
bButtonDown=true;
SetCapture();
我已经找到了这种方法但我不知道如何获取屏幕宽度和高度来填充它在CreateBitmap参数的列表中
CBitmap *bitmap;
bitmap.CreateBitmap(desktopW, desktopH, 1, 32, rgbData);
CImage image;
image.Attach(bitmap);
image.Save(_T("C:\\test.bmp"), Gdiplus::ImageFormatBMP);
答案 0 :(得分:1)
如果您要保存的图像实际上是屏幕的整个大小,则CreateBitmap
调用仅需要桌面宽度和高度。如果这确实是您的意图,您可以使用CWnd::GetDesktopWindow()
来获取可以查询其宽度和高度的CWnd
对象:
http://msdn.microsoft.com/en-us/library/bkxb36k8(v=VS.80).aspx
一般情况下变得狡猾......如果除了多监视器场景之外别无其他原因......所以除非你真的想要编写一个屏幕捕获应用程序,否则我建议不要这样做。
您可能想要做的不是全屏拍摄,而只是保存程序窗口的内容。通常,您可以通过分解程序的绘图逻辑来执行此操作,以便在paint方法中调用编写的辅助函数来获取CDC
设备上下文。然后,您可以在绘制调用中的基于窗口的DC上调用该函数,也可以在从位图创建的DC上调用该函数进行保存。请注意,您可以在CBitmap
中使用CDC::SelectObject
:
http://msdn.microsoft.com/en-us/library/432f18e2(v=VS.71).aspx
(虽然让我告诉你不要使用MFC。请尝试使用Qt。更好。)