Здравствуйте, 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 окно или нет, и запоминаешь размер окна, которое было минимизировано, соотвественно там были неправильные координаты.