Как сохранить в растровое изображение в приложении MFC C ++? - PullRequest
1 голос
/ 13 июня 2011

Я только начинаю с MFC, поэтому будьте терпимы;). Я написал (по большей части сгенерированный, если честно) простое приложение, которое должно выполнять рутинные задачи рисования: рисование линий, прямоугольников, эллипсов, изменение цвета объекта для рисования и т.д.

Мне нужно сохранить то, что было нарисовано на экране, в файл 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 Ответ

1 голос
/ 13 июня 2011

Для вызова CreateBitmap требуется только ширина и высота рабочего стола, если изображение, которое вы хотите сохранить, на самом деле имеет полный размер экрана.Если это действительно ваше намерение, вы можете использовать CWnd::GetDesktopWindow(), чтобы получить CWnd объект, который вы можете запросить для его ширины и высоты:

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

, который в целом выглядит хитрым.... если не по какой-либо другой причине, кроме сценариев с несколькими мониторами ... так что я бы рекомендовал против этого, если вы действительно не хотите писать приложение для захвата экрана.полный снимок экрана, но просто сохраните содержимое окна вашей программы.Обычно вы делаете это, нарушая логику рисования вашей программы, чтобы в методе рисования вы вызывали вспомогательную функцию, написанную для получения контекста устройства CDC.Затем вы можете либо вызвать эту функцию на оконном контроллере домена, который вы получаете при вызове рисования, либо на контроллере домена, который вы создаете из растрового изображения для сохранения.Обратите внимание, что вы можете использовать CBitmap в CDC::SelectObject:

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

(Хотя позвольте вам напомнить, что вы не используете MFC. Попробуйте Qt вместо. Намного лучше.)

...