Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нет сообщений от эл. управления на CPropertyPage.

14K
16 февраля 2006 года
lgv
15 / / 16.02.2006
Заимел проблему, обращаюсь за помощью.

Описываю порядок в котором создал:
1.Модальное диалоговое окно - CDialog.
2.на нем немодальные лист с закладками CPropertySheet.
3.на нем несколько страниц CPropertyPage.
4.На страницах элементы управления – CListCtrl, ClistBox, кнопки, etc.
Проблема состоит в том, что начиная от страниц до элементов управлеия – все они остаются “глухими”, т.е. я не могу получить сообщения от этих элементов. Не могу получить сообщения ни в классе производном от CPropertyPage, ни CPopertySheet, ни CDialog.

Если первый пункт пропустить, то все работает!
Думаю, просто мне не хватает знаний. В чем может быть проблема?
Всем спасибо.
Андрей.
14K
17 февраля 2006 года
lgv
15 / / 16.02.2006
Неужели нет знающих подсказать в чем проблема?

Выход из положения я думаю, уже нашел. ProcessMessageFilter в этом мне поможет.
Но это не решение проблемы, а выход из тупиковой ситуации. Причина не ясна...:(((
2.4K
17 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by lgv
Заимел проблему, обращаюсь за помощью.

Описываю порядок в котором создал:
1.Модальное диалоговое окно - CDialog.
2.на нем немодальные лист с закладками CPropertySheet.
3.на нем несколько страниц CPropertyPage.
4.На страницах элементы управления – CListCtrl, ClistBox, кнопки, etc.
Проблема состоит в том, что начиная от страниц до элементов управлеия – все они остаются “глухими”, т.е. я не могу получить сообщения от этих элементов. Не могу получить сообщения ни в классе производном от CPropertyPage, ни CPopertySheet, ни CDialog.

Если первый пункт пропустить, то все работает!
Думаю, просто мне не хватает знаний. В чем может быть проблема?
Всем спасибо.
Андрей.




Как ты все создаешь и как ты пропускаешь п1?

1.9K
19 февраля 2006 года
Rad87
123 / / 14.12.2005
я конечно не знаю зачем ты накладываешь CPropertySheet на диалог, возможно ты хочешь совместную работу с деревом и здесь я могу посоветовать CTreePropSheet который можно скачать из кодепрожекта.
Или можно работать CPropertySheet напрямую - расширить его создать, элементы управления и работать с ними.
14K
20 февраля 2006 года
lgv
15 / / 16.02.2006
Цитата:
Originally posted by dinasok51
Как ты все создаешь и как ты пропускаешь п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();
......................................
}

Спасибо, если у кого появятся дельные мысли.

14K
20 февраля 2006 года
lgv
15 / / 16.02.2006
Цитата:
Originally posted by Rad87
я конечно не знаю зачем ты накладываешь CPropertySheet на диалог, возможно ты хочешь совместную работу с деревом и здесь я могу посоветовать CTreePropSheet который можно скачать из кодепрожекта.
Или можно работать CPropertySheet напрямую - расширить его создать, элементы управления и работать с ними.


Почему не хочу работать напрямую с CPropertySheet?
Да можно напрямую, но не удобно. CPropertySheet есть один из элементов управления самого родительского окна. Слишком много возни - расширить окно, сместить, затем в нужные координаты поместить остальные элементы диалогового окна, а если захочешь изменить размеры окна, то нужно опять пересчитывать координаты всех элементов. Я сначала, шел именно по этому пути, но потом ввел новое родительское окно и уперся в вышеописанную ошибку.

Еще раз оговорюсь ф-ция ProcessMessageFilter действительно спасает положение и управление элементами страниц начинает работать как надо, но очень уж все некрасиво выходит.

2.4K
20 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by lgv
Создаю модальное окно, так
BOOL CPBMServerApp::InitInstance()
{

dlg = new CPBMServerDlg( );
m_pMainWnd = dlg;
dlg->DoModal();
................................
}
Накладываю на него немодальный лист с 3 страницами.
....................



Ты создаешь SDI-приложение и подменяешь runtime MainFrm диалогом. При этом разрушается механизм обработки сообщений Wnd, настроенный на этапе компиляции.

Выход:
Создай все сразу на основе диалогового приложения

ИМХО все инициализации лучше собрать в OnInitDialog, а не дробить.

14K
20 февраля 2006 года
lgv
15 / / 16.02.2006
Цитата:
Originally posted by dinasok51
Создай все сразу на основе диалогового приложения.



Спасибо. Попробую.

14K
20 февраля 2006 года
lgv
15 / / 16.02.2006
Цитата:
Originally posted by dinasok51
Создай все сразу на основе диалогового приложения



Ты знаешь, не получилось. Давай еще раз. Может я тебя не понял.
Действительно, первоначально я перебрал старый свой проект, т.е. не использовал "чистый" визардовский дилоговый проект с нуля.

Твое замечание я понял тебя так - построй визардом диалоговый проект по умолчанию и на новое диалоговое окно помести все элементы управления, лист свойств и страницы на него.
Я сделал все именно так.
Прав ли я, это ли ты имел ввиду?

В любом случае спасибо, приветствуются даже ошибочные мысли и предложения - все это опыт.

2.4K
20 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by lgv

Твое замечание я понял тебя так - построй визардом диалоговый проект по умолчанию и на новое диалоговое окно помести все элементы управления, лист свойств и страницы на него.
Я сделал все именно так.
Прав ли я, это ли ты имел ввиду?


Да.

В attachment мой тестовый проект:
Диалог, на нем PropertySheet, на PropertySheet 2 PropertyPage, На 2-q Page - кнопка и соотв обработчик кнопки. Все работает.
Если тебе это надо.

2.4K
20 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by dinasok51
Да.

В attachment мой тестовый проект:
Диалог, на нем PropertySheet, на PropertySheet 2 PropertyPage, На 2-q Page - кнопка и соотв обработчик кнопки. Все работает.
Если тебе это надо.

Теперь с Attachment

14K
20 февраля 2006 года
lgv
15 / / 16.02.2006
Цитата:
Originally posted by dinasok51
Теперь с Attachment


Спасибо, дружище!

Действительно, у тебя работает. Сейчас проанализирую, где я мог лохонуться.
Если ты наскоро собрал проект и забыл вставить
этот кусок, то пропусти его, если нет то дарю.

BOOL CPropSheet::OnInitDialog()
{
ModifyStyleEx( 0, WS_TABSTOP | WS_EX_CONTROLPARENT );
return CPropertySheet::OnInitDialog();
}

По крайне мере этот WS_TABSTOP в свое время мне дня дня здоровья стоил, пока не отыскал объяснение на буржуйском сайте. А для тех кто не знает, объясню.

В такой интерпретации программа будет работать или если на всех листах у всех управляющих элементов откл. TABSTOP или необходимо вставить ModifyStyleEx в CPropSheet::OnInitDialog, или в CPropSheet::OnCreate. Иначе происходит как бы зависание программы, если она становиться не активной.

2.4K
20 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by lgv
Спасибо, дружище!

Действительно, у тебя работает. Сейчас проанализирую, где я мог лохонуться.
Если ты наскоро собрал проект и забыл вставить
этот кусок, то пропусти его, если нет то дарю.

BOOL CPropSheet::OnInitDialog()
{
ModifyStyleEx( 0, WS_TABSTOP | WS_EX_CONTROLPARENT );
return CPropertySheet::OnInitDialog();
}

По крайне мере этот WS_TABSTOP в свое время мне дня дня здоровья стоил, пока не отыскал объяснение на буржуйском сайте. А для тех кто не знает, объясню.

В такой интерпретации программа будет работать или если на всех листах у всех управляющих элементов откл. TABSTOP или необходимо вставить ModifyStyleEx в CPropSheet::OnInitDialog, или в CPropSheet::OnCreate. Иначе происходит как бы зависание программы, если она становиться не активной.



Я все быстренько собрал, используя исключительно AppWizzard. Только PropertySheet вставил рученками из твоего кода. Для убедительности.

А за информацию спасибо

14K
20 февраля 2006 года
lgv
15 / / 16.02.2006
Вот, посмотри проект в attachment, максимально упростил.
Заставишь кнопку Button1 работать.
Я пока нет. Просто смешно уже!!!
2.4K
20 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by lgv
Вот, посмотри проект в attachment, максимально упростил.
Заставишь кнопку Button1 работать.
Я пока нет. Просто смешно уже!!!




Две ошибки:

 
Код:
//CPropertyPage* pPage1; // ошибка
СPage1*  pPage1; // так нужно

//pPage1    = new CPropertyPage( IDD_PAGE1 ); // ошибка
 pPage1 = new CPage1; // так нужно
14K
21 февраля 2006 года
lgv
15 / / 16.02.2006
Цитата:
Originally posted by dinasok51
Две ошибки:
 
Код:
//CPropertyPage* pPage1; // ошибка
СPage1*  pPage1; // так нужно

//pPage1    = new CPropertyPage( IDD_PAGE1 ); // ошибка
 pPage1 = new CPage1; // так нужно



Ну что сказать, век живи, век учись, а дураком умрешь.

Еще раз жму руку!
С уважением, Андрей.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог