Перейти к содержанию
    

Вопрос ламера про рисование

Я пока тока учусь, так что сильно не пинайте за глупые вопросы, просто много уже перерыл, а ответ не нашел.

Учусь рисовать в окне. Нарисовал примитивы типа круга, прямоугольника.

Завел цикл, где рисую круг со смещающимися координатами. Результат - куча выстроившихся друг за другом кругов. Вопрос: как после того, как нарисован круг, очистить окно, чтобы потом нарисовать второй со смещенными координатами и т.д. чтоб получить эффект "движущегося" круга?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотреть в сторону функций BitBlt, CreateDIBSection и далее по MSDN :)

получается очень аккуратно и быстро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На чем пишите?

Для того чтобы очистить экран перед отрисовкой следующей фигуры можно использовать функции GDI:

 

CRect rc;

GetClientRect(rc);

 

// clear background

dc.SetBkColor(::GetSysColor(COLOR_BTNFACE));

dc.ExtTextOut(0, 0, ETO_OPAQUE, rc, NULL, 0, NULL);

 

Еще стоит поискать в инете на тему flicker free drawing так как наверняка такая проблема возникнет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

subver, Kurt Спасибо что откликнулись!

 

Я уже и сам кой-чего нашел!

Я был уверен, что есть какие то стандартные и простые решения для этого, вот одно из них и нашел (для MFC):

 

Invalidate(TRUE);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Invalidate(TRUE);

 

Это приводит к мерцанию, очень заметному на медленных машинах. Правильнее всего делать BitBlt для сохранения и восстановления изображения между выводом кругов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Invalidate(TRUE);

 

Это приводит к мерцанию, очень заметному на медленных машинах. Правильнее всего делать BitBlt для сохранения и восстановления изображения между выводом кругов.

 

Про BitBlt почитал, вкратце он делает следующее:

 

Copies a bitmap from a specified device context.

 

Пните меня в нужном направлении, как это может мне помочь очищать окно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пните меня в нужном направлении, как это может мне помочь очищать окно?

 

Очищать нужно не окно, а внеэкранный буфер.

BitBlt копирует с одного HDC на другой, один из них - DC вашего окна, другой - DC битмапа, который можно создать с помошью функции CreateDIBSection, вот пример:

 

COLORREF *ScreenBuffer;
       ScreenBuffer = (COLORREF *)malloc(SCREEN_H*SCREEN_W*4);
       hdcDest=GetDC(Handle);
       bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
       bmi.bmiHeader.biWidth=SCREEN_W;
       bmi.bmiHeader.biHeight=SCREEN_H;
       bmi.bmiHeader.biPlanes=1;
       bmi.bmiHeader.biBitCount=32;
       bmi.bmiHeader.biCompression=BI_RGB;
       bmi.bmiHeader.biSizeImage=0;
       bmi.bmiHeader.biClrUsed=0;
       bmi.bmiHeader.biClrImportant=0;
       hdcSrc=CreateCompatibleDC(NULL);
       BitMap=CreateDIBSection(hdcSrc,&bmi,DIB_RGB_COLORS,&(void *)ScreenBuffer,NULL,0);
       SelectObject(hdcSrc,BitMap);
      
       /*здесь рисуем в ScreenBuffer 
        .................................*/


      //А теперь копируем буфер на окно
       BitBlt(hdcDest,0,0,SCREEN_W,SCREEN_H,hdcSrc,0,0,SRCCOPY);

 

ScreenBuffer - выделенный блок памяти размером SCREEN_W*SCREEN_H*biBitCount/8 байт.

 

biBitCount - определяет количество битов на точку для нашего буфера (а не для окна), т.е. не зависит от текущего граф. режима видеокарты.

 

если biBitCount == 32, то формат цвета соответствует стандартному COLORREF.

 

Чтобы поставить точку с координатами 10,10 делаем так:

ScreenBuffer[10+10*SCREEN_W]=color;

 

Соответственно, по окончании необходимо удалить все, что насоздавали:

 

        DeleteObject(BitMap);
       DeleteDC(hdcSrc);
       free(ScreenBuffer);

 

Да, и еще - создавать и удалять буферы и битмапы надо при старте и закрытии приложения соответственно, а алгоритм отрисовки одного кадра такой:

 

1. Заполняем ScreenBuffer цветом фона

2. Рисуем все что нужно

3. Делаем BitBlt

 

Если возникает мерцание, то перед 3. надо дождаться обратного хода луча монитора, как это сделать сейчас не скажу, ибо не помню :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...