Нет сообщений от эл. управления на CPropertyPage.
Описываю порядок в котором создал:
1.Модальное диалоговое окно - CDialog.
2.на нем немодальные лист с закладками CPropertySheet.
3.на нем несколько страниц CPropertyPage.
4.На страницах элементы управления – CListCtrl, ClistBox, кнопки, etc.
Проблема состоит в том, что начиная от страниц до элементов управлеия – все они остаются “глухими”, т.е. я не могу получить сообщения от этих элементов. Не могу получить сообщения ни в классе производном от CPropertyPage, ни CPopertySheet, ни CDialog.
Если первый пункт пропустить, то все работает!
Думаю, просто мне не хватает знаний. В чем может быть проблема?
Всем спасибо.
Андрей.
Выход из положения я думаю, уже нашел. ProcessMessageFilter в этом мне поможет.
Но это не решение проблемы, а выход из тупиковой ситуации. Причина не ясна...:(((
Заимел проблему, обращаюсь за помощью.
Описываю порядок в котором создал:
1.Модальное диалоговое окно - CDialog.
2.на нем немодальные лист с закладками CPropertySheet.
3.на нем несколько страниц CPropertyPage.
4.На страницах элементы управления – CListCtrl, ClistBox, кнопки, etc.
Проблема состоит в том, что начиная от страниц до элементов управлеия – все они остаются “глухими”, т.е. я не могу получить сообщения от этих элементов. Не могу получить сообщения ни в классе производном от CPropertyPage, ни CPopertySheet, ни CDialog.
Если первый пункт пропустить, то все работает!
Думаю, просто мне не хватает знаний. В чем может быть проблема?
Всем спасибо.
Андрей.
Как ты все создаешь и как ты пропускаешь п1?
Или можно работать CPropertySheet напрямую - расширить его создать, элементы управления и работать с ними.
Как ты все создаешь и как ты пропускаешь п1?
Создаю модальное окно, так
BOOL CPBMServerApp::InitInstance()
{
InitCommonControls();
CWinApp::InitInstance();
AfxEnableControlContainer();
................................
dlg = new CPBMServerDlg( );
m_pMainWnd = dlg;
dlg->DoModal();
................................
}
Накладываю на него немодальный лист с 3 страницами.
afx_msg int CPBMServerDlg::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
................................
// Инициализация листа с закладками
sheet = new CPropSheet( "", this );
pPage1 = new CPropertyPage( IDD_PAGE1 );
pPage2 = new CPropertyPage( IDD_PAGE2 );
pPage3 = new CPropertyPage( IDD_PAGE3 );
sheet->AddPage( pPage1 );
sheet->AddPage( pPage2 );
sheet->AddPage( pPage3 );
sheet->Create( this, DS_FIXEDSYS | WS_CHILD |WS_SYSMENU );
// Адаптация размеров листа и окна
sheet->GetWindowRect( &sheet_rect );
GetWindowRect( &win_rect );
CRect win_crect( &win_rect );
.................................
return 0;
}
Инициализация страний с различными элементами управления: ListCtrl, Bitmap, Button, etc.
BOOL CPBMServerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
.............................................
sheet->SetActivePage( 0 );
pMesListCtrl = (CListCtrl*)pPage1->GetDlgItem( IDC_LISTMESSAGES );
pMesListCtrl->GetClientRect( rect );
pMesListCtrl->InsertColumn( 0, _T( "Время" ) , LVCFMT_LEFT, rect.Width() * 0.2 );
pMesListCtrl->InsertColumn( 1, _T( "Отправитель" ), LVCFMT_LEFT, rect.Width() * 0.2 );
pMesListCtrl->InsertColumn( 2, _T( "Получатель" ), LVCFMT_LEFT, rect.Width() * 0.2 );
pMesListCtrl->InsertColumn( 3, _T( "Размер" ), LVCFMT_LEFT, rect.Width() * 0.2 );
pMesListCtrl->InsertColumn( 4, _T( "Задержка" ), LVCFMT_LEFT, rect.Width() * 0.2 );
.........................................
sheet->SetActivePage( 1 );
.......................................
sheet->SetActivePage( 2 );
........................................
sheet->SetActivePage( 0 );
sheet->ShowWindow( SW_SHOW );
.............................................
}
А вот работающий вариант, без пункта 1.
BOOL CPBMServerApp::InitInstance()
{
..................................
CPropSheet *sheet = new CPropSheet( dlgMain );
CPropertyPage * pPage1 = new CPropertyPage( IDD_PAGE1 );
CPropertyPage * pPage2 = new CPropertyPage( IDD_PAGE2 );
CPropertyPage * pPage3 = new CPropertyPage( IDD_PAGE3 );
sheet->AddPage( pPage1 );
sheet->AddPage( pPage2 );
sheet->AddPage( pPage3 );
sheet->m_psh.dwFlags = PSH_PROPSHEETPAGE|PSH_MODELESS;
sheet->Create( dlgMain, DS_FIXEDSYS | WS_CHILD | WS_SYSMENU );
sheet->ShowWindow( m_nCmdShow );
sheet->UpdateWindow();
......................................
}
Спасибо, если у кого появятся дельные мысли.
я конечно не знаю зачем ты накладываешь CPropertySheet на диалог, возможно ты хочешь совместную работу с деревом и здесь я могу посоветовать CTreePropSheet который можно скачать из кодепрожекта.
Или можно работать CPropertySheet напрямую - расширить его создать, элементы управления и работать с ними.
Почему не хочу работать напрямую с CPropertySheet?
Да можно напрямую, но не удобно. CPropertySheet есть один из элементов управления самого родительского окна. Слишком много возни - расширить окно, сместить, затем в нужные координаты поместить остальные элементы диалогового окна, а если захочешь изменить размеры окна, то нужно опять пересчитывать координаты всех элементов. Я сначала, шел именно по этому пути, но потом ввел новое родительское окно и уперся в вышеописанную ошибку.
Еще раз оговорюсь ф-ция ProcessMessageFilter действительно спасает положение и управление элементами страниц начинает работать как надо, но очень уж все некрасиво выходит.
Создаю модальное окно, так
BOOL CPBMServerApp::InitInstance()
{
dlg = new CPBMServerDlg( );
m_pMainWnd = dlg;
dlg->DoModal();
................................
}
Накладываю на него немодальный лист с 3 страницами.
....................
Ты создаешь SDI-приложение и подменяешь runtime MainFrm диалогом. При этом разрушается механизм обработки сообщений Wnd, настроенный на этапе компиляции.
Выход:
Создай все сразу на основе диалогового приложения
ИМХО все инициализации лучше собрать в OnInitDialog, а не дробить.
Создай все сразу на основе диалогового приложения.
Спасибо. Попробую.
Создай все сразу на основе диалогового приложения
Ты знаешь, не получилось. Давай еще раз. Может я тебя не понял.
Действительно, первоначально я перебрал старый свой проект, т.е. не использовал "чистый" визардовский дилоговый проект с нуля.
Твое замечание я понял тебя так - построй визардом диалоговый проект по умолчанию и на новое диалоговое окно помести все элементы управления, лист свойств и страницы на него.
Я сделал все именно так.
Прав ли я, это ли ты имел ввиду?
В любом случае спасибо, приветствуются даже ошибочные мысли и предложения - все это опыт.
Твое замечание я понял тебя так - построй визардом диалоговый проект по умолчанию и на новое диалоговое окно помести все элементы управления, лист свойств и страницы на него.
Я сделал все именно так.
Прав ли я, это ли ты имел ввиду?
Да.
В attachment мой тестовый проект:
Диалог, на нем PropertySheet, на PropertySheet 2 PropertyPage, На 2-q Page - кнопка и соотв обработчик кнопки. Все работает.
Если тебе это надо.
Да.
В attachment мой тестовый проект:
Диалог, на нем PropertySheet, на PropertySheet 2 PropertyPage, На 2-q Page - кнопка и соотв обработчик кнопки. Все работает.
Если тебе это надо.
Теперь с Attachment
Теперь с Attachment
Спасибо, дружище!
Действительно, у тебя работает. Сейчас проанализирую, где я мог лохонуться.
Если ты наскоро собрал проект и забыл вставить
этот кусок, то пропусти его, если нет то дарю.
BOOL CPropSheet::OnInitDialog()
{
ModifyStyleEx( 0, WS_TABSTOP | WS_EX_CONTROLPARENT );
return CPropertySheet::OnInitDialog();
}
По крайне мере этот WS_TABSTOP в свое время мне дня дня здоровья стоил, пока не отыскал объяснение на буржуйском сайте. А для тех кто не знает, объясню.
В такой интерпретации программа будет работать или если на всех листах у всех управляющих элементов откл. TABSTOP или необходимо вставить ModifyStyleEx в CPropSheet::OnInitDialog, или в CPropSheet::OnCreate. Иначе происходит как бы зависание программы, если она становиться не активной.
Спасибо, дружище!
Действительно, у тебя работает. Сейчас проанализирую, где я мог лохонуться.
Если ты наскоро собрал проект и забыл вставить
этот кусок, то пропусти его, если нет то дарю.
BOOL CPropSheet::OnInitDialog()
{
ModifyStyleEx( 0, WS_TABSTOP | WS_EX_CONTROLPARENT );
return CPropertySheet::OnInitDialog();
}
По крайне мере этот WS_TABSTOP в свое время мне дня дня здоровья стоил, пока не отыскал объяснение на буржуйском сайте. А для тех кто не знает, объясню.
В такой интерпретации программа будет работать или если на всех листах у всех управляющих элементов откл. TABSTOP или необходимо вставить ModifyStyleEx в CPropSheet::OnInitDialog, или в CPropSheet::OnCreate. Иначе происходит как бы зависание программы, если она становиться не активной.
Я все быстренько собрал, используя исключительно AppWizzard. Только PropertySheet вставил рученками из твоего кода. Для убедительности.
А за информацию спасибо
Заставишь кнопку Button1 работать.
Я пока нет. Просто смешно уже!!!
Вот, посмотри проект в attachment, максимально упростил.
Заставишь кнопку Button1 работать.
Я пока нет. Просто смешно уже!!!
Две ошибки:
СPage1* pPage1; // так нужно
//pPage1 = new CPropertyPage( IDD_PAGE1 ); // ошибка
pPage1 = new CPage1; // так нужно
Две ошибки:
СPage1* pPage1; // так нужно
//pPage1 = new CPropertyPage( IDD_PAGE1 ); // ошибка
pPage1 = new CPage1; // так нужно
Ну что сказать, век живи, век учись, а дураком умрешь.
Еще раз жму руку!
С уважением, Андрей.