Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.200.66] |
|
Сообщ.
#1
,
|
|
|
Я работаю в среде 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\src\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; } |