Я новичок в программировании, и мне нужно создать приложение для моей дипломной работы. Мое приложение создано как SDI в MF C. Я сделал модальный диалог, который открывается из View. В диалоговом окне после кнопки pu sh к приложению должен быть подключен измерительный прибор, который должен зарегистрировать несколько событий. После закрытия диалогового окна координаты с подключенного устройства должны отображаться в режиме просмотра в Stati c Text .
Я могу получать координаты от устройства, но возникает проблема, если я хотите изменить Stati c text , чтобы показать эти координаты с помощью ShowWindowTextW (). Если я понимаю, когда вызывается DoModal (), диалоговое окно закрывается, и я не могу получать какие-либо значения или функции из диалогового окна (поэтому я не могу изменить Stati c Text в представлении).
Я нашел несколько примеров использования указателей, но не знаю, как заставить их работать. Я застрял здесь на какое-то время и получил несколько типов ошибок, пытающихся их решить. Мой код:
MainWindow. cpp - Просмотр
void CMainWindow::OnFileConnect()
{
CConnect dlgConnect;
dlgConnect.DoModal();
}
// Displays measurement
void CMainWindow::UpdatePosition() {
if (ManagedWrapper::LMFTracker) {
LMF::Tracker::MeasurementResults::SingleShotMeasurement3D^ position = ManagedWrapper::newPosition;
m_dro_x.SetWindowTextW((CString)position->Position->Coordinate1->ToString());
m_dro_y.SetWindowTextW((CString)position->Position->Coordinate2->ToString());
m_dro_z.SetWindowTextW((CString)position->Position->Coordinate3->ToString());
}
}
Connect. cpp - диалог
// CConnect dialog
IMPLEMENT_DYNAMIC(CConnect, CDialogEx)
CConnect::CConnect(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_CONNECTION, pParent)
{
}
CConnect::~CConnect()
{
}
void CConnect::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SIMULATOR, m_Simulator);
DDX_Control(pDX, IDC_CONNECT, m_Connect);
DDX_Control(pDX, IDC_IPADRESS, m_IPAdress);
}
BEGIN_MESSAGE_MAP(CConnect, CDialogEx)
ON_BN_CLICKED(IDC_CONNECT, &CConnect::OnBnClickedButtonConnect)
ON_BN_CLICKED(IDC_SIMULATOR, &CConnect::OnBnClickedButtonConnectsimulator)
END_MESSAGE_MAP()
void CConnect::OnBnClickedButtonConnect()
{
CString ipAdressString;
m_IPAdress.GetWindowText(ipAdressString);
ConnectTo(ipAdressString);
}
void CConnect::OnBnClickedButtonConnectsimulator()
{
ConnectTo(_T("Simulator"));
}
void CConnect::ConnectTo(CString ipAddress)
{
if (ManagedWrapper::LMFTracker)
{
ManagedWrapper::LMFTracker->Disconnect();
}
Connection^ con = gcnew Connection();
if (ipAddress != "0.0.0.0") {
ManagedWrapper::LMFTracker = con->Connect(gcnew System::String(ipAddress));
// Register some Events...
}
}
В переменной позиция в CMainWindow. cpp - правильное значение, поэтому эта часть должна быть в порядке. Если я попытаюсь отладить код, я получу ошибку в wino cc. cpp: m_hWnd Невозможно прочитать память
void CWnd::SetWindowText(LPCTSTR lpszString)
{
ENSURE(this);
ENSURE(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); // exception thrown in this line
if (m_pCtrlSite == NULL)
::SetWindowText(m_hWnd, lpszString);
else
m_pCtrlSite->SetWindowText(lpszString);
}
У меня возникло исключение: нарушение доступа на чтение. Это было 0x250 . " в строке, прокомментированной выше. В стеке вызовов есть:> mfc140ud.dll! CWnd :: SetWindowTextW (const wchar_t * lpszString = 0x00e5b200) Строка 242 C ++
следующая: Aplikacia.exe! CMainWindow :: UpdatePosition () Строка 95 C ++
, то есть строка с m_dro_x в MainWindow. cpp (m_dro_x имеет значение hWnd = ???).
И еще: Aplikacia.exe! ManagedWrapper :: OnTargetPostionChanged (LMF :: Tracker :: Tracker ^ sender = {LMF :: Tracker :: AT960Tracker ^}, LMF :: Tracker :: MeasurementResults :: SingleShotMeasurement3D ^ position = {LMF :: Tracker :: MeasurementResults :: SingleShotMeasurement3D ^}) Строка 66 C ++
Это из файла Aplikacia.h - вот код:
class CAplikaciaApp : public CWinApp
{
public:
CAplikaciaApp() noexcept;
// Overrides
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
// Implementation
afx_msg void OnAppAbout();
DECLARE_MESSAGE_MAP()
};
extern CAplikaciaApp theApp;
ref class ManagedWrapper {
public:
static CMainWindow* pMainWindow = nullptr;
static LMF::Tracker::Tracker^ LMFTracker = nullptr;
static LMF::Tracker::MeasurementResults::SingleShotMeasurement3D^ newPosition = nullptr;
static void OnTargetPostionChanged(LMF::Tracker::Tracker^ sender, LMF::Tracker::MeasurementResults::SingleShotMeasurement3D^ position) {
newPosition = position;
pMainWindow->UpdatePosition();
}
};
Я нашел решение своей проблемы, очень полезной оказалась эта статья: stati c Указатель на настраиваемый тип остается nullptr после инициализации с помощью stati c ненулевой указатель того же типа
Я добавил эту строку в MainWindow.h:
extern CMainWindow* pMainWindow;
Не знаю, является ли это наилучший возможный подход, но он работает.