Pu
Большой босс
Offline
78
|
|
« : 25-01-2004 15:44 » |
|
поделитесь как определить до вызова CreateCompatibleBitmap максимальные резмеры создаваемого битмапа . И как добиться чтобы эти самые размеры были как можно больше. Может надо этот самый битмап другой функцией создавать с меньшим количеством цветов, а не с тем как настроен Screen. За любую информацию заранее спасибо - желательно работа с Windows GDI те не МФС.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #1 : 25-01-2004 20:53 » |
|
Pu, объясни пожалуйста поподробнее задачу, а то я чего-то в вопросе не понял :?
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #2 : 25-01-2004 21:02 » |
|
Pu, В Windows 95/98/Me размер создаваемого bitmap'а ограничен 16MB.
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #3 : 26-01-2004 06:27 » |
|
это я знаю. Мне нужна область больше. И система позицианируется только под NT. Как я понимаю CreateCompatibleBitmap создает в памяти битмап совместимый с настройками текущего ДиСи т.е. если у меня выбрано цвет 32бит то бмп размерами 0x1000 на 0x1000 пикселей отжирает больше 100МБ памяти. Вот и вопрос какой функцией и как создать битмап с другими цветовыми настройками напр 256 цветов а потом можно ли его будет выбрать в аппаратный DC c другими настройками.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #4 : 26-01-2004 08:53 » |
|
Pu, тогда пользуйся CreateBitmap, а для копирования на экран BitBlt. Вот только зачем тебе такой bitmap :?: А CreateCompatibleBitmap для того и существует, чтобы создать совместимый с DC bitmap, что собственно следует из его названия .
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #5 : 26-01-2004 09:15 » |
|
я просто не силен во всех этих гди. делаю я следующее - создаю битмап в памяти, на нем отрисовываю рабочую поляну(там сетку, квадраты , линии - ну в общем все что нужно) а в DoPaint копирую необходимую область в клиенскую область которая скролится. Может я что не допонимаю. Такой битмап создаю для скроллинга поляны которая должна быть достаточно большой. И при этом начинаются всяческие тормоза из-за огромного витмара.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #6 : 26-01-2004 09:33 » |
|
Pu, создавай bitmap размером с область вывода, рисуй в bitmap только то, что в данный момент будет видно, затем копируй bitmap в DC (я так всегда делаю, правда приходится писать больше кода, но за то не тормозит).
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #7 : 26-01-2004 09:43 » |
|
я просто взял за пример bmpview из WTL. A там пользуют обыкновенный вмп из файла. и его соответственно и скролят. Щас попробую переделать. А битмап лучше по WM_SIZE создавать?
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
GlukSoft
Главный специалист
Offline
Пол:
|
|
« Ответ #8 : 26-01-2004 10:10 » |
|
Pu, да. Если хочешь могу скинуть класс, который я написал (мелкий, но экономит время в начале проекта).
|
|
|
Записан
|
Fatal error C1: Brain expected
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #9 : 26-01-2004 10:48 » |
|
спасибо но я думаю это будет лишнее, я просто сразу втупую прописал эту отрисовку особо не разбираясь с гди. В проекте у меня это не самое важное на чем необходимо было терять сразу время. Вот наловил глюков. щас уже сижу рефакторю и выгребаю мусор. А проект уже к концу идет. 8)
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #10 : 26-01-2004 14:40 » |
|
Посмотрите сорцы - может увидите, что у меня здесь не так. Не выходит чтобы сетка скролилась равномерно. Задача просто отрисовать точками сетку на большой поляне - поляна соответственно должна скролиться
void CProjView::DoPaint(CDCHandle dc) { POINT ptScrollOffs; WTL::CBrush br; COLORREF colorBg = RGB(20,55,70); CRect cr; GetClientRect(&cr); if(!m_dcMem.m_hDC) m_dcMem.CreateCompatibleDC(dc); if(!m_bmpMem.m_hBitmap) return; HBITMAP hBmpOld = m_dcMem.SelectBitmap(m_bmpMem); br.CreateSolidBrush(colorBg); HBRUSH old_br = m_dcMem.SelectBrush(br);
m_dcMem.PatBlt(0, 0, m_sizeImage.cx, m_sizeImage.cy, PATCOPY);
DrawGreed(m_dcMem, 40); //paint grid //m_proj.Draw( m_dcMem); //paint project
GetScrollOffset(ptScrollOffs); dc.BitBlt(ptScrollOffs.x, ptScrollOffs.y, m_sizeImage.cx, m_sizeImage.cy, m_dcMem, 0, 0, SRCCOPY);
m_dcMem.SelectBrush(old_br); br.DeleteObject(); m_dcMem.SelectBitmap(hBmpOld); return; } //----------------------------------------------------------------------- BOOL CProjView::DrawGreed(HDC hdc, DWORD dwStep) { int offsX = GetScrollPos(SB_HORZ) % dwStep; int offsY = GetScrollPos(SB_VERT) % dwStep; WTL::CPen p; p.CreatePen(PS_SOLID, 1, RGB(0xff, 0xff, 0)); HPEN old_p = (HPEN)::SelectObject(hdc, p); for(int x = offsX; x < m_sizeImage.cx; x=x+dwStep) for(int y = offsY; y < m_sizeImage.cy; y=y+dwStep) SetPixel(hdc, x, y, RGB(200,200,200)); ::SelectObject( hdc, old_p); p.DeleteObject(); return FALSE; } //----------------------------------------------------------------------- LRESULT CProjView::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { CPaintDC dc(m_hWnd); m_sizeImage.cx = (LOWORD(lParam)) ? LOWORD(lParam) : 1; m_sizeImage.cy = (HIWORD(lParam)) ? HIWORD(lParam) : 1; if(m_bmpMem.m_hBitmap) { m_bmpMem.DeleteObject(); m_bmpMem.m_hBitmap = NULL; } m_bmpMem.CreateCompatibleBitmap( dc.m_hDC, m_sizeImage.cx, m_sizeImage.cy); UpdateWnd(); bHandled = FALSE; return 0; }
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 15-04-2006 17:45 » |
|
(комент) Посмотрите сорцы - может увидите, что у меня здесь не так. Не выходит чтобы сетка скролилась равномерно...
1) раз код глючный, то спросить у Пу, нужна ли ему тема (скорее нет ) 2) поскольку вопрос о битмапах ( а так же о рисовании сначала в память для устранения мерцания (и иже с ними)) довольно часто был (помнится) то - FAQ или статья
|
|
|
Записан
|
|
|
|
|