Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: определение размеров битмапа в CreateCompatibleBitmap  (Прочитано 19103 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Pu
Большой босс

ru
Offline Offline
78


« : 25-01-2004 15:44 » 

поделитесь как определить до вызова CreateCompatibleBitmap максимальные резмеры создаваемого битмапа . И как добиться чтобы эти самые размеры были как можно больше. Может надо этот самый битмап другой функцией создавать с меньшим количеством цветов, а не с тем как настроен Screen. За любую информацию заранее спасибо - желательно работа с Windows GDI те не МФС.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 25-01-2004 20:53 » 

Pu, объясни пожалуйста поподробнее задачу, а то я чего-то в вопросе не понял :?
Записан

Fatal error C1: Brain expected
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 25-01-2004 21:02 » 

Pu, В Windows 95/98/Me размер создаваемого bitmap'а ограничен 16MB.
Записан

Fatal error C1: Brain expected
Pu
Большой босс

ru
Offline Offline
78


« Ответ #3 : 26-01-2004 06:27 » 

это я знаю. Мне нужна область больше. И система позицианируется только под NT. Как я понимаю CreateCompatibleBitmap создает в памяти битмап совместимый с настройками текущего ДиСи т.е. если у меня выбрано цвет 32бит то бмп размерами 0x1000 на 0x1000 пикселей отжирает больше 100МБ памяти. Вот и вопрос какой функцией и как создать битмап с другими цветовыми настройками напр 256 цветов а потом можно ли его будет выбрать в аппаратный DC c другими настройками.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 26-01-2004 08:53 » 

Pu, тогда пользуйся CreateBitmap, а для копирования на экран BitBlt.
Вот только зачем тебе такой bitmap :?:  Я шокирован!
А CreateCompatibleBitmap для того и существует, чтобы создать совместимый с DC bitmap, что собственно следует из его названия Ага.
Записан

Fatal error C1: Brain expected
Pu
Большой босс

ru
Offline Offline
78


« Ответ #5 : 26-01-2004 09:15 » 

я просто не силен во  всех этих гди. Жаль
делаю я следующее - создаю битмап в памяти, на нем отрисовываю рабочую поляну(там сетку, квадраты , линии - ну в общем все что нужно) а в DoPaint копирую  необходимую область в клиенскую область которая скролится. Может я что не допонимаю. Такой битмап создаю для скроллинга поляны которая должна быть достаточно большой. И при этом начинаются всяческие тормоза из-за огромного витмара.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 26-01-2004 09:33 » 

Pu, создавай bitmap размером с область вывода, рисуй в bitmap только то, что в данный момент будет видно, затем копируй bitmap в DC (я так всегда делаю, правда приходится писать больше кода, но за то не тормозит).
Записан

Fatal error C1: Brain expected
Pu
Большой босс

ru
Offline Offline
78


« Ответ #7 : 26-01-2004 09:43 » 

я просто взял за пример bmpview из WTL. A там пользуют обыкновенный вмп из файла. и его соответственно и скролят. Щас попробую переделать.
А битмап лучше по WM_SIZE создавать?
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 26-01-2004 10:10 » 

Pu, да. Если хочешь могу скинуть класс, который я написал (мелкий, но экономит время в начале проекта).
Записан

Fatal error C1: Brain expected
Pu
Большой босс

ru
Offline Offline
78


« Ответ #9 : 26-01-2004 10:48 » 

спасибо но я думаю это будет лишнее, я просто сразу втупую прописал эту отрисовку особо не разбираясь с гди. В проекте у меня это не самое важное на чем необходимо было терять сразу время. Вот наловил глюков. щас уже сижу рефакторю и выгребаю мусор. А проект уже к концу идет.  8)
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Pu
Большой босс

ru
Offline 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;
}
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 15-04-2006 17:45 » new

(комент)

Цитата
Посмотрите сорцы - может увидите, что у меня здесь не так. Не выходит чтобы сетка скролилась равномерно...

1) раз код глючный, то спросить у Пу, нужна ли ему тема (скорее нет Улыбаюсь )
2) поскольку вопрос о битмапах ( а так же о рисовании сначала в память для устранения мерцания (и иже с ними)) довольно часто был (помнится) то -
    FAQ или статья
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines