Печать и принтеры

Тема в разделе "WASM.WIN32", создана пользователем Rito, 14 июн 2008.

  1. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Возник такой вопрос. Печатать печатаю. Но сегодня решил поменять качество печатания с обычного на быстрое черновое и у меня вся печать пошла крахом. Совершенно не те размеры и прочее. Вопрос вот в чём. Когда я печатаю, в чём же всё такие задаются координаты.
    Например invoke TextOut,100,100,OFFSET Test, SIZEOF Test
    100,100 - что за точки?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    это X и Y соответственно в у.е. При печати надо сверяться с размерами холста, для уточнения. и корректировки. при черновой печати драйвер может сжимать холст для уменьшения качества вывода. Так к примеру делает у меня Epson'овский драйвер. При этом холст сжимается в двое, а вывод происходит с добавлением пустых строк.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Rito
    Gdi32!SetMapMode.
     
  4. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Если я правильно понял из справки то
    invoke SetMapMode, pd.hDC, MM_LOMETRIC
    должен установить каждое значение равным 0.1мм.
    Т.е. 200 у.е. превращаются в 2см.
    Почему то принтер вообще никак не реагирует на это. Вообще перестал печатать. Чистый лист выходит.

    Попробовал так же и это
    Код (Text):
    1. invoke  SetMapMode, pd.hDC, MM_ISOTROPIC
    2. invoke  SetWindowExtEx,pd.hDC,800,600,NULL
    3. invoke  SetViewportExtEx,pd.hDC,800,600,NULL
    4.  
    5. invoke SelectObject, pd.hDC, font1
    6.                    
    7. invoke  TextOut,pd.hDC,200,1000,OFFSET StringOut,SIZEOF StringOut-1
    8. invoke  TextOut,pd.hDC,200,800,OFFSET StringOut1,SIZEOF StringOut1-1
    Всё равно меняет размер. Чем выше качество выставляю, тем меньше печать получается.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Rito
    MM_LOMETRIC должен установить каждое значение равным 0.1мм.
    + координата по Y, при движении сверху вниз, меняется от 0 до -height, обрати внимание на _минус_.

    Вообще перестал печатать. Чистый лист выходит.
    Координаты Y отрицательные?
     
  6. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    200,200 - такие вот координаты. При них чистый лист
     
  7. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    А почему при MM_LOMETRIC всё таки не получается точно в мм.
    200 у.е. превращаются не в 2см, а примерно в 2,5см?
     
  8. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    да, кстати а ни кто не знает, как сделать чтобы принтер печатал не книжную а альбомную страницу? DM_PORTRAIT и DM_LANDSCAPE есть такие флаги, но как ими пользоваться?
     
  9. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    а я вот так печатаю
    Код (Text):
    1.     invoke StartDoc, hdcPrint, offset docinf
    2.                     invoke StartPage,hdcPrint
    3.                        
    4.                            
    5.                             invoke SaveDC,hdcPrint
    6.                             invoke SetMapMode, hdcPrint, MM_TEXT
    7.                             ;invoke SetWindowExtEx, hdcPrint, 1000, 1000, NULL                 
    8.                             ;invoke SetViewportExtEx, hdcPrint, 800, -600, NULL
    9.                             invoke SetViewportOrgEx, hdcPrint, 800 , 600, NULL
    10.                            
    11.                            
    12.                            
    13.                            
    14.  
    15.                             ;invoke SetTextAlign, hdcPrint, NULL
    16.                             ;invoke TextOut, hdcPrint, 0, 0, offset HelloPrinter, 100
    17.  
    18.                            
    19.                             invoke GetDC, hWnd
    20.                             mov hdc, eax
    21.                             invoke CreateCompatibleDC, hdc
    22.                            
    23.                            
    24.                             ;invoke CreateCompatibleDC, hdcPrint
    25.                             mov hMemDC, eax
    26.                             invoke SelectObject, hMemDC, hBitmap
    27.                              invoke BitBlt, hdcPrint, 0, 0, 600, 600, hMemDC, 0, 0, SRCCOPY
    28.                            
    29.                            
    30.  
    31.                             ;invoke Ellipse, hdcPrint, 0,0,200,200
    32.                             ;invoke Rectangle, hdcPrint,0, 0, 100, 100
    33.                            
    34.                             invoke SetPixel, hdcPrint, 100, 100, NULL
    35.                             invoke SetPixel, hdcPrint, 101, 100, NULL
    36.                              invoke SetPixel, hdcPrint, 102, 100, NULL
    37.                             invoke SetPixel, hdcPrint, 103, 100, NULL
    38.                             invoke SetPixel, hdcPrint, 104, 100, NULL
    39.                             invoke SetPixel, hdcPrint, 105, 100, NULL
    40.                             invoke SetPixel, hdcPrint, 106, 100, NULL
    41.                              invoke SetPixel, hdcPrint, 107, 100, NULL
    42.                             invoke SetPixel, hdcPrint, 108, 100, NULL
    43.                             invoke SetPixel, hdcPrint, 109, 100, NULL
    44.                             invoke SetPixel, hdcPrint, 110, 100, NULL
    45.                             invoke SetPixel, hdcPrint, 111, 100, NULL
    46.                              invoke SetPixel, hdcPrint, 112, 100, NULL
    47.                             invoke SetPixel, hdcPrint, 113, 100, NULL
    48.                             invoke SetPixel, hdcPrint, 114, 100, NULL
    49.                             invoke SetPixel, hdcPrint, 115, 100, NULL
    50.                             invoke SetPixel, hdcPrint, 116, 100, NULL
    51.                              invoke SetPixel, hdcPrint, 117, 100, NULL
    52.                             invoke SetPixel, hdcPrint, 118, 100, NULL
    53.                             invoke SetPixel, hdcPrint, 119, 100, NULL
    54.  
    55.  
    56.                             invoke DeleteDC, hMemDC            
    57.    
    58.                            
    59.                             invoke RestoreDC, hdcPrint, -1
    60.  
    61.                             invoke EndPage, hdcPrint
    62.  
    63.                         invoke EndDoc, hdcPrint
    64.                     ;invoke DeleteDC, hdcPrint
     
  10. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    Rito
    не понял почему передаёшь не контекст принтера а элемент структуры?
     
  11. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Это можно задать явно, только используя CreateDC, установив в dmFields бит DM_ORIENTATION и проставив в мембере dmOrientation константу 00000010b (DM_LANDSCAPE, как видимо).

    Если же заполнять остальные поля влом, проще "развернуть" отрисованное вручную, на 90°.
     
  12. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    DEEP
    а как развернуть отрисованное вручную на 90°?
     
  13. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    hellobody
    Там и хранится контекст принтера.
    Получаю так
    Код (Text):
    1. pd      PRINTDLG    <?>
    2. ...
    3. invoke  PrintDlg,OFFSET pd
    4. ...
    По другому у меня не получилось получить его контекст.
     
  14. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    понятно, у тебя по человечески сделано...
    а я вот так получил контекст
    Код (Text):
    1. invoke CreateDC, NULL, OFFSET PrinterName, NULL, NULL
    2. mov hdcPrint, eax
    что то у меня со структурами не сложилось...
     
  15. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    так как же всё таки сделать что бы картинка печаталась в альбомной ориентации?
     
  16. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    у меня есть исходничег
    Код (Text):
    1. LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice)
    2.    {
    3.  
    4.    HANDLE      hPrinter;
    5.    LPDEVMODE   pDevMode;
    6.    DWORD       dwNeeded, dwRet;
    7.  
    8.    /* Start by opening the printer */
    9.    if (!OpenPrinter(pDevice, &hPrinter, NULL))
    10.        return NULL;
    11.  
    12.    /*
    13.     * Step 1:
    14.     * Allocate a buffer of the correct size.
    15.     */
    16.    dwNeeded = DocumentProperties(hWnd,
    17.        hPrinter,       /* Handle to our printer. */
    18.        pDevice,        /* Name of the printer. */
    19.        NULL,           /* Asking for size, so */
    20.        NULL,           /* these are not used. */
    21.        0);             /* Zero returns buffer size. */
    22.    pDevMode = (LPDEVMODE)malloc(dwNeeded);
    23.  
    24.    /*
    25.     * Step 2:
    26.     * Get the default DevMode for the printer and
    27.     * modify it for your needs.
    28.     */
    29.    dwRet = DocumentProperties(hWnd,
    30.        hPrinter,
    31.        pDevice,
    32.        pDevMode,       /* The address of the buffer to fill. */
    33.        NULL,           /* Not using the input buffer. */
    34.        DM_OUT_BUFFER); /* Have the output buffer filled. */
    35.    if (dwRet != IDOK)
    36.    {
    37.        /* If failure, cleanup and return failure. */
    38.        free(pDevMode);
    39.        ClosePrinter(hPrinter);
    40.        return NULL;
    41.    }
    42.  
    43.    /*
    44.         * Make changes to the DevMode which are supported.
    45.     */
    46.    if (pDevMode->dmFields & DM_ORIENTATION)
    47.    {
    48.        /* If the printer supports paper orientation, set it.*/
    49.        pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
    50.    }
    51.  
    52.    if (pDevMode->dmFields & DM_DUPLEX)
    53.     {
    54.        /* If it supports duplex printing, use it. */
    55.        pDevMode->dmDuplex = DMDUP_HORIZONTAL;
    56.    }
    57.  
    58.    /*
    59.     * Step 3:
    60.     * Merge the new settings with the old.
    61.     * This gives the driver an opportunity to update any private
    62.     * portions of the DevMode structure.
    63.     */
    64.     dwRet = DocumentProperties(hWnd,
    65.        hPrinter,
    66.        pDevice,
    67.        pDevMode,       /* Reuse our buffer for output. */
    68.        pDevMode,       /* Pass the driver our changes. */
    69.        DM_IN_BUFFER |  /* Commands to Merge our changes and */
    70.        DM_OUT_BUFFER); /* write the result. */
    71.  
    72.    /* Finished with the printer */
    73.    ClosePrinter(hPrinter);
    74.  
    75.    if (dwRet != IDOK)
    76.    {
    77.        /* If failure, cleanup and return failure. */
    78.        free(pDevMode);
    79.        return NULL;
    80.    }
    81.  
    82.    /* Return the modified DevMode structure. */
    83.    return pDevMode;
    84.  
    85.    }
    но я споткнулся на строке

    Код (Text):
    1.  if (pDevMode->dmFields & DM_DUPLEX)
    как это на ассемблер перевести... ?
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Rito
    200,200 - такие вот координаты. При них чистый лист
    Поставь _минус_ перед координатой y.

    200 у.е. превращаются не в 2см, а примерно в 2,5см?
    "Врет" расстояние от края листа или между точками внутри листа?

    hellobody
    if (pDevMode->dmFields & DM_DUPLEX) как это на ассемблер перевести... ?
    В данном случае, можно воспользоваться инструкцией test, а, в общем, необходимо использовать пару and/cmp. Так же можно указать компилятору сгенерировать asm-код.
     
  18. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    q_q
    Я уже понял, спасибо.
    Врёт от края листа. Може это плюсуется какая нить непечатаемая область?
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Rito
    Врёт от края листа.
    Может зависить от физики принтера, например, бумага подается "криво" или у принтера есть "мертвая зона" и т.п. Попробуй вывести на печать прямоугольник с границами холста DC принтера.
     
  20. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    q_q
    как вот эту вот стрелочку "->" на ассемблере изобразить?