Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.250.1] |
|
Сообщ.
#1
,
|
|
|
Нужно рисровать линии (график) через 50-100 мс. Если просто рисовать
dc.LineTo(...); То все мигает ужасно. Как сделать чтоб не мигало? Пробовал Что то типа CreateCompatibleDC рисую в нем а потом BitBlt(); Так вообще нифига не получилось (( |
Сообщ.
#2
,
|
|
|
Draw(CDC * pDC)
{ CDC memDC; if(!memDC.CreateCompatibleDC(pDC)) return; CBitmap bmp; if(!bmp.CreateCompatibleBitmap(pDC, 200, 200) { memDC.DeleteDC(); return; } CBitmap * OldBitmap = memDC.SelectObject(&bmp); // не забудь очистить CBrush brush; brush.CreateSolidBrush(RGB(255, 255, 255))) memDC.FillRect(CRect(0, 0, 200, 200), &brush); // memDC теперь рисуй здесь сколько влезет memDC.MoveTo(0, 0); memCD.LineTo(200,200); // теперь копируй на контекс устройства bool result = pDC.BitBlt(0, 0, 200, 200, &memDC, 0, 0, SRCCOPY); if(!result) AfxMessageBox("Ошибка"); // не забудь удалить memDC.SelectObject(OldBitmap); memDC.DeleteDC(); bmp.DeleteBitmap(); } И не забудь переопределить WM_ERASEBKGND: Ты же очистил матрицу !!! Быстрее не получиться ! |
Сообщ.
#3
,
|
|
|
Все равно мигает (( Неужто нельзя чтоб не мигало?
И что за WM_ERASEBKGND? В Dialog-Based приложении (а мне миенно там надо) его не нашел ( |
Сообщ.
#4
,
|
|
|
WM_ERASEBKGND - мессага, которая посылается окну при очищении его содержимого в клиентской области. Т.е. ты сам должен очищать все окно кроме того места, где у тя график
Сам разберешься или помочь? |
Сообщ.
#5
,
|
|
|
Короче говоря по сообщению WM_ERASEBKGRD у тебя очищается окно и в том числе твоя клиентская часть очистка занимает столько же времени что и отрисовка твоего графика следовательно у тебя есть шанс сделать весь процесс в 2 раза быстрее (Я же уже очистил bmp)
|
Сообщ.
#6
,
|
|
|
Там не работает bmp.DeleteBitmap();
И сообщения WM_ERASEBKGND нет в ClassWizard |
Сообщ.
#7
,
|
|
|
Я переопределил WM_ERASEBKGND так. Но теперь не прорисовываются элементы окна (кнопки и т.д.)
BOOL CFastDrawDlg::OnEraseBkgnd(CDC* pDC) { //CDialog::OnEraseBkgnd(pDC); return TRUE; } А сама OnPaint такая void CFastDrawDlg::OnPaint() { CPaintDC dc(this); CDC memDC; if(!memDC.CreateCompatibleDC(&dc)) return; CBitmap bmp; if(!bmp.CreateCompatibleBitmap(&dc, 200, 200)) { memDC.DeleteDC(); return; } CBitmap * OldBitmap = memDC.SelectObject(&bmp); // не забудь очистить CBrush brush; brush.CreateSolidBrush(RGB(255, 255, 255)); memDC.FillRect(CRect(0, 0, 200, 200), &brush); Sleep(1000);//Эта строчка показывает, что прорисовка график на экране лишь малое время, а остальное ничего нет memDC.Rectangle(0,0,200,200); memDC.MoveTo(0,0); memDC.LineTo(200,200); // теперь копируй на контекс устройства BOOL result = dc.BitBlt(0, 0, 200, 200, &memDC, 0, 0, SRCCOPY); if(!result) AfxMessageBox("Ошибка"); // не забудь удалить memDC.SelectObject(OldBitmap); memDC.DeleteDC(); DeleteObject(bmp); if (IsIconic()) { // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle 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; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } |
Сообщ.
#8
,
|
|
|
Пардон пардон ты знаешь я попробовал что-то не очень ускорилось 8-(((
Я даже так сделал BOOL CTestDlg::OnEraseBkgnd( CDC* pDC ) { CDC memDC; if(!memDC.CreateCompatibleDC(pDC)) return false; CBitmap bmp; if(!bmp.CreateCompatibleBitmap(pDC, 200, 200)) { memDC.DeleteDC(); return false; } CBitmap * OldBitmap = memDC.SelectObject(&bmp); CBrush brush; brush.CreateSolidBrush(RGB(255, 255, 255)); memDC.FillRect(CRect(0, 0, 200, 200), &brush); memDC.MoveTo(0, 0); memDC.LineTo(200,200); bool result = pDC->BitBlt(0, 0, 200, 200, &memDC, 0, 0, SRCCOPY); if(!result) AfxMessageBox("error"); memDC.SelectObject(OldBitmap); memDC.DeleteDC(); bmp.DeleteObject(); return true; } все равно медленно Могу посоветовать перейти на CFormView ну короче на форме сделать у меня есть такое вроде не тормозит тьфу, тьфу или ищи радивальное решение Вот .. |
Сообщ.
#9
,
|
|
|
пардон РАДИКАЛЬНОЕ
|
Сообщ.
#10
,
|
|
|
Я переопределил так
BOOL CFastDrawDlg::OnEraseBkgnd(CDC* pDC) { return TRUE; } Стало быстро, все круто, но не прорисовываются элементы диалога |
Сообщ.
#11
,
|
|
|
Вообще лучше не рисуй прямо в диалоге, это глупо. Создай отдельное окно и в нем и рисуй.
|
Сообщ.
#12
,
|
|
|
2Codemaster:
Ты меня опередил. 2Z@: Делай так! На диалоге создавай статик (Static), там и рисуй график! Можешь, ко всему прочему, еще ловить и мессагу WM_CTLCOLORSTATIC, ... |