powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Хочу нарисовать bitmap при помощи Device Context
5 сообщений из 5, страница 1 из 1
Хочу нарисовать bitmap при помощи Device Context
    #40070943
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: есть программка под винду, на VC++ с MFC, с матерной математикой внутри ( https://iv-an-ru.livejournal.com/71426.html , если кому интересно)
Пока эта математика считается, MFC-шный метод OnDraw успешно рисует в окне кучу графиков. Я хочу заодно получить картинку с этими же графиками, но куда бОльшего размера, скажем 4800x6600 пикселей, а переделывать код рисовалки не хочу, потому что там действительно много. Я пробую различные вариации вот этого кода, надёрганного по строчке из разных сайтов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    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 из окна или ещё чего "экранного", а не создают "с ноля" с привязкой только лишь к битмапу.
...
Рейтинг: 0 / 0
Хочу нарисовать bitmap при помощи Device Context
    #40071139
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_an_ru,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
	
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);
...
Рейтинг: 0 / 0
Хочу нарисовать bitmap при помощи Device Context
    #40071142
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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);
...
Рейтинг: 0 / 0
Хочу нарисовать bitmap при помощи Device Context
    #40071150
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Спасибо огромное, заработало! Только в bmpmdc.CreateCompatibleDC() вместо nullptr пришлось "некрасиво" отдавать DC экрана, потому что без этого картинка получилась монохромной с растром.
...
Рейтинг: 0 / 0
Хочу нарисовать bitmap при помощи Device Context
    #40071151
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Если подсунуть 24-битный экран "как образец", то сразу красиво.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Хочу нарисовать bitmap при помощи Device Context
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]