Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Свойства элементов управления  (Прочитано 15249 раз)
0 Пользователей и 1 Гость смотрят эту тему.
pingvincible
Гость
« : 18-05-2008 10:29 » 

Здравствуйте!
Только начал програмить в Visual Studio 2005. Возникла такая проблема. Имеется два диалога. Из одного вызывается другой. На главном диалоге размещены в группе два RadioButton'а. Их свойство disable утсановлено в true. Необходимо, чтобы при нажатии кнопки в дочернем диалоге на главном RadioButton'ы становились активными, то есть disable становилось false.
И вообще, как обращаться из кода программы к свойствам контролов? Подскажите, пожалуйста. Google не помог.
« Последнее редактирование: 18-05-2008 10:47 от Sel » Записан
Lotor
Гость
« Ответ #1 : 18-05-2008 11:54 » 

И вообще, как обращаться из кода программы к свойствам контролов? Подскажите, пожалуйста. Google не помог.
Надо привязать к контролу переменную.
 
Пример 1.
Щелкаешь по RadioButton правой кнопкой - AddVarible. В категории выбираешь - value, тип - bool, имя любое, пусть будет m_bCheck. Теперь в тексте программы m_bCheck=true - выберет тебе эту радиокнопку.

Пример 2.
Пишешь в тексте программы GetDlgItem(IDC_твоей радиокнопке)->EnableWindow(false) -радиокнопка становится неактивной.
« Последнее редактирование: 18-05-2008 11:56 от Lotor » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 18-05-2008 12:02 » 

если MFC , то

((CButton*)GetDlgItem(IDC_...))->EnableWindow(0/1)

если не MFC

HWND GetDlgItem( HWND hDlg,  int nIDDlgItem);

-------------------------

с другого диалога - через указатель на дочерний диалог, в дочернем сделать метод, который будет позволять управлять контролами диалога


Lotor,
Цитата
EnableWindow(false)

не false , а FALSE . То есть 0 или 1 (FALSE или TRUE)

а мембер связывать не обязательно вовсе )  (это я про m_bCheck) , а иногда даже совсем вредно
Записан

pingvincible
Гость
« Ответ #3 : 18-05-2008 12:42 » 

Цитата
с другого диалога - через указатель на дочерний диалог, в дочернем сделать метод, который будет позволять управлять контролами диалога

а как сделать такой метод? подскажите, пожалуйста.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 18-05-2008 12:51 » 

ну как-то есть как... Как в любом классе

Код:
class CMyDialog
{
...
 public:
   void EnableConrols(int nEnable);
...
};


Код:
void CMyDialog::EnableConrols(int nEnable)
{
 ...
   GetDlgItem(...) -> ... ;
  ...
}
Записан

Lotor
Гость
« Ответ #5 : 18-05-2008 13:11 » 

Lotor,
Цитата
EnableWindow(false)

не false , а FALSE . То есть 0 или 1 (FALSE или TRUE)

В 2005 студии работает и так, и так -  поэтому я не заморачиваюсь BOOL или bool. =)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 18-05-2008 13:16 » 

Lotor, это просто по случайному совпадению Улыбаюсь

и всё же, BOOL - 4 байта , bool - 1 байт длиной
Записан

pingvincible
Гость
« Ответ #7 : 18-05-2008 14:56 » 

Создаю метод класса: в хедере диалога пишу прототип функции

Код:
public:
void EnableR();

в файле .срр пишу тело

Код:
void CdiplomDlg::EnableR()
{
GetDlgItem(IDC_RADIO1)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO2)->EnableWindow(TRUE);
}

в коде другого диалога в функции нажатия кнопки пишу

Код:
CdiplomDlg dlg;
dlg.EnableR();

получаю окно с ошибкой "Debug Assertion Failed" в файле winocc.cpp

где я неправ, объясните пожалуйста
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 18-05-2008 15:08 » 

А dlg.DoModal() или dlg.Create() где? Диалог не инициализируется
Записан
pingvincible
Гость
« Ответ #9 : 18-05-2008 15:33 » 

но тот диалог уже создан, в нем только надо активизировать радиобатоны, он находится на втором плане
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 18-05-2008 16:55 » 

To create a modal dialog box, construct an object on the stack using the constructor for your derived dialog class and then call DoModal to create the dialog window and its controls. If you wish to create a modeless dialog, call Create in the constructor of your dialog class.
В твоём коде не видно вызова Create или DoModal. Поэтому могу предположить только отсутствие инициализации диалога после создания объекта на стеке.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 18-05-2008 17:18 » 

но тот диалог уже создан, в нем только надо активизировать радиобатоны, он находится на втором плане

нужно взять указатель на тот созданный диалог и сделать
(указатель)->EnableR();

---------
а вот так , как ты написал
CdiplomDlg dlg;
dlg.EnableR();

это ты сделал вот что: создал локальный диалог (с m_hWnd==0, объект windows не создан ещё) и для этого локального вызвал метод. В котором GetDlgItem совершило вынос программы, так как была попытка использовать нулевой хендл
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #12 : 19-05-2008 12:21 » 

Леха все правильно говорил, но предлагает править следствие конкретно твоего хода (в принципе покатит), но можно и устранить причину в общем, а именно делать так
void CdiplomDlg::EnableR()
{
   CWnd * wnd = GetDlgItem(IDC_RADIO1);
   if (wnd)
      wnd->EnableWindow(TRUE);
   ...
}
Ну или что-то в этом роде... Пушистый поправит если что
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 19-05-2008 12:45 » 

lapulya, ну как бы проверять указатель - оно и так само собой разумеется, я думал про это не нужно говорить. А кроме того, если IDC_... - контрола нет, то программа всё равно вылетит, место сразу обнаружится при запуске по F5 )
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #14 : 19-05-2008 13:01 » new

возможно, возможно... обратного и не утверждал... я так просто заметил, для привития культуры написания кода ))))
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines