SetStretchBltMode и печать изображения
От: pluto  
Дата: 23.12.05 11:14
Оценка:
Поправлено форматирование текста. — SchweinDeBurg

Добрый день.
Делаю многостраничную распечатку битмапа копированием фрагмениов изображения из MemoryDC на девайс контекст принтера.
Копирование через StretchBlt.
Сначала пропадали полутона на распечатанном фрагменте (лазерный принтер), потом это удалось обойти при помощи SetStretchBltMode(prtDC, HALFTONE)
ТОлько вот при использовании HALFTONE, область печати, не занятая изображением, заливается черным.

Выглядит это так (серым показана область изображения, разбитого 3х3 страницы):


Почему такое происходит с HALFTONE? И как от этого избавиться можно подскажите плиз.

      SetStretchBltMode(prtDC.m_hDC, HALFTONE); 
      BOOL bl = SetBrushOrgEx(prtDC.m_hDC, 0, 0, NULL);
    int from_page, to_page;
    if (prtDlg.PrintAll()) { // Печать всех страниц
        from_page = prtDlg.m_pd.nMinPage;
        to_page = prtDlg.m_pd.nMaxPage;
    }
    else if (prtDlg.PrintRange()) { // Печать диапазона страниц                                
        from_page = prtDlg.GetFromPage();
        to_page = prtDlg.GetToPage();
    }

    // Разбивка на страницы и копирование на контекст принтера
    prtDC.SetMapMode(MM_TEXT);
    for (int str = 0; str < total_cols; str++) {
        for(int i = 0; i < total_pages; i++) {
            printed_pages++;
            if (from_page > printed_pages || to_page < printed_pages) continue;

            prtDC.StartPage();
            
            if ( i == (total_pages - 1) && total_pages > 1 ) { // последняя страница в строке            
                int last_bmpWidth = (int)(bmpSize.cx - paper_width / ratio_x * i);
                prtDC.StretchBlt(0, 0, (int)(last_bmpWidth * ratio_x), paper_height, &memDC,
                    (int)(paper_width * i / ratio_x), (int)(paper_height * str / ratio_y), last_bmpWidth, 
                    (int)(paper_height / ratio_y), SRCCOPY);        
            }
            else {
                prtDC.StretchBlt(0, 0, paper_width, paper_height, &memDC,
                    (int)(paper_width * i / ratio_x), (int)(paper_height * str / ratio_y), 
                    (int)(paper_width / ratio_x) , (int)(paper_height / ratio_y), SRCCOPY);
            }

              prtDC.EndPage();
        }
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.