我是编程初学者,我应该为我的期末论文创建一个应用程序。我的应用程序在 MFC 中创建为 SDI。我制作了一个从 View 打开的模态对话框。在对话框中,按下按钮后,测量设备应连接到应用程序并应注册多个事件。对话框关闭后,来自连接设备的坐标应显示在 View in Static Text中。
我可以从设备接收坐标,但是如果我想更改静态文本以使用 ShowWindowTextW() 显示这些坐标,则会出现问题。如果我理解,当调用 DoModal() 时,对话框关闭,并且我无法从对话框接收任何值或函数(因此,我无法更改视图中的静态文本)。
我找到了一些使用指针的例子,但我不知道如何使它工作。我在这里停留了一段时间,并遇到了几种试图解决它们的错误。我的代码:
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 中的变量位置是正确的值,所以这部分应该没问题。如果我尝试调试代码,我会在 winocc.cpp 中得到错误:m_hWnd Unable to read memory
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() Line 95 C++
这是 MainWindow.cpp 中 m_dro_x 的行(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();
}
};
我找到了我的问题的解决方案,这篇文章非常有帮助: static Pointer to Custom Type stays nullptr after initialization with static not-null pointer of same Type
我将此行添加到 MainWindow.h 中:
extern CMainWindow* pMainWindow;
不知道这是否是最好的方法,但它有效。