当前位置:  开发笔记 > 编程语言 > 正文

如何从MFC中的线程更改状态栏的窗格文本?

如何解决《如何从MFC中的线程更改状态栏的窗格文本?》经验,为你挑选了1个好方法。

我在MFC中有一个带有CStatusBar的对话框.在一个单独的线程中,我想更改状态栏的窗格文本.但MFC抱怨断言?怎么做?一个示例代码会很棒.



1> Rob..:

您可以将私人消息发布到主框架窗口,然后“询问”以更新状态栏。该线程将需要主窗口句柄(不要使用CWnd对象,因为它不会是线程安全的)。这是一些示例代码:

static UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam);

void CMainFrame::OnCreateTestThread()
{
    // Create the thread and pass the window handle
    AfxBeginThread(UpdateStatusBarProc, m_hWnd);
}

LRESULT CMainFrame::OnUser(WPARAM wParam, LPARAM)
{
    // Load string and update status bar
    CString str;
    VERIFY(str.LoadString(wParam));
    m_wndStatusBar.SetPaneText(0, str);
    return 0;
}

// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
    const HWND hMainFrame = reinterpret_cast(pParam);
    ASSERT(hMainFrame != NULL);
    ::PostMessage(hMainFrame, WM_USER, IDS_STATUS_STRING);
    return 0;
}

代码来自内存,因为我在家中无法访问编译器,因此对于任何错误,我们深表歉意。

WM_USER您可以注册自己的Windows消息来代替使用:

UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));

CMainFrame例如,将以上内容设为静态成员。

如果使用字符串资源太基础,那么让线程在堆上分配字符串,并确保CMainFrame更新函数将其删除,例如:

// Thread proc
UINT CMainFrame::UpdateStatusBarProc(LPVOID pParam)
{
    const HWND hMainFrame = reinterpret_cast(pParam);
    ASSERT(hMainFrame != NULL);
    CString* pString = new CString;
    *pString = _T("Hello, world!");
    ::PostMessage(hMainFrame, WM_USER, 0, reinterpret_cast(pString));
    return 0;
}

LRESULT CMainFrame::OnUser(WPARAM, LPARAM lParam)
{
    CString* pString = reinterpret_cast(lParam);
    ASSERT(pString != NULL);
    m_wndStatusBar.SetPaneText(0, *pString);
    delete pString;
    return 0;
}

不完美,但这是一个开始。

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有