На главную Наши проекты:
Журнал   ·   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) « Первая ... 2 3 [4] 5 6 ... Последняя » все  ( Перейти к последнему сообщению )  
> Visual Studio 2008 + COM Port
    Спасибо. Сработало. Интересно работает ComboBox При каждом нажатии на стрелку выбора вниз - собственно это вызов функции
    // выбор COM порта
    ExpandedWrap disabled
      void CMFCtestDlg::OnCbnDropdownCombo1()
      {
          CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
          pCombo->AddString(L"COM1");
          pCombo->AddString(L"COM2");
          pCombo->AddString(L"COM3");
      }

    в окне выбора появляется повторение типа
    Прикреплённая картинка
    Прикреплённая картинка

    А.. врубился. Это нужно делать при запуске формы. CMFCtestDlg::OnCbnDropdownCombo1() не нужна.
    Сообщение отредактировано: Acvarif -
      Цитата Acvarif @
      А.. врубился. Это нужно делать при запуске формы. CMFCtestDlg::OnCbnDropdownCombo1() не нужна.

      в OnInitDialog :)

      еще если это список не меняется то можно в ресурсах его прописать в свойство Data: COM1;COM2;COM3
        Очередной затык. Окно Edit Control.
        Имеется функция void ReadPrinting(DWORD btr) которая вызывается непосредственно в функции-потоке чтения.
        Функция принимает данные о количестве прочитанных байт (DWORD btr) COM портом и тупо выводит данные из глобального буфера bufrd в окно Memo в HEX виде.
        Выглядит это так
        ExpandedWrap disabled
            for(UINT32 i=0; i<btr ; i++)
            {
              stroka = stroka + IntToHex(bufrd[i], 2) + ' ';
            }
            Form1->Memo2->Lines->Add(stroka);

        Подскажите пожалуйста как это можно повторить в MFC - вывести данные в окно Edit Control.
        Для теста пробовал несколько типичных вариантов , например типа
        ExpandedWrap disabled
          SetWindowText(IDC_EDIT1, "Text");

        Неработает. Ошибка
        ExpandedWrap disabled
          Error 1 'SetWindowTextW' : cannot convert parameter 1 from 'int' to 'HWND'
          www.ya.ru, ищем "CEdit MFC" -> находим описание:
          CEdit
          Цитата

          ..
          CEdit наследует значительные возможности из CWnd.
          Для установки и извлечения текста из объекта CEdit, используйте функции-члены
          SetWindowText и GetWindowText
          ...
            Такая конструкция работает
            ExpandedWrap disabled
                  CWnd* pWnd = GetDlgItem(IDC_EDIT1);
                  pWnd->SetWindowText(_T("Gerald Samper"));

            Но только если вызывается в OnInitDialog или в любом обработчике (кнопки или т. п)
            Если поместить это в любую внешнюю функцию то возникает ошибка
            ExpandedWrap disabled
              Error   1   error C2660: 'GetDlgItem' : function does not take 1 arguments

            В чем хитрость?
            В билдре там просто добавляется Form1->...
            В MFC как?
            Похоже элемент IDC_EDIT1 или вся функция GetDlgItem(IDC_EDIT1), если можно так выразиться, не попадает во внешнюю функцию.
            Сообщение отредактировано: Acvarif -
              Цитата Acvarif @
              В чем хитрость?
              В билдре там просто добавляется Form1->...
              В MFC как?
              Похоже элемент IDC_EDIT1 или вся функция GetDlgItem(IDC_EDIT1), если можно так выразиться, не попадает во внешнюю функцию.

              при создании потока в качестве параметра lParam передается дескриптор на главное окно:
              ExpandedWrap disabled
                DWORD WINAPI WorkThread(LPVOID lParam)
                {
                    CWnd* pWnd = CWnd::FromHandle((HWND)lParam);
                    CEdit* pEdit = (CEdit*)pWnd->GetDlgItem(IDC_EDIT1);
                    pEdit->SetWindowText(_T("Hello from thread!"));
                    return 0;
                }

              также в MFC есть указатель на главное окно сохраненое в члене m_pMainWnd класса CWinApp: AfxGetApp()->m_pMainWnd.
              судя по всему Form1 это тоже указатель на главное окно? :D
              Сообщение отредактировано: Cfon -
                Спасибо. Пнятно. Для проверки поместил код в функцию-поток чтения в то место где собственно производится загрузка принятого байта в буфер bufrd
                ExpandedWrap disabled
                            if(btr)
                            {
                              // прочитать байты из порта в буфер программы
                              ReadFile(COMport, bufrd, btr, &temp, &overlapped);
                              // увеличиваем счётчик байтов
                              counterRX+=btr;
                              // вывод данных на экран
                              CWnd* pWnd = CWnd::FromHandle((HWND)lpParam);
                          CEdit* pEdit = (CEdit*)pWnd->GetDlgItem(IDC_EDIT1);
                          pEdit->SetWindowText(_T("Hello from thread!"));
                            }

                Один раз в секунду на COM прт приходит пакет данных. Явно btr становится не 0 - вызывается код
                ExpandedWrap disabled
                  CWnd* pWnd = CWnd::FromHandle((HWND)lpParam);
                          CEdit* pEdit = (CEdit*)pWnd->GetDlgItem(IDC_EDIT1);
                          pEdit->SetWindowText(_T("Hello from thread!"));

                Просходит странная ошибка, вернее исключение, которое указывает на файл winocc.cpp
                Прикреплённая картинка
                Прикреплённая картинка

                Что-бы это мгло быть. Ведь в общем ничего особо не делается. Просто попытка вывести в окно Edit Control коротий текст. Может это связано с тем, что на порт приходит порядка 800 байт и по сути каждый раз в нем должно отображаться "Hello from thread!" (800 раз) Чего-то не помещается? Сделал Auto scrol true. Не помогло...
                Уменьшил количество байт до 24. То же самое, в отладчике застревает на строке
                ExpandedWrap disabled
                  CEdit* pEdit = (CEdit*)pWnd->GetDlgItem(IDC_EDIT1);
                Сообщение отредактировано: Acvarif -
                  Цитата Acvarif @
                  Просходит странная ошибка, вернее исключение, которое указывает на файл winocc.cpp
                  Что-бы это мгло быть.

                  обращение к несуществующему объекту или попросту по нулевому указателю :D
                  ты дескриптор окна-владельца передаешь при создании потока?

                  Цитата Acvarif @
                  То же самое, в отладчике застревает на строке
                  ExpandedWrap disabled
                    CEdit* pEdit = (CEdit*)pWnd->GetDlgItem(IDC_EDIT1);

                  невалидный указатель pWnd.
                  Сообщение отредактировано: Cfon -
                    Функция создания потока
                    ExpandedWrap disabled
                      reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL);

                    Только имя потоковой функции ReadThread. Дескриптор нет. Как это выглядит правильно?
                      Цитата Acvarif @
                      В чем хитрость?
                      В билдре там просто добавляется Form1->...
                      В MFC как?
                      Похоже элемент IDC_EDIT1 или вся функция GetDlgItem(IDC_EDIT1), если можно так выразиться, не попадает во внешнюю функцию.

                      По всей вероятности, в том, один из методов CWnd имеет имя "GetDlgItem".
                      Которое совпадает с именем WINDOWS-API функции "GetDlgItem".
                      Они имеют разное число параметров.
                      Когда функция с таким именем вызывается внутри класса, используется
                      функция класса. Снаружи класса вызывается API-функция, которая имеет
                      другой прототип. Поэтому появляется сообщение об ошибке.
                        Цитата Acvarif @
                        Функция создания потока
                        ExpandedWrap disabled
                          reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL);

                        Только имя потоковой функции ReadThread. Дескриптор нет. Как это выглядит правильно?

                        4 параметр есть указатель на данные для рабочего потока, передаём в него дескриптор главного окна через GetSafeHwnd():
                        ExpandedWrap disabled
                          reader = CreateThread( NULL, 0,ReadThread, GetSafeHwnd(), CREATE_SUSPENDED, NULL);
                          Спасибо. Работает. Информация в окне Edit Contol отображается нормально, причем с обновлением.
                          Хотя Micosoft пишет про четвертый параметр optional
                          ExpandedWrap disabled
                            lpParameter [in, optional]
                                A pointer to a variable to be passed to the thread.

                          Дааа. В MFC все достаточно жестко..
                            Цитата Acvarif @
                            Дааа. В MFC все достаточно жестко..

                            а мне MFC по кайфу :D
                              Надеюсь на MFC удастся повторить билдеровсую прогу с потоками на API. Во всяком случае прием уже точно работает.
                              Данные COM порта накапливаются в глобальном буфере bufrd
                              ExpandedWrap disabled
                                ReadFile(COMport, bufrd, btr, &temp, &overlapped);

                              Далее их нужно отобразить в окне Edit Contol в HEX виде.
                              В билдере это просто преобразовывалось функцией + пробелы между байтами
                              ExpandedWrap disabled
                                  // Перенос буфера в строку.
                                  for(UINT32 i=0; i<btr ; i++)
                                  {
                                    stroka = stroka + IntToHex(bufrd[i], 2) + ' ';
                                  }

                              затем строка выводилась в окно Memo
                              Сейчас выводится в окно Edit Control
                              Как в MFC можно повторить это:
                              ExpandedWrap disabled
                                stroka = stroka + IntToHex(bufrd[i], 2) + ' ';
                              Сообщение отредактировано: Acvarif -
                                Цитата Acvarif @
                                Как в MFC можно повторить это:
                                ExpandedWrap disabled
                                  stroka = stroka + IntToHex(bufrd[i], 2) + ' ';

                                ExpandedWrap disabled
                                  CString s;
                                  s.Format("%X", bufrd[i]);
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0864 ]   [ 20 queries used ]   [ Generated: 10.05.24, 09:09 GMT ]