2011-06-13 78 views
1

我刚开始使用MFC,请耐心等待)。 我已经写了(它主要是产生要诚实)一个简单的应用程序,它应该做的油漆琐事:要绘制的画线,rectangulars,椭圆形,改变物体的颜色等如何保存到MFC C++应用程序中的位图?

我需要保存了什么已经在屏幕上绘制成一个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); 

回答

1

如果要保存的图像实际上是屏幕的整个大小,则CreateBitmap调用仅需要桌面宽度和高度。如果这是真的你的意图,你可以使用CWnd::GetDesktopWindow()得到一个CWnd对象,您可以查询其宽度和高度:

http://msdn.microsoft.com/en-us/library/bkxb36k8(v=VS.80).aspx

那得到一般狡猾......如果没有其他原因,而不是多监控场景...所以我会建议不要这样做,除非你真的想编写一个屏幕截图应用程序。

你可能想要做的不是全屏截图,而只是保存程序窗口的内容。通常情况下,您可以通过分解程序的绘图逻辑来完成此操作,以便在绘制方法中调用写入的辅助函数,以获取CDC设备上下文。然后,您可以在您在绘画调用中获得的基于窗口的DC或从位图创建的DC上调用该函数来完成保存。请注意,您可以使用在CDC::SelectObjectCBitmap:(虽然让我推销你不使用MFC尝试Qt代替的方式更好。)

http://msdn.microsoft.com/en-us/library/432f18e2(v=VS.71).aspx

+0

谢谢回答。首先:我如何查询CWnd的宽度和高度。其次,有没有一种方法可以从* View.cpp文件中获取CDC设备上下文?我对MFC是消息处理而不是标准的'int main()'类型的东西有点困惑。 – Patryk 2011-06-13 06:35:47

+0

如果你对首字母缩略词RTFM或它的含义不满意,那么你绝对应该使用更现代的技术!任何记得MFC的人都不在StackOverflow上回答有关它的娱乐问题。 :)如果你有一个CWnd并想从CWnd获得一个大小,你的管道是GetClientRect。 http://msdn.microsoft.com/en-us/library/hkzy4k3x(v=vs.71).aspx – HostileFork 2011-06-13 06:46:46

+0

至于现在我看到,我suold肯定下次使用QT :(但现在我必须交出这个项目(即使没有完成)今天...和是啊... RTFM,但现在没有时间了,谢谢你的反应。 – Patryk 2011-06-13 18:41:06

相关问题