Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2007, 18:46   #1
Gorthaur
Новичок
Джуниор
 
Регистрация: 19.11.2007
Сообщений: 1
По умолчанию проблема с печатью текста в винде

Всем привет!
Не могли бы вы помочь со следующей проблемой :

при печати окна все линии и битмапы выводятся правильно - а вот текст печатается вверх ногами и со смещением по вертикали.
На другом принтере текст не выводиться вообще, если размер букв меньше 4.5 см

вот кусок тестовой программки, которая имитирует печать в проекте(те же условия) :

Код:
void CSimplePrintDlg::Print() 
{
    if (!m_printerHDC)
    {
        return;
    }
    XFORM xForm;    
    CPoint stringOrigin(0, 0);
    CSize stringSize(0, 0);
    CRect stringRect(0, 0, 0, 0);
    CSize paperSize(0, 0);
    char rawText[] =  "%d:ABCDEFGH";
    char docName[20];
    char theText[30];
    memset(docName, 0, sizeof(docName));
    
    // m_num - document number
    sprintf(docName, "SimplePrint#%d", m_num);
   
    DOCINFO docInfo; 
    memset(&docInfo, 0, sizeof(docInfo));
    docInfo.cbSize = sizeof(docInfo);
    docInfo.lpszDocName = docName;

    DRAWTEXTPARAMS params;
    params.cbSize  = sizeof(DRAWTEXTPARAMS); 
    params.iTabLength  = 4; 
    params.iLeftMargin = 0; 
    params.iRightMargin = 0; 
    params.uiLengthDrawn = 0; 

    LOGFONT logFontPDF, logFontPrinter; 
    memset(&logFontPDF, 0,  sizeof(LOGFONT));
    memset(&logFontPrinter, 0,  sizeof(LOGFONT));

    strcpy(logFontPDF.lfFaceName, "");
    strcpy(logFontPDF.lfFaceName, "");
    logFontPDF.lfOutPrecision = logFontPrinter.lfOutPrecision = OUT_RASTER_PRECIS;
    HFONT hFontPDF = NULL, hFontPrinter = NULL;
    int ok = 0;
    int i;

    ok = StartDoc(m_printerHDC, &docInfo);
    ASSERT(ok > 0);
    ok = StartPage(m_printerHDC);
    ASSERT(ok > 0);

    ok = SetGraphicsMode(m_printerHDC, GM_ADVANCED);
    ASSERT(ok != 0);
    ok = SetMapMode(m_printerHDC, MM_LOMETRIC);
    ASSERT(ok != 0);

    paperSize.cx = GetDeviceCaps(m_printerHDC, HORZSIZE);
    paperSize.cy = GetDeviceCaps(m_printerHDC, VERTSIZE);

    //scaleTo Milimeters - in my prog logical unit is 1mm
   //and in MM_LOMETIC mode - unit =0.1 mm
   //so scaleToMilimeters = 10;
    xForm.eM11 = (FLOAT) scaleToMilimeters; 
    xForm.eM12 = (FLOAT) 0.0; 
    xForm.eM21 = (FLOAT) 0.0; 
    xForm.eM22 = (FLOAT) scaleToMilimeters; 
    xForm.eDx  = (FLOAT) 0.0; 
    xForm.eDy  = (FLOAT) (-scaleToMilimeters  *  paperSize.cy);

    ok = SetWorldTransform(m_printerHDC, &xForm);
    ASSERT(ok != 0);
    SetBkMode(m_printerHDC, TRANSPARENT);
    SelectObject(m_printerHDC, GetStockObject(BLACK_PEN));
//    SelectObject(m_printerHDC, GetStockObject(LTGRAY_BRUSH));

    stringOrigin.x = 10; 
    stringOrigin.y = 0;

    SelectObject(m_printerHDC, GetStockObject(DEFAULT_GUI_FONT));
    TextOut(m_printerHDC, 100, 100, docName, strlen(docName));
    if (m_swap)
        TextOut(m_printerHDC, 80, 50, "swapped rect", strlen("swapped rect"));
    

    while (stringOrigin.y < paperSize.cy)
    {
        sprintf(theText, rawText, m_fontSize);

        memset(&logFontPDF, 0,  sizeof(LOGFONT));memset(&logFontPrinter, 0,  sizeof(LOGFONT));
        hFontPDF  = NULL; hFontPrinter = NULL;

        logFontPDF.lfHeight = m_fontSize;
        logFontPrinter.lfHeight = (float)logFontPDF.lfHeight * (m_printerFontScale / 10);
        hFontPDF = CreateFontIndirect(&logFontPDF);
        hFontPrinter = CreateFontIndirect(&logFontPrinter);
    
        SelectObject(m_printerHDC, hFontPrinter);
        
        GetTextExtentPoint32(m_printerHDC, theText, strlen(theText), &stringSize);
        stringOrigin.y += stringSize.cy + 1;
        stringRect = CRect(stringOrigin.x, stringOrigin.y, stringOrigin.x + stringSize.cx, stringOrigin.y  - stringSize.cy);

        if(!m_printToPDF)
        {
            SelectObject(m_printerHDC, hFontPrinter);
        }

        TEXTMETRIC textMetric; memset(&textMetric, 0, sizeof(TEXTMETRIC));
        GetTextMetrics(m_printerHDC, &textMetric);

        //ok = Rectangle(m_printerHDC, stringRect.left, stringRect.top, stringRect.right, stringRect.bottom);
        DrawBox(m_printerHDC, stringRect);
        //TextOut(m_printerHDC, stringOrigin.x, stringOrigin.y, theText, strlen(theText));

    //     stringRect.bottom += stringSize.cy + 10;
    //     stringRect.top += stringSize.cy + 10;
    //     
    //     ok = Rectangle(m_printerHDC, stringRect.left, stringRect.top, stringRect.right, stringRect.bottom);
        if(m_swap) 
            std::swap(stringRect.top, stringRect.bottom);

        ok = DrawTextEx(m_printerHDC,
                                         theText, -1, 
                                        (LPRECT)&stringRect, 
                                        DT_LEFT | DT_NOCLIP, 
                                        &params);   

        m_fontSize += m_fontSizeStep;
    }

    EndPage(m_printerHDC);
    EndDoc(m_printerHDC);
}
был бы очень признателен за помощь - уже 4 дня в этом копаюсь...
Gorthaur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема поиск и замена текста(Delphi) KirkMETAL Помощь студентам 4 26.07.2010 08:41
Реализовать такую тему как в винде ( arp -a ), получить ARP таблицу APOSTOL Работа с сетью в Delphi 3 07.06.2007 12:15
проблема с печатью Арман Общие вопросы Delphi 1 15.04.2007 16:43
Проблема с отображением текста ALR Свободное общение 0 18.02.2007 20:08