С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 1
Регистрация: 12.07.2013
Сообщений: 123

Трудности с размещением страниц на CTabCtrl внутри другого CTabCtrl

15.06.2018, 15:34. Показов 726. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На диалоговом окне есть компонент TAB_CTRL1 типа CTabCtrl, на котором расположены несколько страниц--pPage1, pPage2, pOrbitDefinition, pPage5, pPage6 (потомки класса CDialog). И на одной из этих страниц (pOrbitDefinition) расположен другой компонент TAB_CTRL типа CTabCtrl, на которой помещены две страницы pPage3, pPage4 (также потомки класса CDialog).

И возникла проблема с размещением этих двух страниц pPage3 и pPage4 на компоненте TAB_CTRL, расположенном на странице pOrbitDefinition--отладчик бьётся на строке, в которой вызывается функция Create для pPage3.\

В чём причина этого? Как исправить ошибку?

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
BOOL  CFlightToMoonDlg::OnInitDialog()
{
    CPage1 *pPage1;
    CPage2 *pPage2;
    CPage3* pPage3;
    CPage4* pPage4;
    CPage5 *pPage5;
    CPage6 *pPage6;
    COrbitDefinition *pOrbitDefinition;
 
    CDialog::OnInitDialog();
    //
    TCITEM  TabItem;
    TabItem.mask = TCIF_TEXT;
    TabItem.pszText = L"Исходные НУ";
    m_IDC_TAB1.InsertItem(0,&TabItem);
    TabItem.pszText = L"Модель движения";
    m_IDC_TAB1.InsertItem(1,&TabItem);
    TabItem.pszText = L"Определение орбиты";
    m_IDC_TAB1.InsertItem(2,&TabItem);
    TabItem.pszText = L"Расчёт эфемерид";
    m_IDC_TAB1.InsertItem(3,&TabItem);
    TabItem.pszText = L"Прогноз подлёта";
    m_IDC_TAB1.InsertItem(4,&TabItem); 
    CSize  csize;
    csize.SetSize(100,28);
    m_IDC_TAB1.SetItemSize(csize);
    LOGFONT  lf;
    CFont  *pfont;
    memset(&lf,0,sizeof(lf));
    lf.lfHeight = 16;
    lf.lfWidth = 8;
    lf.lfWeight = FW_NORMAL;
    //lf.lfWeight = FW_BOLD;
    lf.lfCharSet = ANSI_CHARSET;
    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf.lfQuality = PROOF_QUALITY;
    lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    wcscpy(lf.lfFaceName,L"MS Sans Serif");
    pfont = new CFont();
    pfont->CreateFontIndirectW(&lf);
    m_IDC_TAB1.SetFont(pfont);
    //
    pPage1 = new CPage1(this);
    pPage2 = new CPage2(this);
    pPage5 = new CPage5(this);
    pPage6 = new CPage6(this);
    pOrbitDefinition = new COrbitDefinition(this);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage2;
    m_IDC_TAB1.SetItem(0,&TabItem);
    VERIFY(pPage2->Create(CPage2::IDD,&m_IDC_TAB1));
    pPage2->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage2->ShowWindow(SW_SHOW);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage1;
    m_IDC_TAB1.SetItem(1,&TabItem);
    VERIFY(pPage1->Create(CPage1::IDD,&m_IDC_TAB1));
    pPage1->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage1->ShowWindow(SW_HIDE);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pOrbitDefinition;
    m_IDC_TAB1.SetItem(2,&TabItem);
    VERIFY(pOrbitDefinition->Create(COrbitDefinition::IDD,&m_IDC_TAB1));
    pOrbitDefinition->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage3 = new CPage3(this);
    pPage4 = new CPage4(this);
    pOrbitDefinition->pPage3 = pPage3;
    pOrbitDefinition->pPage4 = pPage4;
    TCITEM  TabItem2;
    TabItem2.mask = TCIF_TEXT;
    TabItem2.pszText = L"Измерения";
    pOrbitDefinition->m_IDC_TAB1.InsertItem(0,&TabItem2);
    TabItem2.pszText = L"Краевая задача";
    pOrbitDefinition->m_IDC_TAB1.InsertItem(1,&TabItem2);
    CSize  csize2;
    csize2.SetSize(100,28);
    pOrbitDefinition->m_IDC_TAB1.SetItemSize(csize2);
    LOGFONT  lf2;
    CFont  *pfont2;
    memset(&lf2,0,sizeof(lf2));
    lf2.lfHeight = 16;
    lf2.lfWidth = 8;
    lf2.lfWeight = FW_NORMAL;
    lf2.lfCharSet = ANSI_CHARSET;
    lf2.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf2.lfQuality = PROOF_QUALITY;
    lf2.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    wcscpy(lf2.lfFaceName,L"MS Sans Serif");
    pfont2 = new CFont();
    pfont2->CreateFontIndirectW(&lf2);
    pOrbitDefinition->m_IDC_TAB1.SetFont(pfont2);
    //
    pOrbitDefinition->ShowWindow(SW_HIDE);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage5;
    m_IDC_TAB1.SetItem(3,&TabItem);
    VERIFY(pPage5->Create(CPage5::IDD,&m_IDC_TAB1));
    pPage5->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage5->ShowWindow(SW_HIDE);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage6;
    m_IDC_TAB1.SetItem(4,&TabItem);
    VERIFY(pPage6->Create(CPage6::IDD,&m_IDC_TAB1));
    pPage6->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage6->ShowWindow(SW_HIDE);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage3;
    m_IDC_TAB1.SetItem(0,&TabItem2);
    VERIFY(pOrbitDefinition->pPage3->Create(CPage3::IDD,&(pOrbitDefinition->m_IDC_TAB1))); // здесь бьётся программа
    pOrbitDefinition->pPage3->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pOrbitDefinition->pPage3->ShowWindow(SW_SHOW);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem2.lParam = (LPARAM)pPage4;
    m_IDC_TAB1.SetItem(1,&TabItem2);
    VERIFY(pOrbitDefinition->pPage4->Create(CPage4::IDD,&(pOrbitDefinition->m_IDC_TAB1)));
    pOrbitDefinition->pPage4->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pOrbitDefinition->pPage4->ShowWindow(SW_HIDE);
    return  TRUE;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.06.2018, 15:34
Ответы с готовыми решениями:

Трудности с CTabCtrl
Я на свой диалог повесил табконтрол IDC_TAB1 (тип CTabCtrl, переменная m_IDC_TAB1). На этот табконтрол я поместил две...

Перехват сообщений от CTabCtrl
Пишу свой класс на основе CTabCtrl и столкнулся с проблемой. Необходимо определить когда пользователь добавил или удалил вкладки....

CTabCtrl в модальном окне (MFC)
В приложении МФС диалог с настройками разросся до неприличного размера, ну и решил я сделать окошко с вкладками, опыта у меня правда нет...

4
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
15.06.2018, 16:33
Может проблема и не в этом, но правильнее было бы создавать элементы управления относящиеся к диалогу COrbitDefinition в функции COrbitDefinition::OnInitDialog.
0
3 / 3 / 1
Регистрация: 12.07.2013
Сообщений: 123
18.06.2018, 11:25  [ТС]
Я перенёс код вставки подстраниц pPage3 и pPage4 на страницу pOrbitDefinition внутри функции COrbitDefinition::OnInitDialog :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
BOOL  COrbitDefinition::OnInitDialog()
{
    CDialog::OnInitDialog();
    TCITEM  TabItem2;
    TabItem2.mask = TCIF_TEXT;
    TabItem2.pszText = L"Измерения";
    m_IDC_TAB1.InsertItem(0,&TabItem2);
    TabItem2.pszText = L"Краевая задача";
    m_IDC_TAB1.InsertItem(1,&TabItem2);
    pPage3 = new CPage3(&m_IDC_TAB1);
    pPage4 = new CPage4(&m_IDC_TAB1);
    CSize  csize2;
    csize2.SetSize(100,28);
    m_IDC_TAB1.SetItemSize(csize2);
    LOGFONT  lf2;
    CFont  *pfont2;
    memset(&lf2,0,sizeof(lf2));
    lf2.lfHeight = 16;
    lf2.lfWidth = 8;
    lf2.lfWeight = FW_NORMAL;
    lf2.lfCharSet = ANSI_CHARSET;
    lf2.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf2.lfQuality = PROOF_QUALITY;
    lf2.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    wcscpy(lf2.lfFaceName,L"MS Sans Serif");
    pfont2 = new CFont();
    pfont2->CreateFontIndirectW(&lf2);
    m_IDC_TAB1.SetFont(pfont2);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem2.lParam = (LPARAM)pPage3;
    m_IDC_TAB1.SetItem(0,&TabItem2);
    ASSERT(pPage3->Create(CPage3::IDD,&m_IDC_TAB1)); // здесь бьётся программа
    pPage3->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER); 
    pPage3->ShowWindow(SW_SHOW);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem2.lParam = (LPARAM)pPage4;
    m_IDC_TAB1.SetItem(1,&TabItem2);
    ASSERT(pPage4->Create(CPage4::IDD,&m_IDC_TAB1));
    pPage4->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage4->ShowWindow(SW_HIDE); 
    m_IDC_TAB1.SetCurSel(0);
    return  TRUE;
}

И на строке
C++
1
ASSERT(pPage3->Create(CPage3::IDD,&m_IDC_TAB1));
программа бьётся--выскакивает сообщение

Debug Assertion Failed!
Program: C:\Windows\system32\mfc110ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mf c\dlgdata.cpp
Line: 40
Что это означает? Как исправить эту ошибку?
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
18.06.2018, 17:03
Значит функция Create вернула ошибку.
Причины могут быть разные. Например, ресурса нет с нужным ID или в функции CPage3::OnInitDialog вызван EndDialog. Есть ли вообще функция CPage3::OnInitDialog, если есть поставьте в её начале брекпоинт и запустите программу. Если остановится на брекпоинте, то пройдитесь по шагам до завершения OnInitDialog.
0
3 / 3 / 1
Регистрация: 12.07.2013
Сообщений: 123
20.06.2018, 10:07  [ТС]
Проблема решена.

В классе CPage3 в функции DoDataExchange я убрал вызовы функций DDX_Control для тех компонент этого класса, которые я удалил ранее. И всё у меня нормально заработало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2018, 10:07
Помогаю со студенческими работами здесь

CTabCtrl - как с ним работать?
Попытался разобраться с этим компонентом, да застрял. Задачка: разместить на разных вкладках объекта различные компоненты (скорее всего,...

Как работать создавать вкладки с CTabCtrl?
Приветствую! MFC. У меня возникла необходимость создать вкладки в диалоге, но работа с CPropertySheet меня не устраивает. ...

При создании вкладок с использованием CTabCtrl программа падает
Приветствую! Разбираюсь с CTabCtrl. Собственно нашел пример в инете сделал все по инструкции - не пашет. верней падает на строчке кода ...

CTabCtrl - error C2061: syntax error : identifier 'CTabPage1'
Сделал все как здесь написано http://www.cyberguru.ru/cpp-sources/ui/rabota-s-property-sheet-v-mfc.html выдает в 9й и 18й строках - error...

Трудности с программным размещением компонента на странице
Я создал диалоговое приложение на Visual C++ 2012 с использованием MFC. В этом приложении на диалоговом окне находится CTabCtrl, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru