Доступ из представления в модальное диалоговое окно в приложении SDI mf c - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в программировании, и мне нужно создать приложение для моей дипломной работы. Мое приложение создано как 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;

Не знаю, является ли это наилучший возможный подход, но он работает.

1 Ответ

0 голосов
/ 06 мая 2020

Я нашел решение своей проблемы, очень полезной оказалась эта статья: stati c Указатель на настраиваемый тип остается nullptr после инициализации с помощью stati c not-null указатель того же типа

Я добавил эту строку в MainWindow.h:

extern CMainWindow* pMainWindow;

Не знаю, лучший ли это подход, но он работает

...