Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова о мерцании 
V
    Опции темы
SmarTi
Дата 20.9.2006, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



Всем доброго времени суток. Сразу прошу меня извинить за создание такой темы. Но прочитав всё что мне удалось найти на форуме, я так и не понял как решить мою проблему.
Проблема заключается в следущем : 
Я рисую сетку  в SDI и заполняю её очень быстро квадратами (до 20 раз в секунду),кто писал "Жизнь" тот поймёт в чём речь. Естественно при перерисовке окна появляется мерцание smile 
На сколько я понял BitBlt работает только для битмапов... так как же избавится от мерцаний ?
Можно както сделать сетку постоянным фоном ?
PM MAIL   Вверх
vinter
Дата 20.9.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



используй двойную буферизацию..
суть такова: сначала создаешь контекст в памяти, потом в нем рисуешь, а потом BitBlt на основной контекст.
пример
Код

CFont *OldFont;
    CDC dcMemory;
    dcMemory.CreateCompatibleDC(&FontDC);
    CRect rect;
    GetClientRect(&rect);
    CBitmap bitmap, *pBitmap;
    bitmap.CreateCompatibleBitmap(&FontDC, rect.right, rect.bottom);
    pBitmap = dcMemory.SelectObject(&bitmap);
    dcMemory.SetBkMode(TRANSPARENT);
    dcMemory.SetBkColor(RGB(255, 255, 255));
    dcMemory.Rectangle(rect);
    LOGFONT lfFont = {
        100,
            0,
            100,
            100,
            FW_EXTRABOLD,
            0,
            0,
            0,
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY,
            VARIABLE_PITCH | FF_DONTCARE,
            "Arial"
    };
    m_Font.CreateFontIndirect(&lfFont);
    OldFont = dcMemory.SelectObject(&m_Font);
    dcMemory.SetTextColor(RGB(255,0,0));
    lfFont.lfEscapement = -100;
    m_Font.DeleteObject();
    m_Font.CreateFontIndirect(&lfFont);
    dcMemory.SelectObject(&m_Font);
    dcMemory.SetTextColor(RGB(255,255,0));
    dcMemory.TextOut(20, 200, _T("Версия "));
    m_Font.DeleteObject();
    lfFont.lfEscapement = 0;
    m_Font.CreateFontIndirect(&lfFont);
    dcMemory.SelectObject(&m_Font);
    dcMemory.SetTextColor(RGB(0,255,0));
    dcMemory.TextOut(200, 350, _T(" 1.0"));
    FontDC.BitBlt(0, 0, rect.right, rect.bottom, &dcMemory, 0, 0, SRCCOPY);
    dcMemory.SelectObject(OldFont);
    m_Font.DeleteObject();



--------------------
Мой блог
PM MAIL WWW   Вверх
SergeCpp
Дата 20.9.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 5
Всего: 124



Жизнь!!! Завтра прикреплю сюда свои исходники smile

И exe-шник smile

P.S. Словарь Жизни есть? Ссылку давать?

Добавлено @ 22:51 
Вспомнил! Вот тут я уже выкладывал!

Сетка не нужна! Квадраты — их два вида — уже должны содержать в себе сетку

На границах. В исходнике есть всё. Если чего не будет, пишите ПМ. Всё расскажу!

Занимался этой задачей smile

500 в секунду smile (зависит от размеров, конечно же)

Удачи!

PM MAIL WWW ICQ   Вверх
Sartorius
Дата 20.9.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



 А я тоже как-то жизнь писал...потом сделал, что бы клетки были нескольких видов(цветов). Очень интересно наблюдать как одна популяция вытесняет другую и т.п. 
SmarTi , можешь потом усложнить так...
PM MAIL ICQ   Вверх
SergeCpp
Дата 20.9.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 5
Всего: 124



Вот тут тот же исходник, но архив почему-то больше

Скачайте оба и сверьте, может, где что пропустил

Вот отличная программа Life32, хоть и старая, хоть и на Дельфи (не моя)
user posted image

Game of Life Dictionary

Реализация Машины Тьюринга посредством Игры Жизнь

Детальная картинка (1714 x 1647)
user posted image

Русскоязычный перевод Словаря Жизни


Это сообщение отредактировал(а) SergeCpp - 19.1.2007, 23:35
PM MAIL WWW ICQ   Вверх
SmarTi
Дата 20.9.2006, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



Цитата(vinter @ 20.9.2006,  22:22)
суть такова: сначала создаешь контекст в памяти, потом в нем рисуешь, а потом BitBlt на основной контекст.

Вот как я делаю : 
Код

void CLife1View::OnDraw(CDC* pDC)
{
    CLife1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
    CRect rect;
    GetClientRect(&rect);
    
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CPen pen;
    pen.CreatePen(0,1,RGB(170,170,170));
    memDC.SelectObject(pen);
    //Рисую сетку
    for(int i=1;i<m_lMaxHor/4;i++)
    {
        memDC.MoveTo(i*4,0);
        memDC.LineTo(i*4,(int)m_lMaxVert);
    }
    for(i=1;i<m_lMaxVert/4;i++)
    {
        memDC.MoveTo(0,i*4);
        memDC.LineTo((int)m_lMaxHor,i*4);
    }
    pen.DeleteObject();
    //рисую квадраты там где нужно
    pen.CreatePen(0,1,RGB(0,0,0));
    memDC.SelectObject(pen);
    for(int i=0;i<=(int)m_lMaxHor/4;i++)
    {
        for(int j=0;j<=(int)m_lMaxVert/4;j++)
        {
            if(mas[i][j] == 1)
            {
                memDC.Rectangle(i*4-4,j*4-4,i*4,j*4);
            }
        }
    }
    //ну и собственно BitBlt
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);
}

И в результате просто белый экран... какбудто я и ничего не рисую... В чем может быть проблема ? 
SergeCpp, всё таки хочется разобратся с двойной буферизацией, а твоя "Жизнь" классная  smile 
PM MAIL   Вверх
SergeCpp
Дата 21.9.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 5
Всего: 124



OnEraseBkgnd выброшена?

Сразу же return TRUE нужно

Добавлено @ 00:20 
P.S. спать хочу smile пока smile
PM MAIL WWW ICQ   Вверх
SmarTi
Дата 21.9.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



Цитата(SergeCpp @ 21.9.2006,  00:11)
OnEraseBkgnd выброшена?

Сразу же return TRUE нужно

Если так делать то вообще каша получается... а рисовать то что нужно не хочет.
PM MAIL   Вверх
SmarTi
Дата 21.9.2006, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



УРАААА! Получилось ! Я просто думал что Битмап тут не при чём smile
Получается так : 
Код

void CLife1View::OnDraw(CDC* pDC)
{
    CLife1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
    CRect rect;
    GetClientRect(&rect);
    
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CBitmap bitmap, *pBitmap;
    bitmap.CreateCompatibleBitmap(pDC,(int)m_lMaxHor,(int)m_lMaxVert);
    pBitmap = memDC.SelectObject(&bitmap);
    memDC.SetBkMode(TRANSPARENT);
    memDC.SetBkColor(RGB(255, 255, 255));
    memDC.Rectangle(0,0,(int)m_lMaxHor,(int)m_lMaxVert);
    CPen pen;
    
    pen.CreatePen(0,1,RGB(170,170,170));
    memDC.SelectObject(pen);
    //Рисую сетку
    for(int i=1;i<m_lMaxHor/4;i++)
    {
        memDC.MoveTo(i*4,0);
        memDC.LineTo(i*4,(int)m_lMaxVert);
    }
    for(i=1;i<m_lMaxVert/4;i++)
    {
        memDC.MoveTo(0,i*4);
        memDC.LineTo((int)m_lMaxHor,i*4);
    }
    pen.DeleteObject();
    //рисую квадраты там где нужно
    pen.CreatePen(0,1,RGB(0,0,0));
    memDC.SelectObject(pen);
    for(int i=0;i<=(int)m_lMaxHor/4;i++)
    {
        for(int j=0;j<=(int)m_lMaxVert/4;j++)
        {
            if(mas[i][j] == 1)
            {
                memDC.Rectangle(i*4-4,j*4-4,i*4,j*4);
            }
        }
    }
    //ну и собственно BitBlt
    pDC->BitBlt(0,0,(int)m_lMaxHor,(int)m_lMaxVert,&memDC,0,0,SRCCOPY);
}

ну и конечно обработчик : 
Код

BOOL CLife1View::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
}

Вот если бы я сразу натнулся на примерно вот такой код.... эээх. Ладно, всем огромное СПАСИБО. Тема закрыта! иду спать smile

Это сообщение отредактировал(а) SmarTi - 21.9.2006, 01:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1177 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.