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