Problem z CTabCtrl

0

Witam!
Mam następujący problem i proszę o pomoc.
Tworzę okno dialogowe ?Ustawienia? mające umożliwiać konfigurację ustawień wyświetlania i wczytywania plików w aplikacji MDI.
Ponieważ opcji jest sporo i dodatkowo są one podzielone na kategorie postanowiłem użyć kontrolkę CTabCtrl. Mój sposób wykorzystania CTabCtrl miał polegać na stworzeniu kilku okien dialogowych typu child i wyświetlanie ich na odpowiednich zakładkach. W tym celu stworzyłem prostą klasę dziedziczącą publicznie po CTabCtrl i dorzuciłem jej metodę obsługującą wyświetlanie odpowiednich dialogów w obszarze CTabCtrl. Wszystko jest pięknie i ładnie do momentu, gdy nie nacisnę przycisku Enter w czasie edycji ustawień na oknie dialogowych wrzuconym do CTabCtrl, w tym momencie okno to znika (okno główne ?Ustawienia? jak i kontrolka CTabCtrl są dalej widoczne ? brak tylko wyświetlanego wcześniej w danej zakładce okna typu child) .
Nie mogę dojść dla czego tak się dzieje i gdzie jest błąd.
Proszę wiec o pomoc i z góry dziękuję za zainteresowanie.
P.S. - Piszę w VSC++ 2005 (z wykorzystaniem MFC)
Oto kod klasy dziedziczącej po CTabCtrl

CSettingTab::CSettingTab()
{
	m_nLastIndex =0;
	m_pTabDlg[0] = NULL;
}


CSettingTab::~CSettingTab()
{
	for(int i = 0; i < TABSETTINGCOUNT; i++)
	{
		delete m_pTabDlg[i];
		m_pTabDlg[i] = NULL;
	}


}


BEGIN_MESSAGE_MAP(CSettingTab, CTabCtrl)
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()



// CSettingTab message handlers


BOOL CSettingTab::Initial()
{
	BOOL bResult = true;
	m_pTabDlg[0] = new CSettingTab1();
	for(int i = 0; i < TABSETTINGCOUNT && bResult; i++)
	{
		if((bResult = m_pTabDlg[i]->Create(IDD_SETTINGTAB1,this)))
		{
			m_pTabDlg[i]->SetParent(this);
		}
	}

	if(!bResult)
		return bResult;
	//Ukrywa wszystkie okna poza pierwszym
	m_pTabDlg[0]->ShowWindow(SW_SHOW);
	for(int i =1; i < TABSETTINGCOUNT; i++)
		m_pTabDlg[i]->ShowWindow(SW_HIDE);

	this->SetCurSel(0);

	if(bResult)
		SetRectangle();

	return bResult;
}

void CSettingTab::SetRectangle()
{
	
	CRect tabRect, itemRect;
	int nX, nY, nXc, nYc;
	GetClientRect(&tabRect);
	GetItemRect(0,&itemRect);

	nX = itemRect.left + 3;
	nY = itemRect.bottom + 5;
	nXc = tabRect.right - itemRect.left -4;
	nYc = tabRect.bottom - nY - 1;

	//Ustalenie pozycji okien
	m_pTabDlg[0]->SetWindowPos(&wndTop,nX,nY,nXc,nYc,SWP_SHOWWINDOW);
	for(int i = 0; i < TABSETTINGCOUNT; i++)
		m_pTabDlg[i]->SetWindowPos(&wndTop,nX,nY,nXc,nYc,SWP_HIDEWINDOW);
	m_pTabDlg[0]->ShowWindow(SW_SHOW);


}
void CSettingTab::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default

	CTabCtrl::OnLButtonDown(nFlags, point);
	//sprawdzam które zakładka została naciśnięta
	int nIndex = GetCurFocus();

	if(nIndex != m_nLastIndex)
	{
		m_pTabDlg[m_nLastIndex]->ShowWindow(SW_HIDE);
		m_pTabDlg[nIndex]->ShowWindow(SW_SHOW);
		m_nLastIndex = nIndex;
	}
	CTabCtrl::OnLButtonDown(nFlags, point);
}

P.S.2
W tej chwili jest tylko jedna zakładka.
Nie dodawałem ich na razie więcej nie mogąc poradzić sobie z problemem znikania okna.

0

Do zdarzenia PreTranslateMessage dla okna znikającego dodaj kod

if (pMsg->message == WM_KEYDOWN)
        {
                if ((pMsg->wParam == VK_ESCAPE) || (pMsg->wParam == VK_RETURN) || (pMsg->wParam == VK_LCONTROL))
                {
                        pMsg->wParam = NULL;
                }
        }	
	return CDialog::PreTranslateMessage(pMsg);
}

Jest wiele sposobów na uniknięcie tego zjawiska to jest jeden z nich :)

0

Wielkie dzięki.
Pomogło :)
Ja przez cały czas próbowałem obsłużyć komunikat WM_KEYDOWN definiując dla niego metodę bezpośrednio z pod AppWizard?a jakoś nie wpadłem na przysłonięcie funkcji PreTranslateMessage obsłużenie komunikatu przy jej pomocy.
Jeszcze raz wielkie dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1