#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 String ' текущая строка
  tempcurS As String ' временная строка
  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 String
    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
    SETDCPrint(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(text As String,L As Integer,T As Integer, R As Integer, B As Integer, 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
    DrawText (obj.pd.hDC,text,Len(text) ,@obj.r,flag)
  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(ColorText As Integer=0,colorBK As Integer=-1, 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(Font As FontPrint Ptr) Export
    ' загружаем или присваиваем шрифт
    Dim font_ As FontPrint Ptr=Font
    If Font=0 Then
      obj.hf=LoadFont("Arial",10*obj.SCX)
    Else
      obj.hf=LoadFont(font_->Name_,font_->size*obj.SCX,,font_->BOLD,font_->italic,font_->Underline,font_->StrikeOut)
    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(ByVal Str_ As String,ByRef X As Integer, ByRef Y As Integer)  Export
    '---------узнаем кол-во строк в области печати----------
    GetTextExtentPoint32(obj.pd.hDC,str_,len(str_),@obj.lpsize)
    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





