MFCのスレッドからステータスバーのペインテキストを変更する方法は?

StackOverflow https://stackoverflow.com/questions/391125

質問

MFCでCSTATUSBARを使用してダイアログがあります。別のスレッドで、ステータスバーのペインテキストを変更したいと思います。しかし、MFCは主張に不満を言っていますか?それはどのように行われますか?コードの例が素晴らしいでしょう。

役に立ちましたか?

解決

メインフレームウィンドウにプライベートメッセージを投稿し、ステータスバーを更新するように「尋ねる」ことができます。スレッドにはメインウィンドウハンドルが必要です(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<HWND>(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<HWND>(pParam);
    ASSERT(hMainFrame != NULL);
    CString* pString = new CString;
    *pString = _T("Hello, world!");
    ::PostMessage(hMainFrame, WM_USER, 0, reinterpret_cast<LPARAM>(pString));
    return 0;
}

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

完璧ではありませんが、それは始まりです。

他のヒント

多分これはあなたを助けることができます: MFCのスレッドからUI要素にアクセスする方法。

私は自分でC ++/MFCをコードしませんが、Cross-Thread GUIアップデートとして知られているC#で同様の問題を経験しました。

送信]またはポストメサージを使用してメッセージを使用して、ステータスバーテキストを更新する必要があることをUIスレッドに通知する必要があります。ワーカースレッドからUI要素を更新しようとしないでください。痛みを与えることになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top