线程中使用m_wndStatusBar.SetPaneText函数出错

在MFC线程中调用m_wndStatusBar.SetPaneText函数导致运行时错误。为解决此问题,可以采用API替代,并通过全局指针同步主线程对话框对象,步骤包括声明全局指针, OnInitDialog时赋值,以及在其他类中引用该指针调用成员函数。
摘要由CSDN通过智能技术生成

在线程中使用m_wndStatusBar.SetPaneText函数,编译通过,运行出错,调试发现运行到该语句时报错!

于是在网上查找资料发现:

因为MFC是线程安全的,所以再线程中调用该函数更新状态栏会出错。

于是使用API来实现:

::SendMessageA(pDlg->m_wndStatusBar.m_hWnd,SB_SETTEXT,0,(LPARAM)TEXT("检测到GigE Vision设备"));

或者

CString str = _T("检测到GigE Vision设备");
::SendMessageA(pDlg->m_wndStatusBar.m_hWnd,SB_SETTEXT,0,(LPARAM)LPCTSTR(str));

pDlg是对话框指针,获取方式:

这段代码是在应用程序的主窗口类 `CMainFrame` 的 `OnCreate` 函数执行的。让我逐行解释: - `CDemoApp* pApp = (CDemoApp*)AfxGetApp();`:获取应用程序对象的指针,以便后续使用应用程序的功能。 - `if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)`:调用基类的 `OnCreate` 函数来创建主窗口。如果返回值为 -1,表示创建失败,函数直接返回 -1。 - `if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadBitmap(IDR_MAINFRAME) || !m_wndToolBar.SetButtons(buttons, sizeof(buttons)/sizeof(UINT)))`:创建工具栏并加载位图资源。如果工具栏创建或加载位图失败,函数返回 -1。 - `if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))`:创建状态栏并设置指示器。如果状态栏创建或设置指示器失败,函数返回 -1。 - `CRect rc;`:定义一个矩形变量 `rc`,用于存储主窗口的位置和大小。 - `rc.left = pApp->GetProfileInt("MainWindow", "Left", 5);`:从配置文件读取主窗口的左边位置,默认为 5。 - `rc.top = pApp->GetProfileInt("MainWindow", "Top", 5);`:从配置文件读取主窗口的上边位置,默认为 5。 - `rc.right = pApp->GetProfileInt("MainWindow", "Right", 300);`:从配置文件读取主窗口的右边位置,默认为 300。 - `rc.bottom = pApp->GetProfileInt("MainWindow", "Bottom", 300);`:从配置文件读取主窗口的下边位置,默认为 300。 - `MoveWindow(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);`:将主窗口移动到指定位置和设置指定大小。 这段代码的作用是在主窗口创建时创建工具栏和状态栏,并根据配置文件保存的位置和大小信息设置主窗口的位置和大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值