M_A 0 20 июля, 2005 Опубликовано 20 июля, 2005 · Жалоба Я пока тока учусь, так что сильно не пинайте за глупые вопросы, просто много уже перерыл, а ответ не нашел. Учусь рисовать в окне. Нарисовал примитивы типа круга, прямоугольника. Завел цикл, где рисую круг со смещающимися координатами. Результат - куча выстроившихся друг за другом кругов. Вопрос: как после того, как нарисован круг, очистить окно, чтобы потом нарисовать второй со смещенными координатами и т.д. чтоб получить эффект "движущегося" круга? З.Ы. просто у меня в идеале должна получиться железяка, передающая информацию из внешнего мира в комп, вот появилась идея отображать все графически, чтоб веселее было.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
subver 0 20 июля, 2005 Опубликовано 20 июля, 2005 · Жалоба Смотреть в сторону функций BitBlt, CreateDIBSection и далее по MSDN :) получается очень аккуратно и быстро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kurt 0 20 июля, 2005 Опубликовано 20 июля, 2005 · Жалоба На чем пишите? Для того чтобы очистить экран перед отрисовкой следующей фигуры можно использовать функции 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 так как наверняка такая проблема возникнет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_A 0 20 июля, 2005 Опубликовано 20 июля, 2005 · Жалоба subver, Kurt Спасибо что откликнулись! Я уже и сам кой-чего нашел! Я был уверен, что есть какие то стандартные и простые решения для этого, вот одно из них и нашел (для MFC): Invalidate(TRUE); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 20 июля, 2005 Опубликовано 20 июля, 2005 · Жалоба Invalidate(TRUE); <{POST_SNAPBACK}> Это приводит к мерцанию, очень заметному на медленных машинах. Правильнее всего делать BitBlt для сохранения и восстановления изображения между выводом кругов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_A 0 21 июля, 2005 Опубликовано 21 июля, 2005 · Жалоба Invalidate(TRUE); <{POST_SNAPBACK}> Это приводит к мерцанию, очень заметному на медленных машинах. Правильнее всего делать BitBlt для сохранения и восстановления изображения между выводом кругов. <{POST_SNAPBACK}> Про BitBlt почитал, вкратце он делает следующее: Copies a bitmap from a specified device context. Пните меня в нужном направлении, как это может мне помочь очищать окно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
subver 0 21 июля, 2005 Опубликовано 21 июля, 2005 · Жалоба Пните меня в нужном направлении, как это может мне помочь очищать окно? Очищать нужно не окно, а внеэкранный буфер. 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. надо дождаться обратного хода луча монитора, как это сделать сейчас не скажу, ибо не помню :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться