:: Visual Foxpro, Foxpro for DOS
Вывод определенной части формы на печать, в файл и т.д.
LED
Автор

Сообщений: 204
Дата регистрации: 22.07.2006
Здравствуйте.

Подскажите как это сделать, а если есть готовое решение – то укажите где его взять.

Значит на форме расположен объект Image (image1) с картинкой. На него добавлены всякие лейболы и командные кнопки выводящие результат. Все хорошо работает, выдаются результаты.

Вот как послать определенную область (Image1 c установленными кнопками и лейбалами на печать, в буфер обмена (в формате BMP) и в файл).
На форуме искал не нашел.

Спасибо
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
PrtScr сделать, например: forum.foxclub.ru
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
LED
Автор

Сообщений: 204
Дата регистрации: 22.07.2006
of63 спасибо.
Решение Клепинина подходит.
Но как здесь вырезать фрагмент
Уменьшение Width и Height ничего не дает
Все равно записывается окно с заголовком. Только обрезается снизу и справа.
Как вырезать определенный фрагмент?





DECLARE PrintWindow IN WIN32API Long hwnd, Long hdcBlt, Long nFlags
DECLARE Long GdipGetImageGraphicsContext IN Gdiplus.dll Long nativeImage, Long @ graphics
DECLARE Long GdipGetDC IN Gdiplus.dll Long nativeImage, Long @ hdc
DECLARE Long GdipCreateBitmapFromScan0 IN Gdiplus.dll Long, Long, Long, Long, Long, Long @
DECLARE GdipDisposeImage IN Gdiplus.dll Long
DECLARE GdipDeleteGraphics IN Gdiplus.dll Long
DECLARE GdipReleaseDC IN Gdiplus.dll Long nativeGraphics, Long hdc
DECLARE Long GdipSaveImageToFile IN Gdiplus.dll Long, String, String, String
lqClsidEncoderBMP = 0h00F47C55041AD3119A730000F81EF32E
lnBitmap = 0
lnGraphics = 0
hdc = 0
lnStatus = 0
lnWidth = thisform.Width + 2 * SYSMETRIC(12)
lnHeight = thisform.Height + 2 * SYSMETRIC(13) + SYSMETRIC(9)
lnStatus = GdipCreateBitmapFromScan0(lnWidth, lnHeight, 0, 0x000E200B, 0, @lnBitmap)
IF lnStatus = 0
lnStatus = GdipGetImageGraphicsContext(lnBitMap, @lnGraphics)
ENDIF
IF lnStatus = 0
lnStatus = GdipGetDC(lnGraphics, @hdc)
PrintWindow(thisform.HWnd, hdc, 0)
ENDIF
= GdipReleaseDC(lnGraphics, hdc)
= GdipDeleteGraphics(lnGraphics)
lnStatus = GdipSaveImageToFile(lnBitMap, STRCONV("mytest.bmp" + CHR(0), 5), lqClsidEncoderBMP, NULL)
= GdipDisposeImage(lnBitMap)
IF lnStatus > 0
= MESSAGEBOX("Ошибка функции GDI+" + STR(lnStatus))
ENDIF
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
Все дело в PrintWindow. Либо использовать какой-нибудь BitBlt вместо него, либо PrintWindow(thisform.HWnd, hdc, PW_CLIENTONLY)

PW_CLIENTONLY = 1, если что.
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
LED
Автор

Сообщений: 204
Дата регистрации: 22.07.2006
pasha_usue спасибо.
Не помогло.
Возможно нужно добавить начальные и конечные координаты фрагмента или наконец его длину.
Только куда?
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Есть какое-то слово "регион" (область с координатами XY начальные и WH - длина ширина),
docs.microsoft.com - первое попавшееся
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
я сохранял так:

Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
LED
Автор

Сообщений: 204
Дата регистрации: 22.07.2006
vk65 спасибо
Я тоже такой расклад сделал.
Почти так, только с высвобождением старого растра
* Высвобождение старого растра

IF lnBitMap != 0
= GdipDisposeImage(lnBitMap)
ENDIF
lnStatus = GdipSaveImageToFile(lnNewBitMap, STRCONV("mytest.bmp" + CHR(0), 5), lqClsidEncoderBMP, NULL)
= GdipDisposeImage(lnBitMap)
IF lnNewBitMap != 0
= GdipDisposeImage(lnNewBitMap)
ENDIF

Теперь надо сделать вывод в буфер и на принтер...


vk65 Огромное спасибо.
Спасибо всем кто принимал участие.



Исправлено 1 раз(а). Последнее : LED, 15.03.19 14:11
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
LED
Автор

Сообщений: 204
Дата регистрации: 22.07.2006
Пришлось продолжить тему.

В буфер обмена получилось этот растр вставить.
А вот как послать на принтер.
Из файла не хочется печатать

Нашел вот такой фрагмент кода
Куда в этот фрагмент вставить вырезанный растр lnNewBitmap?



#DEFINE SRCCOPY 13369376
LOCAL llStatus, lnGraphics,lnWidth, lnHeight,lnWidthp, lnHeightp,tlunit,loPrint,lnWidthmm, lnHeightmm,lnPrintdpi
LOCAL nWidth,nHeight
LOCAL tnx,tny,imm,kmm,ik
nWidth=675 && --- Длина растра
nHeight=370 && --- Высота растра
&& oGPI.RotateFlip(3) && --- Поворот по горизонтали листа
oGPI.copyFormToImage(llStatus,nWidth,nHeight) && на базе класса, размещенного в решениях
loPrint = CREATEOBJECT("gdipPrinter",cPrinter)
IF VARTYPE(loPrint) != "O"
= MESSAGEBOX("Не удалось подключиться к принтеру",64)
RETURN
ENDIF
lnWidthmm = 0
lnHeightmm = 0
tlunit=.T.
llStatus=loPrint.setpageunit(tlunit,@lnWidthmm, @lnHeightmm)
lnWidthp = 0
lnHeightp = 0
tlunit=.F.
llStatus=loPrint.setpageunit(tlunit,@lnWidthp, @lnHeightp)
lnPrintdpi=lnHeightp/lnHeightmm*25.4 && Разрешение принтера DPI
*******
lnHeightp=int(lnHeightp*96/lnPrintdpi/18)*18 && пересчет на dpi= 96 и округление до целого кратного 18
********
lnWidth = 0
lnHeight = 0
oGPI.GetImageSize(@lnWidth, @lnHeight)
lnGraphics = loPrint.GetGraphics()
LOCAL ik,kmm,imm
imm=INT(lnHeight/lnHeightp) &&число страниц целых
kmm=lnHeight% lnHeightp && число строк на последней странице
tnx=0
tny=0
loPrint.OpenDocument("Графический вывод")
IF imm>0
FOR ik=1 TO imm
oGPI.ClipImagemy(tnx, tny, lnWidth, lnHeightp,lnGraphics) &&lnHeightp
loPrint.NewPage()
tny=tny+lnHeightp &&lnHeightp
ENDFOR
ENDIF
IF kmm>0
oGPI.ClipImagemy(tnx, tny, lnWidth, kmm,lnGraphics)
ENDIF
loPrint.CloseDocument()
&& oGPI.RotateFlip(1) && --- Портрет
WAIT 'Вывод на принтер сделан.' window TIMEOUT 3

Если есть другой вариант, то подскажите.
Ratings: 0 negative/0 positive
Re: Вывод определенной части формы на печать, в файл и т.д.
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
LED
Нашел вот такой фрагмент кода
Куда в этот фрагмент вставить вырезанный растр lnNewBitmap?
В этот фрагмент ты растр не вставишь, он появляется где-то в методе oGPI.ClipImagemy ;)
Попробуй это:
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 28 (Гостей: 28)

© 2000-2024 Fox Club 
Яндекс.Метрика