#include once "window9.bi"

#ifndef CLRF
	#define CLRF  !"\n\r"
#EndIf

'Общая структура для печати
Type All
	LenS As Integer 'общая длина всей строки
	lencurS As Integer ' длина текущей строки
	count As Integer ' кол-во строк в области печати
	find As Integer  ' поисковая переменная
	curS As USTRING ' текущая строка
	tempcurS As USTRING ' временная строка
	lpsize As SIZE ' структура для GetTextExtentPoint32
	FLX3 As Integer ' размер области печати по оси X без учета отступов
	FLY3 As Integer ' размер области печати по оси Y без учета отступов
	FLX4 As Integer ' размер области печати по оси X с учетом отступов
	FLY4 As Integer ' размер области печати по оси Y с учетом отступов
	frameL As Integer ' отступ слева
	frameR As Integer ' отступ справа
	frameT As Integer ' отступ сверху
	frameB As Integer ' отступ снизу
	FLX1 As Single ' размер десктопа по оси X в логических координатах
	FLY1 As Single ' размер десктопа по оси Y в логических координатах
	FLX2 As Single ' размер области печати по оси X в логических координатах
	FLY2 As Single ' размер области печати по оси Y в логических координатах
	SCX As Single  ' соотношение десктопа и области печати по оси X
	SCY As Single  ' соотношение десктопа и области печати по оси Y
	hDesktopDC As HDC ' контекст десктопа
	hdc As HDC ' временный контекст
	hdc1 As HDC ' временный контекст
	brush As HBRUSH 'кисть для рисования изображения
	hbmp As HBITMAP 'временный битмап
	size As BITMAP ' структура для получения размров битмапа
	hf As HFONT   ' шрифт текста печати
	pd As PrintDlg  ' структура диалога PRINTDLG
	psd As PAGESETUPDLG  ' структура диалога PAGESETUPDLG
	di As DOCINFO  ' структура диалога DOCINFO
	R As RECT ' структура координат области печати
	countdoc As Integer ' кол-во документов
	tempcount As Integer=1  ' счетчик для строк
End Type
Dim Shared obj As All

Namespace window9
	#if 0
		Type FontPrint
			Name_ As USTRING
			size As Integer
			BOLD As integer
			Italic As Integer
			Underline As Integer
			StrikeOut As Integer
		End Type
		Type SinglePoint
			x As Single
			y As Single
		End Type
	#endif
	function StartPrinter(ByRef Scale As SinglePoint Ptr, ByVal Flagstart As Integer) As HDC export
		' подготавливаем структуру для диалога PrintDlg
		obj.pd.lStructSize = SIZEOF(PrintDlg)
		obj.pd.Flags = PD_RETURNDC
		'выводим диалог
		IF PrintDlg(@obj.pd)=0 Then Exit function
		' получаем контекст десктопа и его размеры в логических пикселях
		obj.hDesktopDC = GetDC( 0 )
		obj.FLX1 = GetDeviceCaps( obj.hDesktopDC, LOGPIXELSX)
		obj.FLY1 = GetDeviceCaps( obj.hDesktopDC, LOGPIXELSY)
		ReleaseDC( 0, obj.hDesktopDC)
		' получаем размеры области печати в логических пикселях
		obj.FLX2 = GetDeviceCaps(obj.pd.hDC, LOGPIXELSX)
		obj.FLY2 = GetDeviceCaps(obj.pd.hDC, LOGPIXELSY)
		' получаем соотношение десктопа и области печати
		if obj.FLX1 > obj.FLX2 then
			obj.SCX = obj.FLX1 / obj.FLX2
		else
			obj.SCX = obj.FLX2 / obj.FLX1
		EndIf
		if obj.FLY1 > obj.FLY2 then
			obj.SCY = obj.FLY1 / obj.FLY2
		else
			obj.SCY = obj.FLY2 / obj.FLY1
		EndIf
		obj.FLX3 = GetDeviceCaps( obj.pd.hDC, HORZRES)
		obj.FLY3 = GetDeviceCaps( obj.pd.hDC, VERTRES)
		If Scale<>0 Then
			Scale->x=obj.SCX:Scale->y=obj.SCY
		EndIf
		obj.countdoc=obj.pd.nCopies
		win9SetDCPrint(obj.pd.hDC)
		If Flagstart=1 Then StartDoc (obj.pd.hDC, @obj.di)
		Return obj.pd.hDC
	End Function
	Sub StopPrinter() Export
		EndDoc obj.pd.hDC
		DeleteDC obj.pd.hDC
		DeleteObject(obj.hf)
	End Sub
	Sub DocumentStart() Export
		StartDoc (obj.pd.hDC, @obj.di)
	End Sub
	Sub DocumentEnd() Export
		EndDoc obj.pd.hDC
	End Sub
	function GetCountDoc()As Integer Export
	Return obj.countdoc
	End function
	Sub FramePage(ByRef Left_ As Integer,ByRef Right_ As Integer,ByRef Top As Integer,ByRef Bottom As Integer) Export
		' подготавливаем структуру PAGESETUPDLG для диалога вывода свойств страницы
		obj.psd.Flags = PSD_MARGINS
		obj.psd.lStructSize=SizeOf(PAGESETUPDLG)
		obj.psd.rtMargin.left=Left_*100:obj.psd.rtMargin.right=Right_*100
		obj.psd.rtMargin.top=Top*100:obj.psd.rtMargin.bottom=Bottom*100
		' выводим диалог
		PageSetupDlg(@obj.psd)
		' получаем отступы текста страницы
		obj.frameL=(obj.psd.rtMargin.left\100):obj.frameR=(obj.psd.rtMargin.right\100)
		obj.frameT=(obj.psd.rtMargin.top\100):obj.frameB=(obj.psd.rtMargin.bottom\100)
		Left_=obj.frameL:Right_=obj.frameR:Top=obj.frameT:Bottom=obj.frameB
	End Sub
	Sub PrintText(ByRef text As USTRING, byval L As Integer, byval T As Integer, byval R As Integer, byval B As Integer, byval flag As Integer) Export
		If L=0 Then
			obj.r.left=obj.frameL*obj.SCX
		Else
			obj.r.left=L*obj.SCX
		EndIf
		If R=0 Then
			obj.r.right=obj.FLX3-obj.frameR*obj.SCX
		Else
			obj.r.right=R*obj.SCX
		EndIf
		If T=0 Then
			obj.r.top=obj.frameT*obj.SCY
		Else
			obj.r.top=T*obj.SCY
		EndIf
		If B=0 Then
			obj.r.bottom=obj.FLY3-obj.frameB*obj.SCY
		Else
			obj.r.bottom=B*obj.SCY
		EndIf
		#ifdef UNICODE
			DrawText (obj.pd.hDC,*text,Len(text) ,@obj.r,flag)
		#else	
			DrawText (obj.pd.hDC,text,Len(text) ,@obj.r,flag)
		#EndIf		
	End Sub
	Sub PrintImage(ByVal bitmap_ As HBITMAP,ByVal x As Integer, ByVal y As Integer) Export
		obj.brush=CreatePatternBrush(bitmap_)
		obj.hdc1=GetDC(0)
		obj.hdc=CreateCompatibleDC(obj.hdc1)
		obj.hbmp=CreateCompatibleBitmap(obj.hdc1,2000,2000)
		SelectObject(obj.hDC,obj.hbmp)
		SetBrushOrgEx(obj.hdc,x,y,0)
		SelectObject(obj.hDC,obj.brush)
		getobject(bitmap_,sizeof(BITMAP),@obj.size)
		Rectangle(obj.hDC, x,y,x+obj.size.bmWidth ,y+obj.size.bmHeight)
		StretchBlt(obj.pd.hDC,x*obj.SCX,Y*obj.SCY,obj.size.bmWidth*obj.SCX,obj.size.bmHeight*obj.SCY,obj.hdc,X,Y,obj.size.bmWidth,obj.size.bmHeight,SRCCOPY)
		DeleteObject(obj.brush): deleteDC(obj.hdc):deleteDC(obj.hdc1):DeleteObject(obj.hbmp)
	End Sub
	Sub ColorPrinter(byval ColorText As Integer=0, byval colorBK As Integer=-1, byval Flag As Integer=1) Export
		' загружаем цвета в контекст
		Select Case flag
			Case 1
				SetTextColor(obj.pd.hDC,colorText)
			Case 2
				SetBkColor(obj.pd.hDC,colorBK)
			Case 3
				SetBkColor(obj.pd.hDC,colorBK)
				SetTextColor(obj.pd.hDC,colorText)
		End Select
	End Sub
	Sub FontPrinter(byval Font As FontPrint Ptr) Export
		' загружаем или присваиваем шрифт
		Dim font_ As FontPrint Ptr=Font
		If Font=0 Then
			obj.hf=cast(HFONT,LoadFont("Arial",10*obj.SCX))
		Else
			#ifdef UNICODE
				obj.hf=cast(HFONT,LoadFont(*(font_->Name_),font_->size*obj.SCX,,font_->BOLD,font_->italic,font_->Underline,font_->StrikeOut))
			#else	
				obj.hf=cast(HFONT,LoadFont(font_->Name_,font_->size*obj.SCX,,font_->BOLD,font_->italic,font_->Underline,font_->StrikeOut))
			#EndIf			
		EndIf
		' загружаем шрифт в контекст
		SelectObject(obj.pd.hDC,Cast(HGDIOBJ,obj.hf))
	End Sub
	Sub GetFullSize(ByRef X As Integer, ByRef Y As Integer) Export
		' узнаем размеры области печати
		X=obj.FLX3:Y=obj.FLY3
	End Sub
	function GetCountLine() As Integer  Export
		'---------узнаем кол-во строк в области печати----------
		GetTextExtentPoint32(obj.pd.hDC,"TEST",4,@obj.lpsize)
		obj.count=(obj.FLY3-obj.frameT*obj.SCY-obj.frameB*obj.SCY)\obj.lpsize.cy
		Return obj.count
	End Function
	
	Sub GetRealSize(ByRef X As Integer, ByRef Y As Integer)  Export
		obj.FLX4=obj.FLX3-obj.frameL*obj.SCX-obj.frameR*obj.SCX
		obj.FLY4=obj.FLY3-obj.frameT*obj.SCY-obj.frameB*obj.SCY
		X=obj.FLX4:Y=obj.FLY4
	End Sub
	sub GetLenString(ByRef sText As USTRING, ByRef X As Integer, ByRef Y As Integer)  Export
		'---------узнаем кол-во строк в области печати----------
		#ifdef UNICODE
			GetTextExtentPoint32(obj.pd.hDC,*sText,len(sText),@obj.lpsize)
		#else	
			GetTextExtentPoint32(obj.pd.hDC,sText,len(sText),@obj.lpsize)
		#EndIf		
		X=obj.lpsize.cx : Y=obj.lpsize.cy
	End Sub
	Sub PageStart()  Export
		StartPage (obj.pd.hDC)
	End Sub
	Sub PageEnd()  Export
		EndPage (obj.pd.hDC)
	End Sub
End Namespace





