Wie ändere ich den Bereichstext der Statusleiste von einem Thread in MFC?

 C Programming >> C-Programmierung >  >> Tags >> MFC
Wie ändere ich den Bereichstext der Statusleiste von einem Thread in MFC?


Ich habe einen Dialog in MFC mit einer CStatusBar. In einem separaten Thread möchte ich den Bereichstext der Statusleiste ändern. Allerdings klagt MFC mit Behauptungen? Wie wird es gemacht? Ein Beispielcode wäre toll.


Antworten:


Sie könnten eine private Nachricht an das Hauptrahmenfenster senden und es bitten, die Statusleiste zu aktualisieren. Der Thread würde das Hauptfenster-Handle benötigen (verwenden Sie nicht das CWnd-Objekt, da es nicht Thread-sicher ist). Hier ist ein Beispielcode:


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;
}

Der Code stammt aus dem Gedächtnis, da ich hier zu Hause keinen Zugriff auf den Compiler habe, also entschuldigen Sie sich jetzt für etwaige Fehler.


Anstatt WM_USER zu verwenden Sie könnten Ihre eigene Windows-Nachricht registrieren:


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

Machen Sie das Obige zu einem statischen Mitglied von CMainFrame zum Beispiel.


Wenn die Verwendung von String-Ressourcen zu einfach ist, lassen Sie den Thread den String auf dem Heap zuweisen und stellen Sie sicher, dass die CMainFrame-Aktualisierungsfunktion ihn löscht, z. B.:


// 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;
}

Nicht perfekt, aber es ist ein Anfang.


Einige Code-Antworten


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;
}
UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));
// 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;
}