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


Печать содержимого элементов управления расширенными изменениями

В этом разделе содержатся сведения о том, как распечатать содержимое элементов управления расширенными изменениями.

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

Технологии

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

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

Instructions

Использование предварительной версии печати

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

Форматирование печати для конкретного устройства

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

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

Полосирование — это процесс, с помощью которого создается одна страница выходных данных с помощью одного или нескольких отдельных прямоугольников или полос. Когда все полосы помещаются на страницу, полные результаты изображения. Этот подход часто используется растерными принтерами, которые не имеют достаточного объема памяти или возможности одновременного изображения полной страницы.

Чтобы реализовать полосу, используйте сообщение EM_DISPLAYBAND для отправки последовательной части содержимого элемента управления расширенными изменениями на устройство. Это сообщение выводится на устройство, указанное в предыдущем вызове EM_FORMATRANGE. Конечно, параметр wParam сообщения EM_FORMATRANGE должен быть нулевым, поэтому печать не инициируется этим сообщением.

Пример кода PrintRTF

В следующем примере кода выводится содержимое элемента управления расширенными изменениями на указанный принтер.

// hwnd is the HWND of the rich edit control.
// hdc is the HDC of the printer. This value can be obtained for the 
// default printer as follows:
//
//     PRINTDLG pd = { sizeof(pd) };
//     pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
//
//     if (PrintDlg(&pd))
//     {
//        HDC hdc = pd.hDC;
//        ...
//     }

BOOL PrintRTF(HWND hwnd, HDC hdc)
{
    DOCINFO di = { sizeof(di) };
    
    if (!StartDoc(hdc, &di))
    {
        return FALSE;
    }

    int cxPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETX);
    int cyPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETY);
    
    int cxPhys = GetDeviceCaps(hdc, PHYSICALWIDTH);
    int cyPhys = GetDeviceCaps(hdc, PHYSICALHEIGHT);

    // Create "print preview". 
    SendMessage(hwnd, EM_SETTARGETDEVICE, (WPARAM)hdc, cxPhys/2);

    FORMATRANGE fr;

    fr.hdc       = hdc;
    fr.hdcTarget = hdc;

    // Set page rect to physical page size in twips.
    fr.rcPage.top    = 0;  
    fr.rcPage.left   = 0;  
    fr.rcPage.right  = MulDiv(cxPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSX));  
    fr.rcPage.bottom = MulDiv(cyPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSY)); 

    // Set the rendering rectangle to the pintable area of the page.
    fr.rc.left   = cxPhysOffset;
    fr.rc.right  = cxPhysOffset + cxPhys;
    fr.rc.top    = cyPhysOffset;
    fr.rc.bottom = cyPhysOffset + cyPhys;

    SendMessage(hwnd, EM_SETSEL, 0, (LPARAM)-1);          // Select the entire contents.
    SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg);  // Get the selection into a CHARRANGE.

    BOOL fSuccess = TRUE;

    // Use GDI to print successive pages.
    while (fr.chrg.cpMin < fr.chrg.cpMax && fSuccess) 
    {
        fSuccess = StartPage(hdc) > 0;
        
        if (!fSuccess) break;
        
        int cpMin = SendMessage(hwnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr);
        
        if (cpMin <= fr.chrg.cpMin) 
        {
            fSuccess = FALSE;
            break;
        }
        
        fr.chrg.cpMin = cpMin;
        fSuccess = EndPage(hdc) > 0;
    }
    
    SendMessage(hwnd, EM_FORMATRANGE, FALSE, 0);
    
    if (fSuccess)
    {
        EndDoc(hdc);
    } 
    
    else 
    
    {
        AbortDoc(hdc);
    }
    
    return fSuccess;
    
}

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

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