Partager via


Guide pratique pour utiliser des flux

Vous pouvez utiliser des flux pour transférer des données vers ou hors d’un contrôle d’édition enrichi. Un flux est défini par une structure EDITSTREAM , qui spécifie une mémoire tampon et une fonction de rappel définie par l’application.

Pour lire des données dans un contrôle d’édition enrichi (autrement dit, diffuser les données), utilisez le message EM_STREAMIN . Le contrôle appelle à plusieurs reprises la fonction de rappel de l’application, qui transfère à chaque fois une partie des données dans la mémoire tampon.

Pour enregistrer le contenu d’un contrôle d’édition enrichi (autrement dit, diffuser en continu les données), vous pouvez utiliser le message EM_STREAMOUT . Le contrôle écrit à plusieurs reprises dans la mémoire tampon, puis appelle la fonction de rappel de l’application. Pour chaque appel, la fonction de rappel enregistre le contenu de la mémoire tampon.

Bon à savoir

Technologies

Prérequis

  • C/C++
  • Programmation de l’interface utilisateur Windows

Instructions

Utiliser un flux

L’exemple de code suivant montre comment lire un fichier .rtf dans un contrôle d’édition enrichi. Le handle de fichier est passé à la fonction de rappel via le membre dwCookie de la structure 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;
    
}

Utilisation de contrôles d’édition enrichie

Démonstration des contrôles communs Windows (CppWindowsCommonControls)