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

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

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

Этим я хотел просто получить координаты CTabCtrl, который брошен на форму, что бы в этих координатах потом создать свой CTabCtrl.
  m_TabType.Create(tab.m_hwnd, &rec , NULL, TCS_TABS |TCS_RAGGEDRIGHT | WS_CHILD | WS_VISIBLE , 0, 0U, NULL);

Что, как я теперь понял, есть большая глупость создавать таб контрол во временном окне. Сейчас это выглядит вот так:
         m_TabType.Attach(GetDlgItem(IDC_TAB_TYPE));



SS>tab это окно СTabCtrl или что?

SS>
D>>    tab.GetClientRect(&rec);

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

SS>Что такое m_TabType — это тоже какой-то CTabCtrl, по стилям вроде он, но непонятно
m_TabType — это и есть мой основной таб-контрол.

SS>
    
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);
SS>

SS>Если эта вкладка таба, то почему она создается не на CTabCtrl, а на родительском окне(Cw32View)
Тут я понял косяк, сейчас сделал вот так:

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

    m_Integral = new CIntegral(pParent);
    m_Integral->Create(m_TabType.m_hWnd, rc);
    m_Integral->ShowWindow(SW_SHOWNORMAL) ;

Но почему — то никак не могу заставить их появлятся в начале вкладки, диалог вставляется в нижнем углу, и естесвенно весь не влазит. Сейчас пытаюсь победить. Интересно, что как бы я не получал rc, какими бы функциями, даже если вообще не получаю, появляются диалоги все равно в нижнем углу.

SS>
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();
SS>

SS>Если я правильно понял по коду, ты добавляешь только 2 вкладки, а здесь ты проверяешь 3
3-ю я добавляю динамически потом:

if(Fl_Active)
    {
        _ASSERT(str.LoadString(IDS_COLOR_SET)) ;
        TabCtrlItem.cchTextMax = str.GetLength();
        TabCtrlItem.pszText = (LPTSTR) (LPCTSTR) str;

        TabCtrlItem.iImage = -1;                
        m_TabType.InsertItem(2, &TabCtrlItem);
        m_TabType.SetCurSel(2);
        m_Integral->ShowWindow(SW_HIDE) ;
        m_Mashtab->ShowWindow(SW_HIDE) ;
        m_ColorSet->ShowWindow(SW_SHOWNORMAL) ;
    }
    else
    {
        m_TabType.SetCurSel(0);
        m_TabType.DeleteItem(2);        
        m_Integral->ShowWindow(SW_SHOWNORMAL) ;
        m_Mashtab->ShowWindow(SW_HIDE) ;
        m_ColorSet->ShowWindow(SW_HIDE) ;
    }


SS>
D>>    switch(cur_pos)
D>>    {
D>>    case 0:            // активна вкладка с интегральным диалогом
SS>


SS>
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;
SS>

SS>Зачем делать одно и тоже при различных значениях. если тебе нужно сделать подобное можно было бы написать
SS>case 0:
SS>case 1:
SS>case 2:
SS>Ля-ля-ля три рубля
SS>
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>>       }
SS>

Там не одно и тоже, там разное сочетание SW_HIDE и SW_SHOW.

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