Pergunta

Eu tenho uma caixa de diálogo no MFC com um cstatusbar. Em um encadeamento separado, quero alterar o texto do painel da barra de status. No entanto, o MFC reclama com as afirmações? Como isso é feito? Um código de exemplo seria ótimo.

Foi útil?

Solução

Você pode postar uma mensagem privada na janela principal do quadro e 'pedir' para atualizar a barra de status. O encadeamento precisaria da alça da janela principal (não use o objeto CWND, pois não será seguro). Aqui está algum código de exemplo:

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

O código é da memória, pois não tenho acesso ao compilador aqui em casa, então peço desculpas agora por nenhum erro.

Ao invés de usar WM_USER Você pode registrar sua própria mensagem do Windows:

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

Fazer o acima um membro estático de CMainFrame por exemplo.

Se o uso da String Resources for muito básico, faça com que o encadeamento aloque a string na pilha e verifique se a função CmainFrame Atualiza a exclui, por exemplo:

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

Não é perfeito, mas é um começo.

Outras dicas

Talvez isso possa te ajudar: Como acessar os elementos da interface do usuário de um thread no MFC.

Eu não codio C ++/MFC, mas experimentei o problema semelhante em C#, conhecido como Atualização de GUI de Thread Cross.

Você deve usar uma mensagem (com envio ou pós-maquiagem) para notificar o encadeamento da interface do usuário de que o texto da barra de status deve ser atualizado. Não tente atualizar elementos da interface do usuário de um tópico de trabalhador, ele deve dar dor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top