Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.23.63.252] |
|
Страницы: (8) « Первая ... 2 3 [4] 5 6 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Спасибо. Сработало. Интересно работает ComboBox При каждом нажатии на стрелку выбора вниз - собственно это вызов функции
// выбор COM порта void CMFCtestDlg::OnCbnDropdownCombo1() { CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1); pCombo->AddString(L"COM1"); pCombo->AddString(L"COM2"); pCombo->AddString(L"COM3"); } в окне выбора появляется повторение типа Прикреплённая картинка
А.. врубился. Это нужно делать при запуске формы. CMFCtestDlg::OnCbnDropdownCombo1() не нужна. |
Сообщ.
#47
,
|
|
|
Цитата Acvarif @ А.. врубился. Это нужно делать при запуске формы. CMFCtestDlg::OnCbnDropdownCombo1() не нужна. в OnInitDialog еще если это список не меняется то можно в ресурсах его прописать в свойство Data: COM1;COM2;COM3 |
Сообщ.
#48
,
|
|
|
Очередной затык. Окно Edit Control.
Имеется функция void ReadPrinting(DWORD btr) которая вызывается непосредственно в функции-потоке чтения. Функция принимает данные о количестве прочитанных байт (DWORD btr) COM портом и тупо выводит данные из глобального буфера bufrd в окно Memo в HEX виде. Выглядит это так for(UINT32 i=0; i<btr ; i++) { stroka = stroka + IntToHex(bufrd[i], 2) + ' '; } Form1->Memo2->Lines->Add(stroka); Подскажите пожалуйста как это можно повторить в MFC - вывести данные в окно Edit Control. Для теста пробовал несколько типичных вариантов , например типа SetWindowText(IDC_EDIT1, "Text"); Неработает. Ошибка Error 1 'SetWindowTextW' : cannot convert parameter 1 from 'int' to 'HWND' |
Сообщ.
#49
,
|
|
|
www.ya.ru, ищем "CEdit MFC" -> находим описание:
CEdit Цитата .. CEdit наследует значительные возможности из CWnd. Для установки и извлечения текста из объекта CEdit, используйте функции-члены SetWindowText и GetWindowText ... |
Сообщ.
#50
,
|
|
|
Такая конструкция работает
CWnd* pWnd = GetDlgItem(IDC_EDIT1); pWnd->SetWindowText(_T("Gerald Samper")); Но только если вызывается в OnInitDialog или в любом обработчике (кнопки или т. п) Если поместить это в любую внешнюю функцию то возникает ошибка Error 1 error C2660: 'GetDlgItem' : function does not take 1 arguments В чем хитрость? В билдре там просто добавляется Form1->... В MFC как? Похоже элемент IDC_EDIT1 или вся функция GetDlgItem(IDC_EDIT1), если можно так выразиться, не попадает во внешнюю функцию. |
Сообщ.
#51
,
|
|
|
Цитата Acvarif @ В чем хитрость? В билдре там просто добавляется Form1->... В MFC как? Похоже элемент IDC_EDIT1 или вся функция GetDlgItem(IDC_EDIT1), если можно так выразиться, не попадает во внешнюю функцию. при создании потока в качестве параметра lParam передается дескриптор на главное окно: 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 это тоже указатель на главное окно? |
Сообщ.
#52
,
|
|
|
Спасибо. Пнятно. Для проверки поместил код в функцию-поток чтения в то место где собственно производится загрузка принятого байта в буфер bufrd
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 - вызывается код 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. То же самое, в отладчике застревает на строке CEdit* pEdit = (CEdit*)pWnd->GetDlgItem(IDC_EDIT1); |
Сообщ.
#53
,
|
|
|
Цитата Acvarif @ Просходит странная ошибка, вернее исключение, которое указывает на файл winocc.cpp Что-бы это мгло быть. обращение к несуществующему объекту или попросту по нулевому указателю ты дескриптор окна-владельца передаешь при создании потока? Цитата Acvarif @ То же самое, в отладчике застревает на строке CEdit* pEdit = (CEdit*)pWnd->GetDlgItem(IDC_EDIT1); невалидный указатель pWnd. |
Сообщ.
#54
,
|
|
|
Функция создания потока
reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL); Только имя потоковой функции ReadThread. Дескриптор нет. Как это выглядит правильно? |
Сообщ.
#55
,
|
|
|
Цитата Acvarif @ В чем хитрость? В билдре там просто добавляется Form1->... В MFC как? Похоже элемент IDC_EDIT1 или вся функция GetDlgItem(IDC_EDIT1), если можно так выразиться, не попадает во внешнюю функцию. По всей вероятности, в том, один из методов CWnd имеет имя "GetDlgItem". Которое совпадает с именем WINDOWS-API функции "GetDlgItem". Они имеют разное число параметров. Когда функция с таким именем вызывается внутри класса, используется функция класса. Снаружи класса вызывается API-функция, которая имеет другой прототип. Поэтому появляется сообщение об ошибке. |
Сообщ.
#56
,
|
|
|
Цитата Acvarif @ Функция создания потока reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL); Только имя потоковой функции ReadThread. Дескриптор нет. Как это выглядит правильно? 4 параметр есть указатель на данные для рабочего потока, передаём в него дескриптор главного окна через GetSafeHwnd(): reader = CreateThread( NULL, 0,ReadThread, GetSafeHwnd(), CREATE_SUSPENDED, NULL); |
Сообщ.
#57
,
|
|
|
Спасибо. Работает. Информация в окне Edit Contol отображается нормально, причем с обновлением.
Хотя Micosoft пишет про четвертый параметр optional lpParameter [in, optional] A pointer to a variable to be passed to the thread. Дааа. В MFC все достаточно жестко.. |
Сообщ.
#58
,
|
|
|
Цитата Acvarif @ Дааа. В MFC все достаточно жестко.. а мне MFC по кайфу |
Сообщ.
#59
,
|
|
|
Надеюсь на MFC удастся повторить билдеровсую прогу с потоками на API. Во всяком случае прием уже точно работает.
Данные COM порта накапливаются в глобальном буфере bufrd ReadFile(COMport, bufrd, btr, &temp, &overlapped); Далее их нужно отобразить в окне Edit Contol в HEX виде. В билдере это просто преобразовывалось функцией + пробелы между байтами // Перенос буфера в строку. for(UINT32 i=0; i<btr ; i++) { stroka = stroka + IntToHex(bufrd[i], 2) + ' '; } затем строка выводилась в окно Memo Сейчас выводится в окно Edit Control Как в MFC можно повторить это: stroka = stroka + IntToHex(bufrd[i], 2) + ' '; |
Сообщ.
#60
,
|
|
|
Цитата Acvarif @ Как в MFC можно повторить это: stroka = stroka + IntToHex(bufrd[i], 2) + ' '; CString s; s.Format("%X", bufrd[i]); |