Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Хочу нарисовать bitmap при помощи Device Context  [new]
iv_an_ru
Member

Откуда: Новосибирск
Сообщений: 20369
Дано: есть программка под винду, на VC++ с MFC, с матерной математикой внутри ( https://iv-an-ru.livejournal.com/71426.html , если кому интересно)
Пока эта математика считается, MFC-шный метод OnDraw успешно рисует в окне кучу графиков. Я хочу заодно получить картинку с этими же графиками, но куда бОльшего размера, скажем 4800x6600 пикселей, а переделывать код рисовалки не хочу, потому что там действительно много. Я пробую различные вариации вот этого кода, надёрганного по строчке из разных сайтов:

    CBitmap bmp;
    int w = 600*8;
    int h = 600* 11;
    bmp.CreateBitmap(w, h, 3, 8, nullptr);
    CMemDC bmpmdc(*pDC, this);   // pDC --- это у меня CDC *завалялся, в который только что успешно рисовал OnDraw
    CDC &bmpdc = bmpmdc.GetDC();
    bmpdc.SelectObject(&bmp);
    bmpdc.SetWindowExt(w, h);
    bmpdc.SetWindowOrg(0,0);
    CRect clirect(0, 0, w, h);
    // Тут вызов Страшной Рисовалки, которая получает &bmpdc и делает в него много разных FillRect и SetPixel
    CImage img;
    img.Attach(bmp);
    img.Save(_T("O:\\GasPlasma\\screenshot.bmp"), Gdiplus::ImageFormatBMP);


Оно не сохраняет файл и оно рисует в окно угол сильно растянутой картинки, как будто у окна размер 4800x6600

Видимо проблема в том, что я неправильно делаю CDC для рисования в битмап, но я не нашёл ни одного нормального примера, как же правильно. Все примеры рано или поздно "воруют" CDC из окна или ещё чего "экранного", а не создают "с ноля" с привязкой только лишь к битмапу.
17 май 21, 23:45    [22323386]     Ответить | Цитировать Сообщить модератору
 Re: Хочу нарисовать bitmap при помощи Device Context  [new]
Изопропил
Member

Откуда:
Сообщений: 31570
iv_an_ru,

	
CBitmap bmp;
int w = 600 * 8;
int h = 600 * 11;
CDC bmpmdc;
bmpmdc.CreateCompatibleDC(nullptr);
bmp.CreateCompatibleBitmap(&bmpmdc, w, h);
bmpmdc.SelectObject(bmp);

// draw something
bmpmdc.SelectStockObject(GRAY_BRUSH);
bmpmdc.Rectangle(0, 0, w,h);
bmpmdc.SelectStockObject(WHITE_BRUSH);
bmpmdc.Rectangle(w/4, h/4 , w*3/4, h*3/4);
//

CImage img;
img.Attach(bmp);
img.Save(_T("d:\\tmp\\z.bmp"), Gdiplus::ImageFormatBMP);
18 май 21, 18:37    [22323794]     Ответить | Цитировать Сообщить модератору
 Re: Хочу нарисовать bitmap при помощи Device Context  [new]
Изопропил
Member

Откуда:
Сообщений: 31570
скорее так
Bitmap bmp;
int w = 600 * 8;
int h = 600 * 11;
CDC bmpmdc;
bmpmdc.CreateCompatibleDC(nullptr);
bmp.CreateCompatibleBitmap(&bmpmdc, w, h);
bmpmdc.SelectObject(bmp);


bmpmdc.SetMapMode(MM_ANISOTROPIC);
bmpmdc.SetWindowExt(100 , 200);
bmpmdc.SetViewportExt(w, h);

// draw something

bmpmdc.SelectStockObject(GRAY_BRUSH);
bmpmdc.Rectangle(10, 10, 90,190);
bmpmdc.SelectStockObject(WHITE_BRUSH);
bmpmdc.Rectangle(25, 50 , 75, 150);
//

CImage img;
img.Attach(bmp);
img.Save(_T("d:\\tmp\\z.bmp"), Gdiplus::ImageFormatBMP);
18 май 21, 19:03    [22323798]     Ответить | Цитировать Сообщить модератору
 Re: Хочу нарисовать bitmap при помощи Device Context  [new]
iv_an_ru
Member

Откуда: Новосибирск
Сообщений: 20369
Изопропил,

Спасибо огромное, заработало! Только в bmpmdc.CreateCompatibleDC() вместо nullptr пришлось "некрасиво" отдавать DC экрана, потому что без этого картинка получилась монохромной с растром.

К сообщению приложен файл. Размер - 2Kb
18 май 21, 19:43    [22323810]     Ответить | Цитировать Сообщить модератору
 Re: Хочу нарисовать bitmap при помощи Device Context  [new]
iv_an_ru
Member

Откуда: Новосибирск
Сообщений: 20369
Изопропил,

Если подсунуть 24-битный экран "как образец", то сразу красиво.

К сообщению приложен файл. Размер - 65Kb
18 май 21, 19:44    [22323811]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить