Как сохранить в растровое изображение в приложении MFC C++?

Я только начинаю с 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);

person Patryk    schedule 13.06.2011    source источник


Ответы (1)


Вызов 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. Намного лучше.)

person HostileFork says dont trust SE    schedule 13.06.2011
comment
Спасибо за ответ. Прежде всего: как я могу запросить CWnd для ширины и высоты. Во-вторых, есть ли способ получить контекст устройства CDC из файла *View.cpp? Меня немного смущает то, что MFC обрабатывает сообщения вместо стандартного типа «int main()». - person Patryk; 13.06.2011
comment
Если вам не нравится аббревиатура RTFM или ее значение, вам следует определенно использовать более современную технологию! Любой, кто помнит MFC, не находится на StackOverflow и не отвечает на вопросы о нем в развлекательных целях. :) Если у вас есть CWnd и вы хотите размер от CWnd, ваша сантехника GetClientRect. msdn.microsoft.com/en-us/library /hkzy4k3x(v=vs.71).aspx - person HostileFork says dont trust SE; 13.06.2011
comment
На данный момент я вижу, что я определенно буду использовать QT в следующий раз :( но теперь я должен сдать этот проект (хотя и не завершенный) сегодня... и да... RTFM, но сейчас нет на это времени. Спасибо за ответ в любом случае. - person Patryk; 13.06.2011