MFCのスレッドからステータスバーのペインテキストを変更する方法は?
-
23-08-2019 - |
質問
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要素を更新しようとしないでください。痛みを与えることになります。
所属していません StackOverflow