Печать формы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
vitOS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 148
Зарегистрирован: 25.08.2002 (Вс) 12:06
Откуда: Ukraine

Печать формы

Сообщение vitOS » 19.08.2003 (Вт) 9:03

Задача: печать пропусков. Пропуск представляет собой форму с лейблами и имиджами. Делаю printscreen этой формы и отправляю на печать. Получается лажа: шрифты угловатые, фотографии угловатые (сглаживание шрифтов в системе включено). При этом аналогичная программа американской фирмы печатает всё красиво, даже обидно. Пытался использовать не контролы, а непосредственно рисовать на форме -- результат нулевой. Использование метода Print() формы тоже. PrintScreen делаю с помощью следующего кода (где-то слямзил):

Код: Выделить всё
Public Function CaptureWindow(ByVal hWndSrc&, ByVal LeftSrc&, _
                                ByVal TopSrc&, ByVal WidthSrc&, _
                                ByVal HeightSrc&) As Picture

Dim hDCMemory&
Dim hBmp&
Dim hBmpPrev&
Dim r&
Dim hDCSrc&
Dim hPal&
Dim hPalPrev&
Dim RasterCapsScrn&
Dim HasPaletteScrn&
Dim PaletteSizeScrn&
         
Dim LogPal As LOGPALETTE

    ' Depending on the value of Client get the proper device context.
    hDCSrc = GetDCEx(hWndSrc, 0&, DCX_CACHE Or DCX_CLIPCHILDREN)   ' Get device context for client area.

    ' Create a memory device context for the copy process.
    hDCMemory = CreateCompatibleDC(hDCSrc)
    ' Create a bitmap and place it in the memory DC.
    hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
    hBmpPrev = SelectObject(hDCMemory, hBmp)

    ' Get screen properties.
    RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS) ' Raster capabilities.
    HasPaletteScrn = RasterCapsScrn And RC_PALETTE     ' Palette support.
    PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE) ' Size of palette.

    ' If the screen has a palette make a copy and realize it.
    If HasPaletteScrn And (PaletteSizeScrn = 256) Then
        ' Create a copy of the system palette.
        LogPal.palVersion = &H300
        LogPal.palNumEntries = 256
        r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0))
        hPal = CreatePalette(LogPal)
        ' Select the new palette into the memory DC and realize it.
        hPalPrev = SelectPalette(hDCMemory, hPal, 0)
        r = RealizePalette(hDCMemory)
   
    End If

    ' Copy the on-screen image into the memory DC.
    r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)

    ' Remove the new copy of the  on-screen image.
    hBmp = SelectObject(hDCMemory, hBmpPrev)

    ' If the screen has a palette get back the palette that was
    ' selected in previously.
    If HasPaletteScrn And (PaletteSizeScrn = 256) Then
        hPal = SelectPalette(hDCMemory, hPalPrev, 0)
   
    End If

    ' Release the device context resources back to the system.
    r = DeleteDC(hDCMemory)
    r = ReleaseDC(hWndSrc, hDCSrc)

    ' Call CreateBitmapPicture to create a picture object from the
    ' bitmap and palette handles. Then return the resulting picture
    ' object.
    Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)
   
End Function


Public Function CreateBitmapPicture(ByVal hBmp&, ByVal hPal&) As Picture

Dim r&
           
Dim Pic As PicBmp
' IPicture requires a reference to "Standard OLE Types."
Dim IPic As IPicture
Dim IID_IDispatch As GUID

    ' Fill in with IDispatch Interface ID.
    With IID_IDispatch
           
        .Data1 = &H20400
        .Data4(0) = &HC0
        .Data4(7) = &H46
       
    End With

    ' Fill Pic with necessary parts.
    With Pic
           
        .Size = Len(Pic)          ' Length of structure.
        .Type = vbPicTypeBitmap   ' Type of Picture (bitmap).
        .hBmp = hBmp              ' Handle to bitmap.
        .hPal = hPal              ' Handle to palette (may be null).
   
    End With

    ' Create Picture object.
    r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

    ' Return the new Picture object.
    Set CreateBitmapPicture = IPic
   
End Function


В чём проблема и как её решить?

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 29.08.2003 (Пт) 23:05

Думаю дело в Принтере и в том, что вечать пиксельная .... т.е. попикселам а не по твипам ....

Хотя у меня при песати картинок с формы ... получалось всё красиво
Правда я пошел дальше ... я печатал кодируя картинки и текст непосредственно в принтер .. и без формы.....

Пробуй так ...
Успехов
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.08.2003 (Сб) 5:30

Может, попробовать BitBlt printer.hdc,0,0,form.width, form.height,form.hdc,0,0,vbsrccopy?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vitOS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 148
Зарегистрирован: 25.08.2002 (Вс) 12:06
Откуда: Ukraine

Сообщение vitOS » 01.09.2003 (Пн) 13:21

У меня создание контекста выглядит так же:
Код: Выделить всё
' Copy the on-screen image into the memory DC.
r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

    TopList  
cron