Compartilhar via


Como usar fluxos

Você pode usar fluxos para transferir dados para dentro ou para fora de um controle de edição avançado. Um fluxo é definido por uma estrutura EDITSTREAM, que especifica um buffer e uma função de retorno de chamada definida pelo aplicativo.

Para ler dados em um controle de edição avançado (ou seja, transmitir os dados), use a mensagem EM_STREAMIN. O controle chama repetidamente a função de retorno de chamada do aplicativo, que transfere uma parte dos dados para o buffer cada vez.

Para salvar o conteúdo de um controle de edição avançado (ou seja, transmitir os dados), você pode usar a mensagem EM_STREAMOUT. O controle grava repetidamente no buffer e, em seguida, chama a função de retorno de chamada do aplicativo. Para cada chamada, a função de retorno de chamada salva o conteúdo do buffer.

O que você precisa saber

Tecnologias

Pré-requisitos

  • C/C++
  • Programação da interface do usuário do Windows

Instruções

Usar um fluxo

O exemplo de código a seguir mostra como ler um arquivo .rtf em um controle rich edit. O identificador de arquivo é passado para a função de retorno de chamada através do membro dwCookie da estrutura EDITSTREAM.

DWORD CALLBACK EditStreamCallback(DWORD_PTR dwCookie, 
                                  LPBYTE lpBuff,
                                  LONG cb, 
                                  PLONG pcb)
{
    HANDLE hFile = (HANDLE)dwCookie;
    
    if (ReadFile(hFile, lpBuff, cb, (DWORD *)pcb, NULL)) 
    {
        return 0;
    }
    
    return -1;
}

BOOL FillRichEditFromFile(HWND hwnd, LPCTSTR pszFile)
{
    BOOL fSuccess = FALSE;
    
    HANDLE hFile = CreateFile(pszFile, GENERIC_READ, 
                              FILE_SHARE_READ, 0, OPEN_EXISTING,
                              FILE_FLAG_SEQUENTIAL_SCAN, NULL);
        
    if (hFile != INVALID_HANDLE_VALUE) 
    {
        EDITSTREAM es = { 0 };
        
        es.pfnCallback = EditStreamCallback;
        es.dwCookie    = (DWORD_PTR)hFile;
        
        if (SendMessage(hwnd, EM_STREAMIN, SF_RTF, (LPARAM)&es) && es.dwError == 0) 
        {
                fSuccess = TRUE;
        }
        
        CloseHandle(hFile);
    }
    
    return fSuccess;
    
}

Usando controles de edição avançada

Demonstração de controles comuns do Windows (CppWindowsCommonControls)