Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 11.03.2019, 15:45   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 80
Репутация: 10
По умолчанию Трудности с CTabCtrl

Я работаю в среде MS Visual Studio 2012.

Я на свой диалог повесил табконтрол IDC_TAB1 (тип CTabCtrl, переменная m_IDC_TAB1).
На этот табконтрол я поместил две закладки--"Исходные НУ" и "Расчёт". Каждой из этих закладок соответствует по одной странице (диалогу). Обе эти страницы пока пустые (без компонентов), так как я хотел бы, чтобы первоначально просто нормально бы работал этот табконтрол.

Первоначально табконтрол находится на странице "Исходные НУ". При нажатии на страницу "Расчёт" в отладчике появляется два раза сообщение--в функции OnTcnSelchangingTab1 и в функции OnTcnSelchangeTab1:

Цитата:
Debug Assertion Failed!
Program: C:\WINDOWS\SYSTEM32\mfc110d.dll

File: f:\dd\vctools\vc7libs\ship\atlmfc\s rc\mfc\winocc.cpp

Line: 329

После этого тем не менее происходит переход и отображение диалога "Расчёт".

Если же на диалоге "Расчёт" нажать на страницу "Исходные НУ", то также в отладчике будет два раза появляться точно такое же сообщение об ошибке--в функции OnTcnSelchangingTab1 и в функции OnTcnSelchangeTab1, после чего происходит переход и отображение диалога "Исходные НУ".

В чём причина этого? Как сделать так, чтобы этого сообщения не появлялось?

Код:

Код:
BOOL CSO_LifeTimeDlg::OnInitDialog()
{
    CNUDialog *pNUPage;
    CCalcDialog *pCalcPage;

    CDialogEx::OnInitDialog();
    // Добавление пункта "О программе..." в системное меню.

    // IDM_ABOUTBOX должен быть в пределах системной команды.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Задает значок для этого диалогового окна. Среда делает это автоматически,
    //  если главное окно приложения не является диалоговым
    SetIcon(m_hIcon, TRUE);            // Крупный значок
    SetIcon(m_hIcon, FALSE);        // Мелкий значок

    // TODO: добавьте дополнительную инициализацию
    TCITEM  TabItem;
    TabItem.mask = TCIF_TEXT;
    TabItem.pszText = "Исходные НУ";
    m_IDC_TAB1.InsertItem(0,&TabItem);
    TabItem.pszText = "Расчёт";
    m_IDC_TAB1.InsertItem(1,&TabItem);
    pNUPage = new CNUDialog(this);
    pCalcPage = new CCalcDialog(this);
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pNUPage;
    m_IDC_TAB1.SetItem(0,&TabItem);
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pCalcPage;
    m_IDC_TAB1.SetItem(1,&TabItem); 
    return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}


void CSO_LifeTimeDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: добавьте свой код обработчика уведомлений
    int  nTab = m_IDC_TAB1.GetCurSel();
    TC_ITEM  tci;
    tci.mask = TCIF_PARAM;
    m_IDC_TAB1.GetItem(nTab,&tci);
    ASSERT(tci.lParam);
    CWnd *pWnd = (CWnd*)tci.lParam;
    //
    pWnd->ShowWindow(SW_SHOW); // здесь выскакивает сообщение об ошибке
    *pResult = 0;
}


void CSO_LifeTimeDlg::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: добавьте свой код обработчика уведомлений
    int  nTab = m_IDC_TAB1.GetCurSel();
    TC_ITEM  tci;
    tci.mask = TCIF_PARAM;
    m_IDC_TAB1.GetItem(nTab,&tci);
    ASSERT(tci.lParam);
    CWnd *pWnd = (CWnd*)tci.lParam;
    //
    pWnd->ShowWindow(SW_HIDE); // здесь выскакивает сообщение об ошибке
    *pResult = 0;
}
erslgoeirjh вне форума   Ответить с цитированием
Старый 11.03.2019, 16:23   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,835
Репутация: 1860
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
pCalcPage = new CCalcDialog(this);
Думаете этого хватит для создания диалога?
waleri вне форума   Ответить с цитированием
Старый 11.03.2019, 18:10   #3
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 80
Репутация: 10
По умолчанию

А что ещё нужно сделать?
erslgoeirjh вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с размещением страниц на CTabCtrl внутри другого CTabCtrl erslgoeirjh Visual C++ 2 20.06.2018 11:09
Трудности с mvc. [Grizzly] PHP 0 26.04.2017 20:45
Трудности с XML Ky3Heu, Общие вопросы Delphi 4 08.06.2011 12:41
BDE. Paradox. Трудности. Genco БД в Delphi 3 25.11.2010 00:03


17:02.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru