Страница: 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 выглядит совсем не так.
Ответить
|
Номер ответа: 2 Автор ответа: tima
Вопросов: 3 Ответов: 11
|
Профиль | | #2
|
Добавлено: 14.10.05 12:39
|
Попробую, о результатах напишу! Спасибо.
Ответить
|
Номер ответа: 3 Автор ответа: tima
Вопросов: 3 Ответов: 11
|
Профиль | | #3
|
Добавлено: 18.10.05 05:25
|
Что-то не получается. Пожешь скинуть пример?
Ответить
|
Номер ответа: 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
 eleteObject lhDC
End If
Ответить
|
Номер ответа: 7 Автор ответа: tima
Вопросов: 3 Ответов: 11
|
Профиль | | #7
|
Добавлено: 19.10.05 12:54
|
Точно, очепятка случилась, но все равно этот код отрабатывает но на PB только черная картинка.
Что опять не так?
Заранее спасибо за помощь.
Private Type GUID
 ata1 As Long
 ata2 As Integer
 ata3 As Integer
 ata4(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
 im r As Long
 im Pic As PicBmp
' IPicture requires a reference to "Standard OLE Types."
 im IPic As IPicture
 im 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)
 eleteObject (lhBMP)
 eleteDC (lhDC)
End If
End If
End Function
Prn.Print "1234567890"
Set Preview.Picture1 = CreatePrinterObraz()
Prn.EndDoc
Ответить
|
Номер ответа: 9 Автор ответа: tima
Вопросов: 3 Ответов: 11
|
Профиль | | #9
|
Добавлено: 20.10.05 05:54
|
Этот код, использовался для хранения содержимого различных cостояний PictureBox в массиве (изображение страниц печати). Я его попытался переделать под Printer. Я понимаю, что ужас, иначе бы не обращался.
А пытаюсь я сделать следующее, создать объект на основе Printer, создаем растр совместимый с ним, копируем содержимое принтера в этот растр (вот сдесь мне и не понятно как делать) и создаем изображение этого растра.
С другим изображением (при копировании PB) все более менее понятно, но с принтером у которого подготовленно несколько страниц, какое изображение мы в итоге сможем получить непонятно?
Может все гараздо проще и я просто недогоняю чего?
Ответить
|
Страница: 1 |
Поиск по форуму