Cómo cambiar el texto del panel de la barra de estado de un hilo en MFC?
-
23-08-2019 - |
Pregunta
Tengo un cuadro de diálogo en MFC con un CStatusBar. En un hilo separado, quiero cambiar el texto del panel de la barra de estado. Sin embargo MFC se queja con afirma? ¿Cómo se hace? Un código de ejemplo podría ser grande.
Solución
Se puede publicar un mensaje privado a la ventana de marco principal y 'pedir' para actualizar la barra de estado. El hilo necesitaría el mango principal ventana (no use el objeto CWnd, ya que no será hilo de seguridad). Aquí hay un código de ejemplo:
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;
}
El código es de la memoria, ya que no tengo acceso a compilador aquí en casa, por lo que ahora disculpas por cualquier error.
En lugar de utilizar WM_USER
se podría registrar su propio mensaje de Windows:
UINT WM_MY_MESSAGE = ::RegisterWindowsMessage(_T("WM_MY_MESSAGE"));
Hacer la encima de un miembro estático de CMainFrame
por ejemplo.
Si se utiliza recursos de cadena es demasiado básico, entonces tienen el hilo asignar la cadena en el montón y asegúrese de que la función de actualización CMainFrame lo elimina, por ejemplo:.
// 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;
}
No es perfecto, pero es un comienzo.
Otros consejos
Tal vez esto le puede ayudar: ¿Cómo acceder a elementos de la interfaz de un hilo en MFC.
Yo no codifican C ++ / MFC mí mismo, sino que había experimentado el problema similar en C # que se conoce como actualización de interfaz gráfica de usuario se crucen.
Debe utilizar un mensaje (ya sea con o Enviar- PostMessage) para notificar al hilo de interfaz de usuario que el texto de la barra de estado debe ser actualizada. No trate de actualizar elementos de la interfaz de un subproceso de trabajo, es obligado a darle dolor.