Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
linkoln78
1 / 1 / 1
Регистрация: 21.05.2012
Сообщений: 102
1

Постоянное мерцание при прорисовке

26.09.2013, 01:45. Просмотров 1219. Ответов 3
Метки нет (Все метки)

создал класс, в котором реализованы методы для рисования графиков. есть маcсив sinys[], где у меня сохранены все точки, который мне надо рисовать. Как сделать, что-бы каждый раз не перерисовывать функцию, а так сказать дорисовывать. В своем базовом классе я выполняю прорисовку моих точек в методе ONPaint после сообщения WM_TIMER. Вот, собственно код.. Сейчас очень большие мерцания при построение синусоиды.. Спасибо за помощь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//WaveForm.cpp
static double sinys[3000];
void WaveForm::DrawSinys(CPaintDC*pDC)
{
    int y_start = 377/2;
    // Устанавливаем масштаб, начало и направление
     pDC->SetMapMode(MM_ISOTROPIC);
     pDC->SetViewportOrg(20, 377/2);
    static int i =0;
    for(int j=0;j<=i;j++)
     {
 
     pDC->SetPixel(j, sinys[j], RGB(255, 0, 0));
    }
    i++;
}
 
void WaveForm::DrawSinWaveForm(CPaintDC* pDC,int width, int height)
{
int x_start = 10;
    int y_start = height/2;
    // Устанавливаем масштаб, начало и направление
     pDC->SetMapMode(MM_ISOTROPIC);
     pDC->SetViewportOrg(20, height/2);
    /*pDC->SetWindowExt(100, 100);
    pDC->SetViewportExt(1440, -height/2);*/
    
 
    const double PI = 3.141592653589793238462643383279;
    
    // The following two values were chosen randomly by me.
    // You can chose other values you like
    const int MultiplyEachUnitOnX = 150;
    const int MultiplyEachUnitOnY = 200;
    for(double i=0;i<1500;i+=0.5)
    {
    double j = 0.5*sin((PI / MultiplyEachUnitOnX * i)*2) * MultiplyEachUnitOnY;
    sinys[(int)(i+0.5)]=j;
    /*pDC->SetPixel(i, j, RGB(255, 0, 0));*/
    }
}
void WaveForm::DrawYaxis(CPaintDC* pDC,int width, int height)
{
    int x_start = 10;
    int y_start = height/2;
    // Устанавливаем масштаб, начало и направление
     pDC->SetMapMode(MM_ISOTROPIC);
     pDC->SetViewportOrg(20, height/2);
    /*pDC->SetWindowExt(100, 100);
    pDC->SetViewportExt(1440, -height/2);*/
    
    CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
    pDC->SelectObject(PenBlue);
    
    // Axes
    pDC->MoveTo(0,0);
    pDC->LineTo(width*2.3,0);
    pDC->MoveTo(  0,-450);
    pDC->LineTo(  0,450);
    /*i += 500;*/
    }
//Базовый класс
void CMFCApplication8Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // контекст устройства для рисования
 
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
        // Выравнивание значка по центру клиентского прямоугольника
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
 
        // Нарисуйте значок
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
    
    CPaintDC* dc=new CPaintDC(&m_DrawArea);
    CRect rc;
    m_DrawArea.GetClientRect(rc);
    dc->FillSolidRect(rc,RGB(255,255,255));
    int width=rc.Width();
    int height=rc.Height(); 
    f.DrawYaxis(dc,width,height);
    f.DrawSinys(dc);
}
 
void CMFCApplication8Dlg::OnStartTimer() 
{
    m_nTimer = SetTimer(1, 10,0);
}
void CMFCApplication8Dlg::OnTimer(UINT_PTR nIDEvent)
{
    
    this->RedrawWindow();       
    CDialogEx::OnTimer(nIDEvent);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2013, 01:45
Ответы с готовыми решениями:

Мерцание при Invalidate
(MFC) Вызываю в OnMouseMove MoveWindow(SetWindowPos (отключаю перерисовку))...

Мерцание при перерисовке (MFC)
Господа Программисты! Делаю Тетрис на MFC. При перерисовке игрового поля...

Как побороть мерцание при перерисовке строки контрола CListBox
Добрый день! Как побороть мерцание при перерисовке строки контрола CListBox....

Мерцание консоли
Пишу RPG. Но возникла такая проблема: когда персонаж двигается, начинает...

Анимация огня. Мерцание
Собственно само задание выглядит так: Задание я вроде бы выполнил, но...

3
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
26.09.2013, 10:08 2
Обрати внимание на двойную буферизацию при рисовании.

http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC
http://www.codeproject.com/Articles/5865/Double-Buffered-DC-Class

ну и остальное погугли сам.....
0
linkoln78
1 / 1 / 1
Регистрация: 21.05.2012
Сообщений: 102
26.09.2013, 13:03  [ТС] 3
CheshireCat, подскажи, где ошибка..написал вот такую функцию, рисует без мерцаний, но не правильный вывод моего графика..вот код..в прикреплениях скрин программы с функцией Draw , и просто с перерисовкой в OnPAint с мерцанием..но вывод правильный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void CMFCApplication8Dlg::Draw()
{
    CClientDC dc( this );
    CPen pen;
 
    CBitmap bit;
    CDC dc2;
 
    RECT pRECT = {0};
    GetClientRect(&pRECT);
    int XMIN = 20;
    int YMIN = 20;
    bit.CreateCompatibleBitmap( &dc, 377, 669 );
    dc2.CreateCompatibleDC(&dc);
    dc2.SelectObject( &bit );
    CRect rc;
    m_DrawArea.GetClientRect(rc);   
     dc2.FillSolidRect(rc,RGB(255,255,255));
    int width=rc.Width();
    int height=rc.Height(); 
    f.DrawYaxis( &dc2,width,height);
    f.DrawSinys(&dc2);
    dc.BitBlt( XMIN, YMIN , width, height , &dc2,10,10, SRCCOPY );
    UpdateData(false);
}
0
Миниатюры
Постоянное мерцание при прорисовке   Постоянное мерцание при прорисовке  
-=ЮрА=-
Заблокирован
Автор FAQ
28.09.2013, 12:11 4
linkoln78, рисуй синусоиду отнимая значения от bottom клиентского прямоугольника (не забывай что ноль у окна не как в декартовых координатах внизу а наоборт вверху)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 12:11

Двойная буферизация, присутствует мерцание
Здравствуйте! Если форма на C++ (чистый WinAPI), на ней рисуется графика с...

Мерцание картинки при прорисовке
Здравствуйте. На словах не могу обьяснить суть проблемы - по этому выкладываю...

Мерцание при прорисовке в Паскале
Добрый день. Такой вопрос я нарисовал картинку при передвижении ее она мерцает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru