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

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

ru
Offline Offline
Пол: Женский

« : 01-03-2012 07:23 » 

Здравствуйте!
Это опять со своими бестолковыми вопросами. Улыбаюсь

Задача такая:

Надо 4 раза в диалоговое окно вывести объект,изображающий микропереключатель( посмотрите картинку).
Сейчас я в отдельном диалоговом окне вывожу 6 слайдеров, значения от 0  до 1, - этим я показываю какой адрес набирать.
А хотелось бы в случае ошибки набора адреса, выдавать на экран то, что я просила набрать и то, что набрано было на самом деле. Пока я пишу это словами.
Те, другими словами есть объект, состоящий из 6-ти слайдеров+текст, который надо выводить в диалоговое окно несколько раз.

Помогите, хотя бы как начать.

* микроперекл.JPG (4.39 Кб - загружено 855 раз.)
Записан
Джон
просто
Администратор

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

« Ответ #1 : 01-03-2012 09:10 » 

Если честно, то ничего не понял. "Четыре раза" - последовательно? Что значит "ошибка набора адреса"? Как это проверяется? Те есть где-то ещё поле ввода этого самого адреса? На какой экран?
Эти слайдеры служат только для отображения, не для ввода?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #2 : 01-03-2012 10:14 » 

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

На каждом  из 3-х каналов своя группа из 6 микропереключателей,кот. задают адрес платы. Обязательно нужно, чтобы они были одинаковыми.
 Это проверяется (не буду вдаваться в подробности) - получаю ответ от платы, анализирую его, вижу ошибку и хочу на экран вывести для наглядности 4 группы из 6-ти микроперекл.:

1 - то, что должны были выставить
2 - адрес,выставленный на канале А
3 - адрес,выставленный на канале В
4 - адрес,выставленный на канале С

Все эти 4 группы должны появится на основном диалоге. Это разработчик так хочет, чтоб его.
Нарисовала две таких группы , сделала их невидимыми, чтобы они появлялись в случае по ошибке.
Но, "великий Мао" настаивает на 4!
 Мне лень описывать четырежды одно и тоже (6 слайдер+ 3текстовых поля и тд). Для этого и существуют свои классы, которые используют стандартные возможности.
Даже написала тест,в котором создаются слайдеры 6-12-18, исп. Create.
Опять в базовых понятиях торможу. Подскажите,как это реализовать.
Я пользуюсь MFC и visual c++ 6.

* микроперекл.JPG (32.02 Кб - загружено 848 раз.)
Записан
Джон
просто
Администратор

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

« Ответ #3 : 01-03-2012 10:34 » 

Ок. Те я так понимаю у тебя проблема с отображением твоего контрола на одной форме многократно?

Сначала хорошие новости. Код для твоего контрола будет единственным. Повторять его не надо.

Но есть одна проблемка (плохие новости). У тебя твой контрол содержит ресурсы в rc-файле? Скорей всего да. Это плохо. Почему? Потому что ресурс-ID (которые стоят в rersource.h) каждого контрола просто обязан быть уникальным в пределах одной формы. Поэтому "размножение" твоёго контрола на одной форме практически невозможно. Может сделать его лучше динамическим? Ведь он не такой сложный. Все контролы в этом случае ты создаёшь с помощью ф-ции Create, используя в качестве ID например -1 и вычисляя их координаты из родительского окна-фрейма. Если ты не умеешь это делать разберёмся отдельно.

Теперь всё очень просто. На основной форме - самое простое - четыре статика, и в классе диалога содаёшь четыре объекта твоего контрола, использующие эти статики для определения места и размеров на форме. Конечно можно и это сделать динамически, только немного сложней. Ща сделаю иллюстрации и псевдокод.


Добавлено через 53 минуты и 50 секунд:
Сорри за задержку. Вот быстренько набросал, в контроле только 2 слайдера и нет функции SetState - я для примера передаю строку с 001010. Не знаю в каком виде у тебя данные. Можно передавать что угодно, хоть DWORD. Мы пока про UI. Итак, вот класс контрола. Необходимо конечно ещё доделать кучу мелочёвок, типа вызвать Destroy, правильно пересчитать рамку для каждого слайдера (я просто взял ширину 40 и высоту "родительской" рамки) и тд, но это ты всё сделаешь, у меня ща просто времени в обрез. Слайдеры можно сделать массивом. Короче как хочешь. Принцип такой:

Код: (C++)
class CMyDIPSwitch : public CWnd
{
public:

        void CreateControl(CWnd* pParentWnd, CRect& rc, CString stInitState)
        {
                // m_slider1.Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
                // m_slider2.Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
                // ...
                // SetState(stInitState);

                int nSliderWidth = 40;

                m_slider1.Create(TBS_NOTICKS | TBS_BOTH | TBS_VERT | WS_CHILD | WS_VISIBLE, CRect(CPoint(rc.left, rc.top), CSize(nSliderWidth, rc.bottom-rc.top)), pParentWnd, -1);
                m_slider2.Create(TBS_NOTICKS | TBS_BOTH | TBS_VERT | WS_CHILD | WS_VISIBLE, CRect(CPoint(rc.left+nSliderWidth, rc.top), CSize(nSliderWidth, rc.bottom-rc.top)), pParentWnd, -1);

                m_slider1.SetRange(0,1);
                m_slider2.SetRange(0,1);
        }
       


private:

        CSliderCtrl m_slider1;
        CSliderCtrl m_slider2;
        //...
};

Потом, на форму кидаешь статики (я взял Picture):


В классе диалога:

Код: (C++)
private:
        CMyDIPSwitch m_wndDIPSwitch1;
        CMyDIPSwitch m_wndDIPSwitch2;

и в OnInitDialog()

Код: (C++)
        CRect rc;
        GetDlgItem(IDC_DIPSWITCH1)->GetWindowRect(&rc);
        ScreenToClient(&rc);
        m_wndDIPSwitch1.CreateControl(this, rc, _T("010010"));

        GetDlgItem(IDC_DIPSWITCH2)->GetWindowRect(&rc);
        ScreenToClient(&rc);
        m_wndDIPSwitch2.CreateControl(this, rc, _T("000001"));

Всё:



В прицепе этот проект правда на 2003 студии - самая старая, которая у меня ща на этом компе стоит. Если возникнут проблемы с 6-ой - стучись.


* ss1.gif (5.65 Кб - загружено 1481 раз.)
* ss2.gif (5.8 Кб - загружено 1398 раз.)
* CDIPSwitchTest.zip (100.55 Кб - загружено 842 раз.)
« Последнее редактирование: 01-03-2012 11:28 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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


« Ответ #4 : 02-03-2012 02:45 » 

у меня шестёрка есть, если что
Записан

ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #5 : 02-03-2012 05:08 » new

Джон, спасибо. Буду разбираться.
Записан
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #6 : 05-03-2012 12:56 » 

Джон, с вашей помощью получалось то, что хотела.
Но, когда использую,как у вас, picture - всё хорошо,слайдеры отображаются,как и должны:
 вкл./выкл или 0/1.
Когда использую статик, то отображаюся только слайдеры в 0. (на картинке - это АА)
Смутно понимаю, что это из-за того,что я так описала m_slider1.
Как правильно? Прицепляю проектик тестовый и картинку,чтобы понятней был результат.

Добавлено через 1 минуту и 20 секунд:
Проект!!

* Screen.JPG (26.04 Кб - загружено 824 раз.)
* MYslider.zip (20.26 Кб - загружено 802 раз.)
« Последнее редактирование: 05-03-2012 12:57 от ann_nef » Записан
Джон
просто
Администратор

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

« Ответ #7 : 05-03-2012 14:13 » 

Да, прикольный эффект. Каждый второй не прорисовывается. Вызови Invalidate() после создания:


Код: (C++)
...

        GetDlgItem(IDC_0)->GetWindowRect(&rc);
        ScreenToClient(&rc);
        CMK.DeleteMicroKey(24);
        CMK.CreatMicroKey(this, rc, 0x15,24);
        UpdateData(true);

        Invalidate();
}

Вопросы можно задавать? Или это не совсем окончательная версия? Архитектуру я не понял. Один контролл с 30 переключателями разбит на 5 групп, каждая из которых находится где-то на форме. Это так действительно надо?

Замечание. DeleteMicroKey лучше сделать приватной и вызывать внутри CreatMicroKey, сразу вначале. Количество освобождаемых окон передается параметром в CreatMicroKey. Но это только в том случае, если ты хочешь это так оставить. Я бы предложил тебе след. решение. Тк ты пока освобождаешь ресурсы окна (Destroy) ТОЛЬКО, если "создаёшь" новые - твоя пара DeleteMicroKey+CreatMicroKey. С другой стороны, если окно создано, зачем его разрушать? Опять же, если ты просто закрываешь окно, ресурсы не освобождаются. Поэтому такой вариант:

Код: (C++)
void CMicroKey::CreatMicroKey(CWnd* pParentWnd, CRect& rc, int iState,int ii)
{
        int i,n;
        int nSliderWidth = 30;
        for(i=0,n=ii;i<6;i++,n++)
        {
                if(!::IsWindow(m_slider1[n].GetSafeHwnd()))
                {
                        CRect rc(CPoint(rc.left+40+nSliderWidth*i, rc.top+10), CSize(nSliderWidth, rc.bottom-rc.top-20));
                        m_slider1[n].Create(TBS_NOTICKS | TBS_BOTH | TBS_VERT | WS_CHILD | WS_VISIBLE, rc, pParentWnd, -1);
                        m_slider1[n].SetRange(0,1);
                }
                m_slider1[n].SetPos((iState>>i)&1);
        }
}      

void CMicroKey::DeleteMicroKey()
{
        for(int i=0;i<30;i++)
        {
                if(::IsWindow(m_slider1[i].GetSafeHwnd()))
                {
                        m_slider1[i].DestroyWindow();
                }
        }
}

Сначала спрашиваем, было ли уже когда-либо создано окно для слайдера n - IsWindow, если нет - создаём, если да - то просто меняем его состояние.
Тогда ф-ции выглядят проще. Я добавил в твой проект Edit, чтобы вводить State.

Код: (C++)
void CMySliderNewDlg::OnButton3()
{
        UpdateData(TRUE);
        CRect rc;
        GetDlgItem(IDC_02)->GetWindowRect(&rc);
        ScreenToClient(&rc);
        CMK.CreatMicroKey(this, rc, m_dwState,12);
}

Хотя конечно и это не очень красиво. Лучше создавать слайдеры и управлять их состоянием в разных ф-ях.

А освобождать будем при разрушении основного окна-формы:

Код: (C++)
void CMySliderNewDlg::OnDestroy()
{
        CMK.DeleteMicroKey();
        CDialog::OnDestroy();
}


Твой проект открыл в 2003 студии, но файлы проекта 6ой студии сохранил, поэтому ты должна его тоже открыть без проблем.

* Myslider.zip (39.6 Кб - загружено 813 раз.)
« Последнее редактирование: 05-03-2012 14:26 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #8 : 06-03-2012 07:34 » 

Вопросы можно задавать? Или это не совсем окончательная версия? Архитектуру я не понял. Один контролл с 30 переключателями разбит на 5 групп, каждая из которых находится где-то на форме. Это так действительно надо?

Вопросы задавать можно.
Версия совсем не окончательная, а полигончик для нахождения решения.
Групп на самом деле 4 ( пятая АА для того,чтобы разобраться почему у меня со статиками не получилось).
Итак, 4 :
1 - группа из 6 слайдеров, изображает эталон адреса
2 -                                        изображает ответ канала АА, тоже адрес
3-                                                                        канала АС
4-                                                                        канала АВ
Изображения всех 4-х групп должны быть на экране одновременно.

Четыре области на форме,диалоге.экране, которые описаны ID00,ID01,ID02,ID03(static или picture). Это неизбежно, что их 4.
   CSliderCtrl m_slider1[24] - это для создания 4 групп из 6 слайдеров.
Хотелось бы обойтись 6-тью, но если освобождать m_slider(i=0,..,5), то изображение в предыдущей группе не сохранится.
Джон,может есть другое решение?

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

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

« Ответ #9 : 06-03-2012 10:15 » 

Я всё-равно не понял, почему все слайдеры должны быть в ОДНОМ контролле? Может лучше так: один контрол с шестью слайдерами и всё, и таких контроллов на форме столько сколько надо.
Те я ожидал, что-то вроде: необходимо держать все данные в одном контролле, чтобы их опрашивать, устанавливать и тп.

Пока я не вижу прямой необходимости это делать. Давай вот с этим разберёмся. Остальное - дело техники.

ps да и ещё, почему ты хочешь сделать с Static Text вместо Picture?

ps ps Ну вот что-то типа такого. Поскольку у вертикального слайдера 0 это верхняя позиция, я проинвертировал установку, чтобы выглядело "по-настоящему" Ага :

* Myslider.zip (41.89 Кб - загружено 806 раз.)
« Последнее редактирование: 06-03-2012 11:54 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #10 : 06-03-2012 13:02 » 

Джон, я просто не знала,как это сделать.
Static Text - это первое,что пришло в голову. Буду точно использовать Picture, с ними удобнее.
Жаль,что у меня только visual  c++ 6. Буду разбираться.
Записан
Джон
просто
Администратор

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

« Ответ #11 : 06-03-2012 15:23 » 

Так ты же можешь этот код и в 6ой открыть. Это твой проект, только добавь к нему новый класс - h и cpp файлы и всё.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines