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

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

15.06.2018, 15:34. Показов 733. Ответов 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
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
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
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
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
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru