Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.174.174] |
|
Страницы: (8) « Первая ... 4 5 [6] 7 8 все ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
Цитата Acvarif @ В билдере имеется функция закрытия формы типа void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) В ней обычно останавливаются потоки, закрывается порт и т. п. Как можно сделать то-же в MFC? обработать сообщение WM_CLOSE пс. на самом деле MFC является всего лишь классовой надстройкой над Win32 API, поэтому все то что делалось в чистом Win32 API применимо и к MFC. |
Сообщ.
#77
,
|
|
|
Возник один неприятный момент. При переносе проекта из одного компа на другой (с домашнего на рабочий) при компиляции возникает ошибка:
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 В чем фишка? На компах разные версии компиляторов? (не уверен, что ставил Студию из одного и того-же источника) Как с этим бороться? Проект пока еще не такой большой. Можно начать заново. Но потом наверняка ситуация повторится если на выходные буду переносить проект обранто с рабочего компа на домашний. |
Сообщ.
#78
,
|
|
|
Цитата Acvarif @ Возник один неприятный момент. При переносе проекта из одного компа на другой (с домашнего на рабочий) при компиляции возникает ошибка: 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. |
Сообщ.
#79
,
|
|
|
Спасибо. Заработал прием и передача в одном потоке. Вывод данных на Edit Control в норме.
Имеются еще некоторые нюансы. Например Static Text почему-то не имеет своего ID. Любой Static Text (1,2 или 9 )имеет ID IDC_STATIC вместо IDC_STATIC1, IDC_STATIC2, ..IDC_STATIC9 Прикреплённая картинка
Попытка обратиться к нему по CStatic* pText = (CStatic*)GetDlgItem(IDC_STATIC9); pText->SetWindowText(_T("Hello")); Error 4 error C2065: 'IDC_STATIC9' : undeclared identifier |
Сообщ.
#80
,
|
|
|
Цитата 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 |
Сообщ.
#81
,
|
|
|
Спасибо. Static работает. В билдере имеется компонент тпа CSpinEdit
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? |
Сообщ.
#82
,
|
|
|
Цитата Acvarif @ Как в MFC можно создать подобный компонент. Имеется в наличии Spin Control но без окна Edit. Очевидно придется компоновать Spin Control + Edit Control? надо у спин конторла установить свойства Auto Buddy = True и Set Buddy Integer = True, клики на кнопках обрабатываются через сообщение WM_VSCROLL, которое отлавливается окном диалога. Начальную инициализацию "спина" можно сделать в OnInitDialog. Edit Control надо ставить рядом слева от Spin контрола согласно Tab-порядку. 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); } |
Сообщ.
#83
,
|
|
|
Спасибо. С установкой Spin+Edit Control разобрался. Все нормально ставится. С обработкой клика не получается.
В функции BOOL CMFCtestDlg::OnInitDialog() добавил строку static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN2))->SetRange(0,100); Появилась ошибка Error 5 error C2061: syntax error : identifier 'CSpinButtonCtr1' m_spin2Value.SetRange(1,120); Подключение в основной файл MFCtestDld.cpp функции 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); } вызывает ошибку Error 6 error C2509: 'OnVScroll' : member function not declared in 'CMFCtestDlg' Тут не совсем врубился. У Edit Control есть событие типа void CMFCtestDlg::OnEnVscrollEdit5() Что представляет из себя функция void CMFCtestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)? Я ее просто прописал в файл MFCtestDld.cpp. |
Сообщ.
#84
,
|
|
|
Цитата Acvarif @ У Edit Control есть событие типа void CMFCtestDlg::OnEnVscrollEdit5() Edit Control в данном случае можно вообще игнорировать все делает Spin control. Цитата Acvarif @ 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) ну и обязательно разместить след код в таблице сообщений: BEGIN_MESSAGE_MAP(CMFCtestDlg, CDialog) ... ON_WM_VSCROLL() ... END_MESSAGE_MAP() но проще воспользоваться соотвествующим мастером ClassView, который добавит весь этот код сам. Для этого открываешь окно ClassView, выбираешь класс CMFCtestDlg, далее в окне Properties -> Messages и там находишь сообщение WM_VSCROLL Цитата Acvarif @ В функции BOOL CMFCtestDlg::OnInitDialog() добавил строку static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN2))->SetRange(0,100); Появилась ошибка Error 5 error C2061: syntax error : identifier 'CSpinButtonCtr1' хз должно работать. CSpinButtonCtrl это обертка для виндового spin контрола. Цитата Acvarif @ Хотя потом создал переменную типа m_spin2Value и сделал запись m_spin2Value.SetRange(1,120); а как создал? код приведи. |
Сообщ.
#85
,
|
|
|
Спасибо. Разобрался. Добавил через Properties -> Messages
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); } Работает. static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN2))->SetRange(0,100); Это тоже работает. Очевидно была механ. ошибка. В CSpinButtonCtrl вместо l(L) стояла 1(1) Переменную m_spin2Value Прикреплённая картинка
|
Сообщ.
#86
,
|
|
|
Цитата Acvarif @ Переменную m_spin2Value правильно, но в данном случае она не нужна это в C++Builder их лепят без надобности, тут все по взрослому |
Сообщ.
#87
,
|
|
|
Цитата Acvarif @ "Частота бод" - звучит, как фраза из далёкого прошлого. Сечас пишут "bps" - bits per second - бит в секунду. --- я вот чего хотел узнать - в среде Борланд Билдера надо-ли каким-то образом указывать ID контрола ? (Того-же статика, как у тебя в этом проекте, например) Или там всё автомотизировано ? |
Сообщ.
#88
,
|
|
|
В Билдере все автоматизировано.
Например клик по ComboBox5 (который уже выставлен на форму) - появляется функция в которой производятся операции с переменными, локальными или глобальными 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 void __fastcall TForm1::CSpinEdit2Change(TObject *Sender) { PrCanal = CSpinEdit2->Value; } Value - готовая переменная, одинаковая почти для всех Контролов, в которой данные меняются при клике вверх или вниз. PrCanal - пользовательская переменная А Статика вообще проще-простого Например вывод данных в Статик под названием Label16 (это то же что и ID)из пременной Distm sprintf(Buffer,"Дистанция: %d м", Distm); Form1->Label16->Caption = Buffer; Buffer - обычно char Buffer[20] - достаточно для небольшого текста |
Сообщ.
#89
,
|
|
|
Цитата Acvarif @ А Статика вообще проще-простого Если в MFC "этого" нет, ты можешь сам "это" сделать. Прямо сейчас, и даже ещё лучше.. Наследуемся от класса... эээ.. который "статик". Который, наверное, CStatic. Перегружаем метод SetWindowText. Или пишем метод SetWindowTextEx. И пишем что-то вроде: // --------------------------------------------------------------------------------- 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); //Завершаем работу с макрокомандами } // --------------------------------------------------------------------------------- В результате ты сможешь писать: CStaticEx xxmm; //... xxmm.SetWindowTextEx(_T("Дистанция: %d м"), Distm); //... В результате число таких конструкций: char Buffer[20]; sprintf(Buffer,"Дистанция: %d м", Distm); //Buffer - обычно - достаточно для небольшого текста резко уменьшится. |
Сообщ.
#90
,
|
|
|
Может быть. Мне трудно судить. Былдер в свое время был идеальной средой для разработки визуальных приложений. Если в метку типа Label1 (Static Control)нужно поместить текст то без всяких заморочек
Label1->Caption = "текст"; |