На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (8) « Первая ... 4 5 [6] 7 8  все  ( Перейти к последнему сообщению )  
> Visual Studio 2008 + COM Port
    Цитата Acvarif @
    В билдере имеется функция закрытия формы типа
    ExpandedWrap disabled
      void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

    В ней обычно останавливаются потоки, закрывается порт и т. п.
    Как можно сделать то-же в MFC?

    обработать сообщение WM_CLOSE :)
    пс. на самом деле MFC является всего лишь классовой надстройкой над Win32 API, поэтому все то что делалось в чистом Win32 API применимо и к MFC.
      Возник один неприятный момент. При переносе проекта из одного компа на другой (с домашнего на рабочий) при компиляции возникает ошибка:
      ExpandedWrap disabled
        Error   1   fatal error C1853: 'Debug\MFCtest.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa) d:\mydesignsxp\visualstprj\mfctest\mfctest\mfctestdlg.cpp   1   MFCtest

      В чем фишка? На компах разные версии компиляторов? (не уверен, что ставил Студию из одного и того-же источника) Как с этим бороться?
      Проект пока еще не такой большой. Можно начать заново. Но потом наверняка ситуация повторится если на выходные буду переносить проект обранто с рабочего компа на домашний.
        Цитата Acvarif @
        Возник один неприятный момент. При переносе проекта из одного компа на другой (с домашнего на рабочий) при компиляции возникает ошибка:
        ExpandedWrap disabled
          Error   1   fatal error C1853: 'Debug\MFCtest.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa) d:\mydesignsxp\visualstprj\mfctest\mfctest\mfctestdlg.cpp   1   MFCtest

        В чем фишка? На компах разные версии компиляторов? (не уверен, что ставил Студию из одного и того-же источника) Как с этим бороться?
        Проект пока еще не такой большой. Можно начать заново. Но потом наверняка ситуация повторится если на выходные буду переносить проект обранто с рабочего компа на домашний.

        просто удали этот файл и снова откомпилируй :)
        вообще когда переносишь проект куда-нибудь, то делай перед этим очистку командой Build -> Clean, это действие удаляет почти все вспомогательные файлы, в том числе файл предкомпилированого заголовка pch, а также объектные и exe файлы, которые слову сказать много весят, особенно pch.
        Сообщение отредактировано: Cfon -
          Спасибо. Заработал прием и передача в одном потоке. Вывод данных на Edit Control в норме.
          Имеются еще некоторые нюансы. Например Static Text почему-то не имеет своего ID. Любой Static Text (1,2 или 9 )имеет ID IDC_STATIC вместо IDC_STATIC1, IDC_STATIC2, ..IDC_STATIC9
          Прикреплённая картинка
          Прикреплённая картинка

          Попытка обратиться к нему по
          ExpandedWrap disabled
            CStatic* pText = (CStatic*)GetDlgItem(IDC_STATIC9);
                pText->SetWindowText(_T("Hello"));
          ID типа IDC_STATIC9 приводит к ошибке
          ExpandedWrap disabled
            Error   4   error C2065: 'IDC_STATIC9' : undeclared identifier
          Это ошибка самой среды Visual Studio2008+MFC?
          Сообщение отредактировано: Acvarif -
            Цитата Acvarif @
            Спасибо. Заработал прием и передача в одном потоке. Вывод данных на Edit Control в норме.
            Имеются еще некоторые нюансы. Например Static Text почему-то не имеет своего ID. Любой Static Text (1,2 или 9 )имеет ID IDC_STATIC вместо IDC_STATIC1, IDC_STATIC2, ..IDC_STATIC9

            Это ошибка самой среды Visual Studio2008+MFC?

            по умолчанию статик контролы имеют одинаковый ID: IDC_STATIC, поэтому чтобы обратиться к ним надо просто указать ID отличный от IDC_STATIC, например IDC_STATIC1 :)
              Спасибо. Static работает. В билдере имеется компонент тпа CSpinEdit
              ExpandedWrap disabled
                 void __fastcall TForm1::CSpinEdit6Change(TObject *Sender)
                {
                  bufwr[124] = (CSpinEdit6->Value - 1) | ((Dist >> 1) & 0x80);
                 
                }

              Работает он по событию клика на верхнюю или нижнюю стрелку прокрутки
              Прикреплённая картинка
              Прикреплённая картинка

              Значение в нем меняется на 1 вверх или вниз в пределах заранее установленных границ в свойствах компонента (например min 1 max 120).
              Как в MFC можно создать подобный компонент. Имеется в наличии Spin Control но без окна Edit. Очевидно придется компоновать Spin Control + Edit Control?
                Цитата Acvarif @
                Как в MFC можно создать подобный компонент. Имеется в наличии Spin Control но без окна Edit. Очевидно придется компоновать Spin Control + Edit Control?

                :yes: надо у спин конторла установить свойства Auto Buddy = True и Set Buddy Integer = True, клики на кнопках обрабатываются через сообщение WM_VSCROLL, которое отлавливается окном диалога. Начальную инициализацию "спина" можно сделать в OnInitDialog.
                Edit Control надо ставить рядом слева от Spin контрола согласно Tab-порядку.

                ExpandedWrap disabled
                  BOOL CMyDialog::OnInitDialog()
                  {  
                      CDialog::OnInitDialog();
                   
                      static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN1))->SetRange(0,100);              
                   
                      return TRUE;  
                  }
                   
                  void CMyDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
                  {      
                      if (pScrollBar->GetDlgCtrlID() == IDC_SPIN1)
                      {
                          //int spinValue = reinterpret_cast<CSpinButtonCtrl*>(pScrollBar)->GetPos32();
                          bufwr[124] = (nPos - 1) | ((Dist >> 1) & 0x80);
                      }
                   
                      CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
                  }
                Сообщение отредактировано: Cfon -
                  Спасибо. С установкой Spin+Edit Control разобрался. Все нормально ставится. С обработкой клика не получается.
                  В функции BOOL CMFCtestDlg::OnInitDialog() добавил строку
                  ExpandedWrap disabled
                    static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN2))->SetRange(0,100);
                  (работаю с IDC_SPIN2)
                  Появилась ошибка
                  ExpandedWrap disabled
                    Error   5   error C2061: syntax error : identifier 'CSpinButtonCtr1'
                  Хотя потом создал переменную типа m_spin2Value и сделал запись
                  ExpandedWrap disabled
                    m_spin2Value.SetRange(1,120);
                  что установило диапазон изменения для Spin
                  Подключение в основной файл MFCtestDld.cpp функции
                  ExpandedWrap disabled
                    void CMFCtestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
                    {      
                        if (pScrollBar->GetDlgCtrlID() == IDC_SPIN2)
                        {
                            bufwr[124] = (nPos - 1) | ((Dist >> 1) & 0x80);
                        }
                     
                        CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
                    }

                  вызывает ошибку
                  ExpandedWrap disabled
                    Error   6   error C2509: 'OnVScroll' : member function not declared in 'CMFCtestDlg'

                  Тут не совсем врубился. У Edit Control есть событие типа
                  ExpandedWrap disabled
                    void CMFCtestDlg::OnEnVscrollEdit5()

                  Что представляет из себя функция void CMFCtestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)?
                  Я ее просто прописал в файл MFCtestDld.cpp.
                  Сообщение отредактировано: Acvarif -
                    Цитата Acvarif @
                    У Edit Control есть событие типа
                    ExpandedWrap disabled
                      void CMFCtestDlg::OnEnVscrollEdit5()

                    Edit Control в данном случае можно вообще игнорировать все делает Spin control.

                    Цитата Acvarif @
                    ExpandedWrap disabled
                      Error   6   error C2509: 'OnVScroll' : member function not declared in 'CMFCtestDlg'

                    Что представляет из себя функция void ::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)?

                    это обработчик сообщения WM_VSCROLL.

                    Цитата Acvarif @
                    Я ее просто прописал в файл MFCtestDld.cpp.

                    можно вручную, но тогда надо сделать по шагам следующее:
                    1) объявить в классе диалога функцию-обработчик void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
                    2) определить ее;
                    3) ну и обязательно разместить след код в таблице сообщений:
                    ExpandedWrap disabled
                      BEGIN_MESSAGE_MAP(CMFCtestDlg, CDialog)
                      ...
                          ON_WM_VSCROLL()
                      ...
                      END_MESSAGE_MAP()

                    но проще воспользоваться соотвествующим мастером ClassView, который добавит весь этот код сам. Для этого открываешь окно ClassView, выбираешь класс CMFCtestDlg, далее в окне Properties -> Messages и там находишь сообщение WM_VSCROLL :D

                    Цитата Acvarif @
                    В функции BOOL CMFCtestDlg::OnInitDialog() добавил строку
                    ExpandedWrap disabled
                      static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN2))->SetRange(0,100);
                    (работаю с IDC_SPIN2)
                    Появилась ошибка
                    ExpandedWrap disabled
                      Error   5   error C2061: syntax error : identifier 'CSpinButtonCtr1'

                    хз должно работать. CSpinButtonCtrl это обертка для виндового spin контрола.

                    Цитата Acvarif @
                    Хотя потом создал переменную типа m_spin2Value и сделал запись
                    ExpandedWrap disabled
                      m_spin2Value.SetRange(1,120);
                    что установило диапазон изменения для Spin

                    а как создал? код приведи.
                    Сообщение отредактировано: Cfon -
                      Спасибо. Разобрался. Добавил через Properties -> Messages
                      ExpandedWrap disabled
                        void CMFCtestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
                        {
                            // TODO: Add your message handler code here and/or call default
                          if (pScrollBar->GetDlgCtrlID() == IDC_SPIN2)
                          {
                              //int spinValue = reinterpret_cast<CSpinButtonCtrl*>(pScrollBar)->GetPos32();
                              bufwr[124] = (nPos - 1) | ((Dist >> 1) & 0x80);
                          }
                         
                            CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
                        }

                      Работает.
                      ExpandedWrap disabled
                        static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN2))->SetRange(0,100);

                      Это тоже работает. Очевидно была механ. ошибка. В CSpinButtonCtrl вместо l(L) стояла 1(1)
                      Переменную
                      ExpandedWrap disabled
                        m_spin2Value
                      создавал через Add Variable для Spin
                      Прикреплённая картинка
                      Прикреплённая картинка
                      Сообщение отредактировано: Acvarif -
                        Цитата Acvarif @
                        Переменную
                        ExpandedWrap disabled
                          m_spin2Value
                        создавал через Add Variable для Spin

                        правильно, но в данном случае она не нужна :)
                        это в C++Builder их лепят без надобности, тут все по взрослому :D
                          Цитата Acvarif @
                          Переменную
                          ExpandedWrap disabled
                            m_spin2Value
                          создавал через Add Variable для Spin
                          Прикреплённая картинка
                          Прикреплённая картинка

                          "Частота бод" - звучит, как фраза из далёкого прошлого.
                          Сечас пишут "bps" - bits per second - бит в секунду.
                          ---
                          я вот чего хотел узнать - в среде Борланд Билдера надо-ли
                          каким-то образом указывать ID контрола ?
                          (Того-же статика, как у тебя в этом проекте, например)
                          Или там всё автомотизировано ?
                            В Билдере все автоматизировано.
                            Например клик по ComboBox5 (который уже выставлен на форму) - появляется функция в которой производятся операции с переменными, локальными или глобальными
                            ExpandedWrap disabled
                              void __fastcall TForm1::ComboBox5Click(TObject *Sender)
                              {
                                if(ComboBox5->Text == "15-25м")
                                {
                                  bufwr[1] &= ~(1 << 5);
                                }
                                else if(ComboBox5->Text == "25-40м")
                                {
                                  bufwr[1] |= (1 << 5);
                                }
                              }

                            В качестве ID просто названия типа ComboBox5.
                            По поводу Контрола. Что имеется ввиду? Если например CSpinEdit который повторяет Edit Control+Spin Control MFC то тоже все просто. Например изменение данных в окне на 1
                            ExpandedWrap disabled
                              void __fastcall TForm1::CSpinEdit2Change(TObject *Sender)
                              {
                                PrCanal = CSpinEdit2->Value;
                               
                              }

                            Value - готовая переменная, одинаковая почти для всех Контролов, в которой данные меняются при клике вверх или вниз.
                            PrCanal - пользовательская переменная
                            А Статика вообще проще-простого
                            Например вывод данных в Статик под названием Label16 (это то же что и ID)из пременной Distm
                            ExpandedWrap disabled
                              sprintf(Buffer,"Дистанция: %d м", Distm);
                                    Form1->Label16->Caption = Buffer;

                            Buffer - обычно char Buffer[20] - достаточно для небольшого текста
                            Сообщение отредактировано: Acvarif -
                              Цитата Acvarif @
                              А Статика вообще проще-простого

                              Если в MFC "этого" нет, ты можешь сам "это" сделать.
                              Прямо сейчас, и даже ещё лучше..
                              Наследуемся от класса... эээ.. который "статик".
                              Который, наверное, CStatic.
                              Перегружаем метод SetWindowText.
                              Или пишем метод SetWindowTextEx.
                              И пишем что-то вроде:
                              ExpandedWrap disabled
                                // ---------------------------------------------------------------------------------
                                void WINAPI CStaticEx::SetWindowTextEx(const TCHAR* pFmt,...)
                                {
                                 if(!pFmt) return;
                                 va_list ap;        //Указатель на список параметров
                                 va_start(ap,pFmt); //Настроились на список параметров
                                 
                                 TCHAR sss[32768];
                                 
                                 size_t sizeBuff  = ARRAYSIZE(sss);
                                 
                                 _vsntprintf_s(sss,sizeBuff,_TRUNCATE,pFmt,ap);
                                 SetWindowText(sss);
                                 
                                 va_end(ap); //Завершаем работу с макрокомандами
                                }
                                // ---------------------------------------------------------------------------------


                              В результате ты сможешь писать:
                              ExpandedWrap disabled
                                CStaticEx xxmm;
                                //...
                                 xxmm.SetWindowTextEx(_T("Дистанция: %d м"), Distm);
                                //...


                              В результате число таких конструкций:
                              ExpandedWrap disabled
                                char Buffer[20]; sprintf(Buffer,"Дистанция: %d м", Distm);
                                //Buffer - обычно  - достаточно для небольшого текста

                              резко уменьшится.
                              Сообщение отредактировано: ЫукпШ -
                                Может быть. Мне трудно судить. Былдер в свое время был идеальной средой для разработки визуальных приложений. Если в метку типа Label1 (Static Control)нужно поместить текст то без всяких заморочек
                                ExpandedWrap disabled
                                  Label1->Caption = "текст";
                                Потом они продались Delphi и все пошло враздрай. До сих пор пользуюсь Builder 6. Это новое Embarcadero - страшно к нему подступиться, такого там наворочали. MFC неплохо придуман. На первый взгляд небольшое неудобство - мало компонентов. Хотя может в большинстве случаев того, что есть, вполне достаточно..
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (8) « Первая ... 4 5 [6] 7 8  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0780 ]   [ 23 queries used ]   [ Generated: 10.05.24, 14:39 GMT ]