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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: VS 2005: Добавление э.у. в диалог  (Прочитано 18444 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Yegor
Интересующийся

ua
Offline Offline

« : 16-02-2008 18:40 » 

Я недавно перешел на VS 2005. Люди, кто разбирается в этой среде, подскажите пожалуйста! Простую задачу, как добавлять элемент управление в диалог.

Рисую на диалоге э.у. Spin Control (IDC_PORT_SPIN).

Дальше кликаю по нему правой кнопкой и из контекстного меню выбираю Add Variable...

В "Add Member Variable Wizard" выставляю флаг "Control Variable", Access - public, "Variable type" - CSpinButtonCtrl, "Variable Name" - m_Spin_Port, "Control ID" - IDC_PORT_SPIN, "Control Type" - msctls_updown32, "Category" - Control.

Щелкаю "Финиш"

В коде, в объявлении класса появляется:

Код:
public:
CSpinButtonCtrl m_Spin_Port;

В реализации класса появляется:

в функции DoDataExchange(CDataExchange* pDX):
Код:
DDX_Control(pDX, IDC_PORT_SPIN, m_Spin_Port);

Дальше, когда я использую этот m_Spin_Port, то возникает ошибка. Когда я смотрю на этот m_Spin_Port дебагером, то оказывается, что он нулевой, не инициализированный. Т. е. его h_Wnd == 0x00000000.

Как сделать, чтобы он нормально инициализировался?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #1 : 16-02-2008 18:59 » 

может надо его Create или связать с ним член-переменную этого класса через визард?
Записан

Yegor
Интересующийся

ua
Offline Offline

« Ответ #2 : 17-02-2008 12:31 » 

Так эта переменная и так связана через визард. А как сделать чтобы инициализировалась сама, без Create ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 17-02-2008 12:57 » 

Yegor, возможно, никак. Бывает, только через Create
Записан

Джон
просто
Администратор

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

« Ответ #4 : 17-02-2008 13:38 » new

Именно
DDX_Control(pDX, IDC_PORT_SPIN, m_Spin_Port);

связывает с ресурсом и создаёт окно. Тут всё в порядке.


Yegor, покажи место где ты его используешь. Скорее всего ты пытаешься к нему обратиться, до того как окно создано. Например в конструкторе или в OnInitDialog до вызова метода базового класса. Покажи код.
« Последнее редактирование: 17-02-2008 13:46 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Yegor
Интересующийся

ua
Offline Offline

« Ответ #5 : 17-02-2008 14:04 » 

Да, я вызывал m_Spin_Port именно в OnInitDialog до вызова метода базового класса. Теперь когда использую после вызова метода базового класса, то все работает. Спасибо!
Записан
Джон
просто
Администратор

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

« Ответ #6 : 17-02-2008 16:14 » 

Именно при вызове базового метода происходит самый первый вызов DoDataExchange. До этого момента окна контролов диалога ещё не созданы.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

us
Offline Offline

« Ответ #7 : 20-11-2015 09:23 » 

Привет форумчане.

Вопрос сходный по теме. Допустим у меня на окне 100 CStatic и я толкаю туда битмапы. Нельзя ли сократить как-то количество кода?

DDX_Control(pDX, IDC_STATIC1, ......
DDX_Control(pDX, IDC_STATIC2, ......
DDX_Control(pDX, IDC_STATIC3, ......
DDX_Control(pDX, IDC_STATIC4, ......
......................................................
DDX_Control(pDX, IDC_STATIC50, ......
DDX_Control(pDX, IDC_STATIC51, ......
.......................................................
DDX_Control(pDX, IDC_STATIC98, ......
DDX_Control(pDX, IDC_STATIC99, ......
DDX_Control(pDX, IDC_STATIC100, ......
Записан
Sla
Команда клуба

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

WWW
« Ответ #8 : 20-11-2015 10:23 » 

а циклы уже отменили?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Boriska
Помогающий

us
Offline Offline

« Ответ #9 : 20-11-2015 10:44 » 

Хорошо, спсб.
Тогда следующий вопрос.
 Где и в чем лучше хранить ID таких контролов окна и адреса привязаных к ним переменных? И где это хранилище заполнять ?
« Последнее редактирование: 20-11-2015 10:52 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #10 : 20-11-2015 11:16 » 

Boriska, хранить можно, например, в контейнере

Код:
std::vector<UINT32> m_MyStaticsIDs;

А насчёт адресов - если ты сам создавал контролы при помощи new , то можно тоже в контейнере хранить, а если диалог описан в ресурсе - то через некоторое время адреса окажутся "битые" (какая-то особенность винапишной работы с диалогом на основе ресурса) , поэтому нужно пользоваться GetDlgItem непосредственно в той процедуре, где хочешь получить указатель на контрол и работать с ним.


Записан

Boriska
Помогающий

us
Offline Offline

« Ответ #11 : 21-11-2015 17:07 » 

Алексей++,

У меня контролы описаны в ресурсах.
Я бы создал класс скажем,
Код: (C++)
class  Item{
  public:
     Item(int item, CStatic* varaddr){
         m_Item = item;
         m_pIVar = varAddr;//адрес привязаной переменной
     }
     int      GetItem();
     int*    GetVarAddr();
  private:
    int    m_Item;
    CStatic*  m_pIVar;
};
Создал бы вектор как член класса диалога и натолкал бы в вектор в конструкторе диалога нужных контролов. Потом в нужном месте вынимал бы значения, и обновлял бы контролы ну типа так
Код: (C++)
   for(int i = 0; i < v.size(); i++)
  {
      DDX_Control(pDX, v[i].GetItem(), *v[i].GetVarAddr());
  }
В принципе я бы так и делал, но хотелось бы знать как это делают делают правильные пацаны Улыбаюсь. Меня собственно интересует где и как заполнять вектор, чтобы красиво Улыбаюсь если контролы описаны в ресурсах.
« Последнее редактирование: 21-11-2015 17:20 от Boriska » Записан
Джон
просто
Администратор

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

« Ответ #12 : 22-11-2015 01:03 » 

"Правильные пацаны" в таких случаях DDX_ ф-ями не пользуются. Нафига DDX статику? Только чтобы привязать ресурс к объекту?

((CStatic*)GetDlgItem(IDC_STATIC...))->...

и никаких DDX-ов

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #13 : 22-11-2015 06:04 » 

Boriska, вектор можно заполнить в OnInitDialog после вызова функции базового класса

И, как говорит, Джон, DDX нафиг не нужны - я ими никогда вот так "вручную" не пользовался, только когда визард создаёт. Даже не знаю (не то, чтобы не помню - я просто не вникал ) , как они работают и какой их синтаксис

Другое дело, что подвешивание картинки к статику в MFC может оказаться непростой задачей, а из визарда можно ресурс указать и всё (в Picture Static , тип Icon или Bitmap)
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines