Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перерисовка окна в MFC  (Прочитано 24934 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« : 05-09-2011 14:53 » 

Доброго времени суток.
Есть окно, унаследованное от CFormView. При вертикальной прокрутке формы возникает проблема: не полностью стирается фон, в результате чего получается эффект "наложения" - т.е. текст вышестоящего static'a накладывается на текст нижестоящего(см. рис).

Пытался решить проблему применением Invalidate и UpdateWindow - не получилось.
Есть ли какие-нибудь еще пути решения задачи?

* Наложение.png (0.73 Кб - загружено 3268 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 05-09-2011 15:00 » 

>>Пытался решить проблему применением Invalidate и UpdateWindow - не получилось.

покажи код
Записан

sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 05-09-2011 15:40 » 

Перегруженная операция прокрутки:
Код:
         void CFormR::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
        {
                CFormView::OnVScroll(nSBCode,nPos, pScrollBar );
                this->UpdateWindow();
                // this->Invalidate();
        }
« Последнее редактирование: 05-09-2011 15:53 от sinsin » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 05-09-2011 19:46 » 

Код:
        void CFormR::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
        {
               CFormView::OnVScroll(nSBCode,nPos, pScrollBar );
               Invalidate(1);
               UpdateWindow();
        }

только моргать будет нещадно. Но это уже другая история, ищи по форуму
Записан

sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 06-09-2011 04:54 » 

Алексей1153++,  не помогло. Все равно происходит наложение.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 06-09-2011 05:01 » 

sinsin, прикрепи проектик, где видно проблему. Покопаемся )
Записан

sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 06-09-2011 06:58 » 

Проблема с наложением решена с помощью
Код:
        this->RedrawWindow(NULL,0,RDW_ALLCHILDREN|RDW_UPDATENOW|RDW_ERASENOW|RDW_ERASE|RDW_FRAME);
Однако проявилась другая проблема: при определенном положении прокрутки часть контролов "выпадает" из процедуры перерисовки, т.е. при наведении на них мыши становится полностью черными.

 При возврашении полосы прокрутки в начальное положение и наведении мышки checkbox'сы прорисовываются нормельно, т.е. черные пятна исчезают.

* Наложение 2.png (3.49 Кб - загружено 3039 раз.)
« Последнее редактирование: 06-09-2011 07:02 от sinsin » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 06-09-2011 07:55 » 

sinsin, прикрепи проектик, где видно проблему. Покопаемся )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 06-09-2011 08:00 » 

sinsin, вот экзешник, созданный с использованием одного только мастера - никаких проблем с прокруткой.

Так что скорей всего ты не там копаешь. Поэтому давай с самого начала, что хотел сделать, что есть, и что ты при этом придумывал.

* FormViewTest.zip (835.21 Кб - загружено 902 раз.)
« Последнее редактирование: 06-09-2011 08:01 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 06-09-2011 08:30 » 

Имеется MDI приожение, в нем 5 классов, унаследованных от CFormView. На каждой форме 70-80 контролов - checkbox'сы, static'и и т.д.
Перегружена операция ОnCtlColor (для выделение контролов нескольких цветом)
Код:
 HBRUSH CFormR::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr;

switch (pWnd->GetDlgCtrlID())
{
case IDC_EDIT1:
case IDC_EDIT17:
case IDC_EDIT3:
case IDC_EDIT19:
case IDC_EDIT27:
hbr=my_color;
break;
default:
hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
break;
}

switch (pWnd->GetDlgCtrlID())   
{
// Set the text color to red

case IDC_EDIT1:
case IDC_EDIT17:
case IDC_EDIT3:
case IDC_EDIT19:
case IDC_EDIT27:
pDC->SetTextColor(RGB(0,255,0));
pDC->SetBkColor(RGB(0,0,0));
hbr=my_color;
break;
 
  case  IDC_STATIC_1: //  канал 1
            pDC->SetBkColor(RGB(255,0,0));  // красный
//pDC->SetBkMode(TRANSPARENT);
        break;
  case  IDC_STATIC_2: //  канал 2
            pDC->SetBkColor( RGB(0,0,255) ); // голубой
//pDC->SetBkMode(TRANSPARENT);
    break;
  case  IDC_STATIC_3: //  канал 3
            pDC->SetBkColor( RGB(255,0,255) ); // MAGENTA
//pDC->SetBkMode(TRANSPARENT);
//hbr = m_brush;
        break;
  case  IDC_STATIC_4: //  канал 4
    pDC->SetBkColor( RGB(0,255,255) ); // CYAN
//pDC->SetBkMode(TRANSPARENT);
           // m_brush.DeleteObject();
           // m_brush.CreateSolidBrush( RGB(0,255,255) ); // CYAN
//hbr = m_brush;
        break;

  default:
break;
}


return hbr;
}

Вот в общем-то и все. При отрубании перегруженной операции ОnCtlColor эффект все-равно остается.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 06-09-2011 09:46 » 

Значит логично предположить, что причина не в ОnCtlColor.

sinsin, будем играть в гестапо, или всё-таки сам всё по-хорошему расскажешь? Ага

Пошёл пока точить иголки и ставить щипцы на огнь. Так, на всякий случай.

ps Пример с OnCtlColor. И опять всё нормально работает:

* TestFormView.zip (170.21 Кб - загружено 1011 раз.)
« Последнее редактирование: 06-09-2011 10:05 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 06-09-2011 11:11 » 

Если б я знал, давно бы признался. Улыбаюсь
« Последнее редактирование: 06-09-2011 11:59 от sinsin » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 06-09-2011 11:38 » 

Дык, понятное дело, что ты не знаешь в чём причина. Но чтобы её найти, необходимо знать, что ты делаешь не так, где ты пошёл не по стандартному пути. А как это НАМ здесь выяснить? Я уже попытался подсчитать количество скворцов на антенне за окном, но никакой корреляции с твоей проблемой не получилось.

Зачем рассказывать о догадках, почему это не работает, если ты уже сам их проверил?

Поэтому ещё раз. Рассказывай что ты хочешь сделать, и как ты это делаешь. Возьми за основу примеры, которые работают. И рассказывай, как ты их довёл до нерабочего состояния. Насколько я знаю, ни один мастер не создаёт с нуля проект с 80 контролами и 5-ю вьюхами. Значит, в какой-то момент ты что-то начал делать ручками. Вот с этого момента неторопясь, методом последовательных приближений.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 06-09-2011 12:06 » 

По шагам:
1. Создаю класс от CFormView (точнее от уже до меня создан).
2. Добавляю шаблоны в конструкторе класса документа
Код:
   m_pFormRTemplate =  // Добавляем диалог выполнения Sin
   new CMultiDocTemplate(IDD_DIALOG_R,
    RUNTIME_CLASS(СmDoc),
    RUNTIME_CLASS(CChildFrame),
    RUNTIME_CLASS(CFormR));
   pApp->AddDocTemplate(m_pFormRTemplate);
3. При клике по соотв. пункту меню инициализирую и создаю форму (обработчик в СmDoc)
Код:
  CFrameWnd* pFrame = m_pFormRTemplate->CreateNewFrame(this, NULL);
  ASSERT(pFrame);
  m_pFormRTemplate->InitialUpdateFrame(pFrame, this);
Вообще бага возникла при переводе проги из 2003 студии в 2010, в 2003 её не было.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 06-09-2011 12:12 » 

Аха, уже ближе к телу. Что ты менял при конвертировании в 2010 ты конечно же не помнишь? А копия оригинала в формате 2003 не сохранилась?

Проект очень большой? Может имеет смысл просто сделать проект в 2010 студии и добавить к нему файлы? Мои примеры я делал 1-ый в 2010, а 2-ой в 2003 студии (а то чёт екзешник большой получился), ща попробую конвертнуть из 2003 в 2010.

Добавлено через 4 минуты и 26 секунд:
Сконвертил. Всё работает и после компиляции в 2010-ой.
« Последнее редактирование: 06-09-2011 12:16 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 06-09-2011 12:25 » 

Проект большой, копия сохранилась. При помощи ActiveFileCompare (утилита для сравнения файлов построчно) по строкам сравнивал классы документа, форм и файлы ресурсов. Совпадает все (в ресурсном файле разве что накоторые строки по другому перенесены).
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 06-09-2011 12:41 » 

А нельзя ли в оригинале выбросить всё кроме ресурсов вьюх и их классов. Ну чтобы только функциональность отображения и переключения между вьюхами осталась.
Потому что иначе, я так думаю, это будет гадание на кофейной гуще.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 06-09-2011 12:46 » new

А толку? Отличия только в .rc, да и то в виде переносов строк.
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 06-09-2011 12:47 » 

опции компиляторОВ-линкера сравните.
при конвертации меняются только они.
еще меняется версия MFC либ соответственно.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 06-09-2011 12:54 » 

А толку? Отличия только в .rc, да и то в виде переносов строк.

Значит так, моё мнение такое, что требуемая функциональность - вещь довольно элементарная. Даже с учётом конвертации. Поэтому я думаю, что ты где-то накосячил не специально, а нарочно, и не заметил этого. "Толк" такой, что получив исходный материал, можно с ним поиграться - затрата времени минимальная. А сидеть и гадать на кофейной гуще, что ты там мог накосячить нет ни времени, ни желания. Сам то ты себе как это представляешь? Не астрологи мы тут, не телепаты. Увы.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sinsin
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 08-09-2011 13:01 » 

Баг найден Улыбаюсь, он заключался в использовании ComCtl.dll 6-ой версии в неюникодовком проекте: в stdafx.h  строка
Код:
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
не была заключена в
Код:
#ifdef _UNICODE
#endif
Всем участвовавшим в обсуждении большое спасибо.
Небольшой проект созданный  с подобным багом находится в приложении (вид бага - на рисунке).
Возник еще такой вопрос: можно ли как-то использовать стили в неюникодовском проекте?


* 444.zip (148.61 Кб - загружено 952 раз.)
* Наложение 3.png (50.6 Кб - загружено 1046 раз.)
« Последнее редактирование: 08-09-2011 14:24 от sinsin » Записан
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #21 : 11-10-2011 09:25 » 

Лично я бы сделал Invalidate(); и забуферизировал бы окошко. Наверняка в MFC есть аналог  WTLного CDoubleBufferImpl или CDoubleBufferWindowImpl.
« Последнее редактирование: 11-10-2011 09:27 от dark_rain » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines