Здравствуйте, 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;
}
Попытаюсь весь мустор посторонний выкинуть, все к делу не относящееся, чтобы собрать новый проект чисто для проверки отрисовки.