Re[12]: Проблемы с перерисовкой, хотя OnPaint() есть
От: Darked  
Дата: 27.04.05 18:12
Оценка:
Здравствуйте, SaloS, Вы писали:


D>> Не, WM_ERASEBKND — просто убирает флики.

SS>Вообще WM_ERASEBKND не убирает флики, оно рисует фон. То есть, если ты хочешь чтобы окно стало прозрачным, просто при обработке этого сообщения ничего не делай, вот и все. А для уборки фликов делают немного по-другому. Всю перерисовку окна заключают в обработчик WM_ERASEBKND, причем сначала рисуют в памяти, а потом блитят в HDC который тебе приходит. вот.

D>> Я проверил, такая фигня происходит на любой вкладке от CTabCtrl. Если я рисую на CDialogImpl, на котором находится CTabCtrl, то все ок. Где — то тут с сообщениями лажа, или хз.

SS>А парентом для вкладки является CTabCtrl? Если да, то проверь, чтобы у таб контрола не менялись размеры, и при минимайзе область, где ты рисуешь не была невидимой. Потому, что если ты рисуешь на невидимой области, то то что ты нарисуешь тоже будет невидимым

В обработчике WM_ERASEBKND у меня стоит только return 1, что убрало перерисовку фона, а соотвественно и флики (по — крайней мере в данном случае).
Да, вкладки у меня на CTabCTrl. Чего — то я не понял про минимайз, объясни пжалуста по-подробнее.


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

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

    tab.GetClientRect(&rec);

    m_TabType.Create(tab.m_hWnd, &rec , NULL, TCS_TABS |TCS_RAGGEDRIGHT | WS_CHILD | WS_VISIBLE , 0, 0U, NULL);
    
    TC_ITEM TabCtrlItem = {0};
    TabCtrlItem.mask = TCIF_TEXT;
    _ASSERT(str.LoadString(IDS_STRING10271)) ;
    TabCtrlItem.cchTextMax = str.GetLength();
    TabCtrlItem.pszText = (LPTSTR) (LPCTSTR) str;

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

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

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

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

    
    RECT rc ;
    m_TabType.GetWindowRect(&rc) ; 
    m_TabType.AdjustRect(FALSE, &rc);
    ScreenToClient(&rc) ;
    
    //создаем объект интегрального диалога
    m_Integral = new CIntegral(pParent);
    m_Integral->Create(m_hWnd);
    m_Integral->MoveWindow(&rc);
    m_Integral->ShowWindow(SW_SHOWNORMAL) ;

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

    //создаем объект диалога настройки цветов фильтра
    m_ColorSet = new CColourSet(pParent);
    m_ColorSet->Create(m_hWnd);
    m_ColorSet->ModifyStyle(0, WS_TABSTOP | WS_EX_CONTROLPARENT);
    m_ColorSet->MoveWindow(&rc);
    m_ColorSet->ShowWindow(SW_HIDE);
    return true;
}

LRESULT w32View::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//    ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
    int cur_pos;
    cur_pos = m_TabType.GetCurSel();
    switch(cur_pos)
    {
    case 0:            // активна вкладка с интегральным диалогом
        m_Integral->Invalidate();
        break;
    case 1:            // активна вкладка с диалогом маски пальцев
        m_Mashtab->Invalidate();
        break;
    case 2:            // активна вкладка с диалогом выбора цветов
        m_ColorSet->Invalidate();
        break;
    }
    
        bHandled = FALSE;
    return 0;
}  

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

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

    return 0;
}


Попытаюсь весь мустор посторонний выкинуть, все к делу не относящееся, чтобы собрать новый проект чисто для проверки отрисовки.
Per aspera ad astra
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.