Re[13]: Проблемы с перерисовкой, хотя OnPaint() есть
От: SaloS http://salos.narod.ru/
Дата: 28.04.05 05:30
Оценка:
Здравствуйте, Darked, Вы писали:

D>Здравствуйте, SaloS, Вы писали:


D> В обработчике WM_ERASEBKND у меня стоит только return 1, что убрало перерисовку фона, а соотвественно и флики (по — крайней мере в данном случае).

В этом случае лучше использовать стили WS_CLIPCHILDREN | WS_CLIPSIBLINGS. С помощью их можно запретить перерисовку окна по детьми, что должно помочь (в твоем случае, но не всегда)

D>
D>// функция создания вклодок
D>bool Cw32View::createTabs(void)
D>{
D>    CString str;    
D>    RECT rec;

D>    CWindow tab = CWindow(GetDlgItem(IDC_TAB_TYPE));
D>//    tab.ModifyStyle(0,WS_EX_CONTROLPARENT);

tab это окно СTabCtrl или что?
D>    tab.GetClientRect(&rec);

D>    m_TabType.Create(tab.m_hWnd, &rec , NULL, TCS_TABS |TCS_RAGGEDRIGHT | WS_CHILD | WS_VISIBLE , 0, 0U, NULL);

Что такое m_TabType — это тоже какой-то CTabCtrl, по стилям вроде он, но непонятно
    
D>    TC_ITEM TabCtrlItem = {0};
D>    TabCtrlItem.mask = TCIF_TEXT;
D>    _ASSERT(str.LoadString(IDS_STRING10271)) ;
D>    TabCtrlItem.cchTextMax = str.GetLength();
D>    TabCtrlItem.pszText = (LPTSTR) (LPCTSTR) str;

D>    TabCtrlItem.iImage = -1;                
D>    m_TabType.InsertItem( 0, &TabCtrlItem );

D>    _ASSERT(str.LoadString(IDS_STRING10272)) ;
D>    TabCtrlItem.cchTextMax = str.GetLength();
D>    TabCtrlItem.pszText = (LPTSTR) (LPCTSTR) str;

D>    TabCtrlItem.iImage = -1;                
D>    m_TabType.InsertItem( 1, &TabCtrlItem );

D>    m_TabType.SetCurSel(0);
D>    m_TabType.ShowWindow (SW_SHOW);

    
D>    RECT rc ;
D>    m_TabType.GetWindowRect(&rc) ; 
D>    m_TabType.AdjustRect(FALSE, &rc);
D>    ScreenToClient(&rc) ;

D>    //создаем объект интегрального диалога
D>    m_Integral = new CIntegral(pParent);
D>    m_Integral->Create(m_hWnd);

Если эта вкладка таба, то почему она создается не на CTabCtrl, а на родительском окне(Cw32View)
D>    m_Integral->MoveWindow(&rc);

Почему бы тебе сразу не установить rect прямо в Create
D>    m_Integral->ShowWindow(SW_SHOWNORMAL) ;

D>    //создаем объект диалога маски пальцев
D>    m_Mashtab = new CMashtab(pParent);
D>    m_Mashtab->Create(m_hWnd);
D>    m_Mashtab->MoveWindow(&rc);
D>    m_Mashtab->ShowWindow(SW_HIDE);

D>    //создаем объект диалога настройки цветов фильтра
D>    m_ColorSet = new CColourSet(pParent);

Если эта вкладка таба, то почему она создается не на CTabCtrl, а на родительском окне (Cw32View), для нее нет соотвествующего таба.
D>    m_ColorSet->Create(m_hWnd);
D>    m_ColorSet->ModifyStyle(0, WS_TABSTOP | WS_EX_CONTROLPARENT);
D>    m_ColorSet->MoveWindow(&rc);
D>    m_ColorSet->ShowWindow(SW_HIDE);
D>    return true;
D>}

D>LRESULT w32View::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
D>{
D>//    ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
D>    int cur_pos;
D>    cur_pos = m_TabType.GetCurSel();

Если я правильно понял по коду, ты добавляешь только 2 вкладки, а здесь ты проверяешь 3
D>    switch(cur_pos)
D>    {
D>    case 0:            // активна вкладка с интегральным диалогом

Invalidate в OnPaint, оригинально-с . Вообще так не делают. Если что изменилось, то нужно перерисовывать то что изменилось, а не в перерисовке окна вызывать перерисовку child'а. Если тебе нужно перерисовать child, то перерисовывай только его.
D>        m_Integral->Invalidate();
D>        break;
D>    case 1:            // активна вкладка с диалогом маски пальцев
D>        m_Mashtab->Invalidate();
D>        break;
D>    case 2:            // активна вкладка с диалогом выбора цветов
D>        m_ColorSet->Invalidate();
D>        break;
D>    }
    
D>        bHandled = FALSE;
D>    return 0;
D>}  

D>LRESULT _w32View::OnNotify(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
D>{
D>   ATLASSERT(::IsWindow(m_hWnd));
D>   NMHDR* pNMHDR = (NMHDR*)lParam;

D>       switch(pNMHDR->code)
D>       {
D>       case TCN_SELCHANGING:
D>           break;
D>       case TCN_SELCHANGE:
D>            int cur_sel = m_TabType.GetCurSel();
D>            switch(cur_sel)
D>            {
D>            case 0:
D>                m_Mashtab->ShowWindow(SW_HIDE);
D>                m_ColorSet->ShowWindow(SW_HIDE);
D>                m_Integral->ShowWindow(SW_SHOW);
D>                break;
D>            case 1:
D>                m_Integral->ShowWindow(SW_HIDE);
D>                m_ColorSet->ShowWindow(SW_HIDE);
D>                m_Mashtab->ShowWindow(SW_SHOW);
D>                break;
D>            case 2:
D>                m_Integral->ShowWindow(SW_HIDE);
D>                m_Mashtab->ShowWindow(SW_HIDE);
D>                m_ColorSet->ShowWindow(SW_SHOW);
D>                break;

Зачем делать одно и тоже при различных значениях. если тебе нужно сделать подобное можно было бы написать
case 0:
case 1:
case 2:
Ля-ля-ля три рубля
D>            default:
D>                m_Integral->ShowWindow(SW_HIDE);
D>                m_Mashtab->ShowWindow(SW_HIDE);
D>                m_ColorSet->ShowWindow(SW_HIDE);
D>                break;
D>            }
D>            break;
D>       }

Следующая строчка ненужна, так как установка окна из невидимого состояния в видимое автоматически вызывает перерисовку, и именно из-за этого у тебя и были флики !!!
D>       Invalidate(FALSE);

D>    return 0;
D>}
D>


Что касается невидимости, я просто думал, что ты обрабатываешь WM_SIZE не проверяя minimize окно или нет, и запоминаешь размер окна, которое было минимизировано, соотвественно там были неправильные координаты.
WTL Helper и WTL Wizards помощники для WTL, скачать отсюда http://salos.narod.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.