MFC CTabCtrl

Annetka

Хочу сделать в своём приложении диалог с таб контролом, при попытках внедрить найденные в интернете (например http://www.codeguru.com/Cpp/controls/controls/tabcontrols/ar... примеры использования CTabCtrl не создаются окна страниц для Таб контрола, какие здесь могут быть нюансы?

4223080

Увы, табконтрол в MFC реализован довольно .... э-э-э... странно в плане удобства его использования. Я в свое время решил вместо него использовать связку CPropertySheet + CPropertyPage. Однако они тоже реализованы не совсем так, как мне того хотелось бы, в частности страницы табов всегда развернуты на все окно. Чтобы избавится от этого я в методе CPropertySheet::OnInitDialog получал указатель на табконтрол и менял его размер:

    // Изменим размер TabControl'а
    CTabCtrl *pTabCtrl = GetTabControl;
    long TabCtrlRight;
    RECT rc;
    PageInfo.GetDlgItem(IDC_POS_MARKER2)->GetWindowRect(&rc);
    TabCtrlRight = rc.left;
    pTabCtrl->GetWindowRect(&rc);
    rc.right = TabCtrlRight;
    ScreenToClient(&rc);
    pTabCtrl->MoveWindow(&rc);
    pTabCtrl->UpdateWindow;

Вот-с... примерно так
ЗЫ: В обычном табконтроле, насколько я помню вообще нет страниц. Вместо этого приложению посылается сообщение, что, дескать, нажат/выбран такой-то таб. Обрабатывая это сообщение приложение может сделать часть элементов видимвми, а другую часть — невидимыми, создавая таким образом иллюзию перелистывания. Вот только в редакторе ресурсов такой диалог делать — сомнительное удовольствие, да и обработка сообщения — нудная и рутинная операция :/

Annetka

Проблеме не в неудобстве, а в том, что оно вообще не работает, если делать, как предлагается в примерах. Разница в том что делаю я и в проекте примера вроде бы только в том, что у меня MDI приложение, в котором есть диалог с таб контролом, а в примере dialog based приложение.

4223080

Я дописал свой предыдущий ответ. Это оно?

Annetka

Да, страниц там нет, они создаются отдельно, проблема в том, что когда я пытаюсь сделать ей Create оно возвращает FALSE, соответственно страницу проблематично сделать потом видимой или невидимой.

4223080

Сейчас посмотрел примеры на кодегуру (подеагонале) — там как раз руками сделан механизм, уже реализованный в CPropertySheet. Нужен тебе еще один велосипед?

4223080

Где ты вызываешь функцию CMyTabCtrl::Init?

Annetka

Возможно так и следует сделать, но всё же интересно из-за чего такая несправедливость происходит.

Annetka

Там же в OnInitDialog основного диалога

kokoc88

при попытках внедрить найденные в интернете
Не понятно, что ты подразумеваешь под словом внедрить. Приведи пример своего кода, который не работает. Только как можно сильнее его упрости перед этим.

Annetka

CMyTabContainingDialog - класс основного диалога.
{
...
CDialog* m_tabPage;
CTabCtrl m_Tab;
....
};
CMyTabContainingDialog::CMyTabContainingDialog
{
....
m_tabPage = new Page;
....
}
CMyTabContainingDialog::OnInitDialog
{
....
m_tabPage->Create(IDD_TAB_PAGE,&m_Tab); //проблема в том, что вот этот метод возвращает 0.
.....
}

kokoc88

m_tabPage->Create(IDD_TAB_PAGE,&m_Tab)
Ты m_Tab создал перед этим? Приведи код OnInitDialog полностью.

Annetka

void CMyTabContainingDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyTabContainingDialog)
DDX_Control(pDX, IDC_TAB1, m_Tab);
//}}AFX_DATA_MAP
}
В OnInitDialog он уже создан

kokoc88

Весь приведённый тобою код работает.

Annetka

?

kokoc88

Ровно то, что я написал. Если хочешь, чтобы я смог помочь, приводи ещё код.

Annetka

Он работает в скачанном примере, но не работает в моём приложении, принципиальных отличий я не вижу вроде бы, но по всей видимости они есть

Annetka

Ну тогда содержимое каких именно методов?

kokoc88

но не работает в моём приложении
Значит, покажи код приложения. Попробуй вместо new CPage сначала написать new CDialog. Если создаётся, значит ошибка в классе CPage.

Annetka

/***************** Page class **************************
class EditPage1 : public CDialog
{
// Construction
public:
EditPage1(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(EditPage1)
enum { IDD = IDD_EDIT_PAGE1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(EditPage1)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(EditPage1)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP
};
/*******************************************
Вроде бы там негде ошибаться.

kokoc88

Вроде бы там негде ошибаться.
Ну что значит негде? Ясное дело, что ты где-то в коде ошибся. Я только что сам создал MFC приложение, добавил таб контрол, создал диалог и положил его в табконтрол. У меня всё работает.

Annetka

Могут быть какие-либо различия от того что в одном случае это приложение основанное на диалоге (когда работает а в другом мультидокументное ( когда не работает)?

kokoc88

Не могут.

Annetka

Там какие-то контролы на странице жить мешали, когда я всё оттуда убрал, добавилось.

kokoc88

Там какие-то контролы на странице жить мешали, когда я всё оттуда убрал, добавилось.
По твоим словам я понял, что ты ставил на диалог что-то типа Rich Edit'а, не вызвав AfxInitRichEdit или ActiveX контрол без вызова инициализации?..

Annetka

Да, рич эдит мешал

kokoc88

Да, это заметить можно только по внешнему виду. Я уже забыл, что такая проблема бывает, VS2005 вроде как добавляет инициализацию по умолчанию, да и не писал я под MFC уже сколько лет...
Оставить комментарий
Имя или ник:
Комментарий: