Поделиться через


Использование Потоки

Потоки можно использовать для передачи данных в элемент управления с расширенными возможностями редактирования или из него. Поток определяется структурой EDITSTREAM , которая задает буфер и функцию обратного вызова, определяемую приложением.

Чтобы считывать данные в элемент управления расширенными изменениями (т. е. потоковая передача данных), используйте сообщение EM_STREAMIN . Элемент управления неоднократно вызывает функцию обратного вызова приложения, которая передает часть данных в буфер каждый раз.

Чтобы сохранить содержимое элемента управления расширенными изменениями (т. е. потоковая передача данных), можно использовать сообщение EM_STREAMOUT. Элемент управления многократно записывает в буфер, а затем вызывает функцию обратного вызова приложения. Для каждого вызова функция обратного вызова сохраняет содержимое буфера.

Это важно знать

Технологии

Необходимые компоненты

  • C/C++
  • Программирование пользовательского интерфейса Windows

Instructions

Использование потока

В следующем примере кода показано, как считывать файл .rtf в элемент управления расширенными изменениями. Дескриптор файла передается функции обратного вызова через член dwCookie структуры 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;
    
}

Использование элементов управления расширенными изменениями

Демонстрация общих элементов управления Windows (CppWindowsCommonControls)