Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: PictureBox.FontSize и Printer.FontSize различия Добавлено: 14.10.05 06:48  

Автор вопроса:  tima
Я уже задавал этот вопрос в теме [Получение образа страницы принтера], попробую перефразировать вопрос.

При изменении размера шрифта (Courier New) на PictureBox и на принтере получается разный результат. Например размер шрифта меняю с 9.7 по 8 с шагом 0.05 на принтере и PB реально выставляются следующие значения
(Нужный размер - принтер - PB):
9.70 - 9.60 - 9
9.65 - 9.60 - 9
9.60 - 9.60 - 9
9.55 - 9.48 - 9
9.50 - 9.48 - 9
9.45 - 9.36 - 9
9.40 - 9.36 - 9
9.35 - 9.24 - 9
9.30 - 9.24 - 9
9.25 - 9.24 - 9
9.20 - 9.12 - 9
...
9.00 - 9.00 - 9
8.95 - 8.88 - 8.25
8.90 - 8.88 - 8.25
8.85 - 8.76 - 8.25

Как следствие все, что подбирается под принтер на PB выглядит совсем не так.

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 14.10.05 12:03
Чтобы выглядело так, попробуй createcompatibledc(printer.hdc), вывести графику туда, а потом bitblt на PB.

Ответить

Номер ответа: 2
Автор ответа:
 tima



Вопросов: 3
Ответов: 11
 Профиль | | #2 Добавлено: 14.10.05 12:39
Попробую, о результатах напишу! Спасибо.

Ответить

Номер ответа: 3
Автор ответа:
 tima



Вопросов: 3
Ответов: 11
 Профиль | | #3 Добавлено: 18.10.05 05:25
Что-то не получается. Пожешь скинуть пример?

Ответить

Номер ответа: 4
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #4 Добавлено: 18.10.05 12:20
Покажи, как пытаешься.

Ответить

Номер ответа: 5
Автор ответа:
 tima



Вопросов: 3
Ответов: 11
 Профиль | | #5 Добавлено: 19.10.05 07:00
Пытаюсь делать как и копирование картинки в буффер обмена (известный пример), но CreateBitmap не отрабатывает, да и какой у принтера битмап? Какой страницы и вообще есть ли он там?

Стал копать API AddMonitor в WinSpool, тоже пока глухо.

Dim lhDC As Long
Dim lhBMP As Long
Dim lhBMPOld As Long
Dim lWidthPixels As Long
Dim lHeightPixels As Long

lhDC = CreateCompatibleDC(Printer.hDC)
If (lhDC <> 0) Then
    lWidthPixels = Printer.ScaleX(Printer.ScaleWidth, Printer.ScaleMode, vbPixels)
    lHeightPixels = Printer.ScaleY(Printer.ScaleHeight, Printer.ScaleMode, vbPixels)
    lhBMP = CreateCompatibleBitmap(Printer.hDC, lWidthPixels, lHeightPixels)
' lhBMP равен 0 ????????????
    If (lhBMP <> 0) Then
        lhBMPOld = SelectObject(lhDC, lhBMP)
        BitBlt lhDC, 0, 0, lWidthPixels, lHeightPixels, Printer.hDC, 0, 0, SRCCOPY

        SelectObject lhDC, lhBMPOld

        OpenClipboard 0
        EmptyClipboard
        SetClipboardData CF_BITMAP, lhBMP
        CloseClipboard
    End If

    ;DeleteObject lhDC
End If

Ответить

Номер ответа: 6
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #6 Добавлено: 19.10.05 12:03
Не CreateCompatibleBitmap(Printer.hDC, а CreateCompatibleBitmap(lhDC.

Ответить

Номер ответа: 7
Автор ответа:
 tima



Вопросов: 3
Ответов: 11
 Профиль | | #7 Добавлено: 19.10.05 12:54
Точно, очепятка случилась, но все равно этот код отрабатывает но на PB только черная картинка. :(
Что опять не так?
Заранее спасибо за помощь.

Private Type GUID
        ;Data1 As Long
        ;Data2 As Integer
        ;Data3 As Integer
        ;Data4(7) As Byte
End Type

Private Type PicBmp
        Size As Long
        Type As Long
        hBmp As Long
        hPal As Long
        Reserved As Long
End Type

Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long


Public Function CreateBitmapPicture(ByVal hBmp As Long) As Picture

    ;Dim r As Long
    ;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 = 0 ' 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

Public Function CreatePrinterObraz() As StdPicture
Dim lhDC As Long
Dim lhBMP As Long
Dim lhBMPOld As Long
Dim lWidthPixels As Long
Dim lHeightPixels As Long
Dim r As Long

lhDC = CreateCompatibleDC(Printer.hDC)
If (lhDC <> 0) Then
    lWidthPixels = Printer.ScaleX(Printer.ScaleWidth, Printer.ScaleMode, vbPixels)
    lHeightPixels = Printer.ScaleY(Printer.ScaleHeight, Printer.ScaleMode, vbPixels)
    lhBMP = CreateCompatibleBitmap(lhDC, lWidthPixels, lHeightPixels)
    If (lhBMP <> 0) Then
        lhBMPOld = SelectObject(lhDC, lhBMP)

        r = BitBlt(lhDC, 0, 0, lWidthPixels, lHeightPixels, Printer.hDC, 0, 0, SRCCOPY)
        lhBMP = SelectObject(lhDC, lhBMPOld)
        r = DeleteDC(lhDC)
        Set CreatePrinterObraz = CreateBitmapPicture(lhBMP)
        lhBMP = SelectObject(lhDC, lhBMPOld)
        ;DeleteObject (lhBMP)
        ;DeleteDC (lhDC)
    End If
End If
End Function





   Prn.Print "1234567890"

   Set Preview.Picture1 = CreatePrinterObraz()
    
    Prn.EndDoc

Ответить

Номер ответа: 8
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #8 Добавлено: 19.10.05 13:13
Чел, ты сам-то понимаешь, что делает этот код?
Ужас.


Словами объясни, что ты пытаешься сделать.

Ответить

Номер ответа: 9
Автор ответа:
 tima



Вопросов: 3
Ответов: 11
 Профиль | | #9 Добавлено: 20.10.05 05:54
Этот код, использовался для хранения содержимого различных cостояний PictureBox в массиве (изображение страниц печати). Я его попытался переделать под Printer. Я понимаю, что ужас, иначе бы не обращался.
А пытаюсь я сделать следующее, создать объект на основе Printer, создаем растр совместимый с ним, копируем содержимое принтера в этот растр (вот сдесь мне и не понятно как делать) и создаем изображение этого растра.

С другим изображением (при копировании PB) все более менее понятно, но с принтером у которого подготовленно несколько страниц, какое изображение мы в итоге сможем получить непонятно?

Может все гараздо проще и я просто недогоняю чего?

Ответить

Номер ответа: 10
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #10 Добавлено: 20.10.05 12:27
Ну нафига?

Ты создаёшь совместимый контекст не для того, чтобы копировать на него из принтера, а для того, чтобы использовать его вместо принтера. Для предпросмотра без дёрганья принтера.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам