Página 1 de 1

Imprimir Relatórios

Enviado: 10 Abr 2015 18:56
por Josmar dos Santos
Boa noite amigos. No Clipper52 eu estava imprimindo os meus relatórios utilizando uma LIB do Professor Maligno chamada de "WAPI". Nos relatórios ele imprimia na tela e ao acionar a tecla F6 dava-se a opção de uma lista de impressoras conectada na rede para escolher e imprimir o mesmo. No entanto, eu migrei o meu sistema para Harbour e o compilador do mesmo não aceita essa LIB. Eu gostaria de saber se é possível introduzir essa LIB ao Harbour? E se for, como fazer? Caso contrário, há uma outra opção? Se tiver gostaria de pedir gentilmente que os colegar postassem algum exemplo.


Obrigado

Josmar

Imprimir Relatórios

Enviado: 11 Abr 2015 09:15
por leandrolinauer
Bom dia Josmar.
Eu usei comandos para capturar as impressoras instaladas no pc.

Código: Selecionar todos

Function MyPrinters()
Local aRet:=.T.
Local hDC
Set Key -5 To
hDc := WIN_PRINTDLGDC( @cPrinter, , , ) //mostra a tela de dialog do windows para escolher as impressoras instaladas
If Empty(hDC)
   aRet:=.F. //para finalizar
Else
   cPrDoor:=WIN_PRINTERPORTTONAME(cPrinter) // pega a porta da impressora
   cPrModel:=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL".Or.Left(cPrDoor,2)$"\\","MATRICIAL","LASER") 
  //cprmodel apenas me informa se a impressora é MATRICIAL ou LASER, eu instalo a impressora MATRICIAL e escrevo no nome dela (MATRICIAL) para que o sistema pelo nome descobre que esta impressora é texto e não gráfico para lá na frente imprimir pelo printfileraw e não win32prn
EndIf
Set Key -5 To MyPrinters()
Return aRet
Esta função apenas seleciona a impressora, a parte de imprimir vem depois, se precisar dela tbem te passo.
Um abraço.
:xau

Imprimir Relatórios

Enviado: 11 Abr 2015 11:04
por Josmar dos Santos
Leandro, obrigado pela sua atenção! Sim, eu agradeceria se vc me passasse, estou acumulado todos os materiais possíveis para eu fazer um estudo detalhado para eu poder melhorar o meu sistema...


Agradeço desde já..



Josmar

Imprimir Relatórios

Enviado: 11 Abr 2015 11:55
por leandrolinauer
Bom dia.
Te ajudo sim, segue abaixo mais detalhes da forma de impressão genérica, atende todos os relatórios que antes eu imprimia somente em LX-300 na porta fixa LPT1, passando agora com esta função imprimir tando na LX-300 como demais impressoras registradas no windows.
Começo a utilização da função desta forma abaixo:

Código: Selecionar todos

If NewAnsWer("Confirma impressão?").And.c_Imprime(File1Tmp)
   imprime()
   e_Imprime()
EndIf
ONDE:
C_IMPRIME() // FUNÇÃO QUE CHAMA A IMPRESSORA DESEJADA
IMPRIME() //FUNÇÃO DOS PROWS DA VIDA, MONTAGEM DA IMPRESSÃO ONDE SÓ ALTEREI SET PRINTER PARA ARQUIVO
//Set Device To Print
//Set Printer To &cP_Printer.// AQUI ERA ANTES LPT1
E_IMPRIME() //FUNCAO QUE CHAMA A FORMA DE IMPRESSÃO.

Código: Selecionar todos

Function c_Imprime(pPrinter,aPo,aLn)
Local aRet:=.T.
Local lIp

Public nPrinter:=If(pPrinter=Nil,"IMPRESSO",pPrinter)
aPo:=If(aPo=Nil,"V",aPo)
aLn:=If(aLn=Nil,If(aPo=="V",137,182),aLn) //tem que ser 137
cP_Printer:=wD_Retorno+nPrinter+".PRN" //manda tudo para o arquivo de impressãoo
aRet:=MyPrinters()

lIp:=If(("DATAMAX" $ Upper(cPrinter)),"DATAMAX","OUTRA") //é que uso tbem a datamax para etiqueta

If lIp=="DATAMAX"
	ShowMessage(,,"DATAMAX - Foi selecionado uma impressora etiquetadora, impressão cancelada.",0)
	aRet:=.F.
EndIf
If(aRet=.T.,ShowWait(,,"Imprimindo em "+cPrinter+"..."),.T.)
Return aRet

Function MyPrinters()
Local aRet:=.T.
Local hDC
Set Key -5 To

ShowWait(,,"Localizando impressoras")
hDc := WIN_PRINTDLGDC( @cPrinter, , , ) //mostra a tela de dialog do windows para escolher as impressoras instaladas
CloseWindow()

If Empty(hDC)
	aRet:=.F. //para finalizar
Else
   cPrDoor:=WIN_PRINTERPORTTONAME(cPrinter) // pega a porta da impressora
   cPrModel:=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL".Or.Left(cPrDoor,2)$"\\","MATRICIAL","LASER") //nao da certo escrito
   c_CfImpressora()  //CONFIGURA OS CHR

EndIf
Set Key -5 To MyPrinters()
Return aRet

Function e_Imprime(aLn,aPo,aTl,aNF,aIA,aIL)
Local o_mail
aPo:=If(aPo=Nil,"V",aPo)
aLn:=If(aLn=Nil,If(aPo=="V",137,182),aLn) //tem que ser 137
aTl:=If(aTl=Nil,Nil,aTl) //altura da linha
aIA:=If(aIA=Nil,1 ,aIA)
aIL:=If(aIL=Nil,18,aIL) //22 para o padrao maior mais cumprimido na linha são mais caracteres na linha, menor menos caracteres na linha
aNF:=If(aNF=Nil,.F.,aNF)
If Right(cP_Printer,3)=="PRN" //‚ arquivo
   If cPrDoor$"File" //se for arquivo
      FRename(wD_Retorno+nPrinter+".PRN",wD_Retorno+cP_Printer+".TXT") //renomear //ver
   Else
      ImpWIN32PRN(wD_Retorno+nPrinter+".PRN",aLn,aPo,aTl,aNF,aIA,aIL)
      FErase(wD_Retorno+nPrinter+".PRN") //apaga prn
   EndIf

   cPrinter  :=WIN_PRINTERGETDEFAULT() //HB_GetDefaultPrinter()
   cPrModel:=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL","MATRICIAL","LASER")
   cPrDoor   :=If(cPrModel=="MATRICIAL","LPT1","USB") //erro provavel
   cP_Printer:=cPrDoor
   nPrinter  :=""
EndIf
CloseWindow()
Return .T.

Function ImpWIN32PRN(cArq,tamrel,aPo,aTl,aNf,aIA,aIL) // arquivo e tamanho da linha
Local cTexto, nLinhas, nA, cLinha, oPrinter
oPrinter:=Win_prn():New(cPrinter) //tem que colocar porque senao nao cria o metodo  uso a WIN_PRN (HARBOUR)
If oPrinter:create()
   oPrinter:Landscape:=If(aPo=="H",.T.,.F.)  //VERTICAL=.F.  // HORIZONTAL=.T.
   oPrinter:FormType :=1 
   oPrinter:Copies   :=1
   oPrinter:CharSet(255)
   oPrinter:SetPrintQuality(1) //qualidade da impressãoo 1 rascunho 2 normal 3 media 4melhor

   oPrinter:StartDoc()
   oPrinter:SetFont("LUCIDA CONSOLE",12,{aIA,aIL},700,.F.,.F.) //ficou menos agredido na folha

   nOrgAlt :=oPrinter:LineHeight()
   If aTl#Nil //altura da linha
      oPrinter:LineHeight :=Int(nOrgAlt-((nOrgAlt*aTl)/100))
   EndIf
   oPrinter:PosY:=0  //linha          |
   oPrinter:PosX:=0  //coluna        x --->

   If cPrModel=="MATRICIAL"  //para que use em modo texto

      Prn_HANDLE:=FOpen(cArq,1) //abre o arquivo
      FSeek (Prn_HANDLE,0,1)    //POSICIONE NO INICIO DO ARQUIVO
      FWrite(Prn_HANDLE,cComI,1) //comprimir o arquivo de impressao todos condensed
      FSeek (Prn_HANDLE,0,2) //POSICIONE NO FIM DO ARQUIVO
      FWrite(Prn_HANDLE,cNorI) //volta ao normal a impressora
      FClose(Prn_HANDLE)

      Win_PrintFileRaw(cPrinter,cArq,"")
   Else
      oPrinter:TextOut(Space(TamRel),.T.)
      cTexto  :=MemoRead(cArq)
      nLinhas :=mLCount(cTexto,TamRel,1,.F.)
      For nA:= 1 To nLinhas
          cLinha:=MemoLine(cTexto,TamRel,nA,1,.F.)
          aPosCa:=At("",cLinha)              //posicao do eject
          xLinha:=Left (cLinha,aPosCa)
          yLinha:=Right(cLinha,aPosCa)
          If aPosCa>0 //tem eject
             cLinha:=xLinha+yLinha
          EndIf
          If aPosCa>0.And.nA<nLinhas //SALTO_PAGINA
             oPrinter:NewPage()      //eject
          ElseIf (Left(AllTrim(cLinha),80)==Repl("Ä",80).Or.;
                  Left(AllTrim(cLinha),80)==Repl("-",80).Or.;
                  Left(AllTrim(cLinha),80)==Repl("_",80)).And.;
                  !Left(AllTrim(cLinha),100)==Repl("-",100)
             oPrinter:TextOut(Repl(hb_oemTOansI("-"),TamRel),.T.)
          Else //If !Empty(AllTrim(cLinha))
             oPrinter:TextOut(HB_oemTOansi(Left(cLinha,TamRel)),.T.)
          EndIf
      Next
   EndIf
   oPrinter:EndDoc()
   oPrinter:Destroy()
Else
   ShowMessage(,,"Erro na criação do arquivo de impressão.",0)
EndIf
Return NIL
Este é o modo completo de impressão genérico que utilizo, o problema deste modo é que sai tudo igual a impressão, não tem como fazer desta forma um cabeçalho mais detalhado, etc, para isto utilizo um outro metodo para impressão em pixell, aí sim a coisa muda de figura.

A resposta anterior, foi faltado este final porque teclei errado e computador publicou.

Espero ter lhe ajudado.
Bom final de semana.
:xau

Imprimir Relatórios

Enviado: 11 Abr 2015 13:34
por Josmar dos Santos
Leandro, mais uma vez obrigado por compartilhar os seus conhecimentos. Já copiei as fontes e já vou começar os testes hoje mesmo. Assim que eu tiver os resultados te informarei no fórum. Que Deus te abençoe.


Josmar

Imprimir Relatórios

Enviado: 27 Abr 2015 07:42
por Josmar dos Santos
Bom dia Leandro, essas funções: ShowMessage, ShowWait e CloseWindow pertencem à biblioteca "hbwin" ? Se for, essa biblioteca já está configurada no meus arquivos *.hbp. Te pergunto isso porque estou adaptando essas funções q vc me passou ao meu sistema e ao compilar deu erro no harbour, ou seja: está pedindo essas funções.


Josmar

Imprimir Relatórios

Enviado: 29 Mai 2015 10:53
por leandrolinauer
Bom dia Josmar.
Desculpe a demora, eu não havia acessado o fórum por estes dias, muitas tarefas.
Bom, estas funções ShowMessage, ShowWait e CloseWindow são funções de tratamento de tela (desenhos), criadas por mim.

Showmessage(), mostra tela de mensagem de erro.
ShowWait(), abre a tela de mensagem mas não finaliza
CloseWindow(), finaliza uma showwait(), Openwindow() e a showmessage().

Não fazem parte essencial do funcionamento da função de impressão, ou seja, cada um tem um modo de chamar tela de desenho ou mensagens exemplo ALERT(), ou seja, não atrapalham em nada.

Mas se você quiser elas, te passo tbem.

Um abraço.
T+
:xau

Imprimir Relatórios

Enviado: 29 Mai 2015 16:48
por Josmar dos Santos
Boa tarde Leandro. Obrigado por responder. Se vc poder me passar eu agradeceria. É sempre bom ter algo a mais para aprendizado. Só uma pergunta: O meu sistema está em modo console. Essas funções de captação da caixa de diálogo do Windows de impressão funcionam em modo console? Talvez seja até uma pergunta boba, mas para mim não é!!!


Um abraço


Josmar

Imprimir Relatórios

Enviado: 29 Mai 2015 17:53
por leandrolinauer
Boa tarde
Não você terá que migrar para GUI, não testei se a função WIN_PRINTDLGDC funciona em console, mas creio que não porque ela é gui.
Então vc terá que migrar para gui, o que eu to usando como gui é a GT_WVW, mas não gostei dela limita muito o designer e estou tentando migrar para HW_Gui, só não consegui ainda porque as duas não funcionam juntas, pelo menos não consegui ainda.

Então já que você ainda não esta em GUI, sugiro que migre para HW_GUI e daí as minhas funções não lhe serviriam, mas contudo colocar o fonte abaixo.
::Janelas

Código: Selecionar todos

Procedure OpenWindow(nTop,nLft,nBot,nRig,sTxt,iTxt,cBtt,cDsk,lSom,dB,nSty,nStr)
Local LCursor:=SetCursor(),aRow:=Row(),aCol:=Col(),LColor:=SetColor()
SetCursor(0)
cBtt:=If(cBtt=Nil,"GR+/B",cBtt)  // -> cor do titulo
cDsk:=If(cDsk=Nil,"W/W",cDsk)    // -> cor da tela
nSty:=If(nSty=Nil,0,nSty) 
COR_WINDOWS_XP
nBot:=If(nBot=Nil,w_MxR,nBot) //maxima 25
nRig:=If(nRig=Nil,MaxCol()-1,nRig)   
nBot:=If(nBot > w_MxR,w_MxR,nBot)

nCurWindow:=WVW_NOpenWindow(If(sTxt=Nil,"",sTxt),nTop+1,nLft,nBot,nRig) //cria a janelas

WVW_SetIcon(,wD_Images+"icon.ico")
ResetObjects( nCurWindow ) 

COR_DE_FUNDO

If nSty>0
   NewDrawField(nTop+1,nLft  ,nRig,,10,nTop+4) //faz o quadrado de cima da janela
   NewShowLabel(nTop+1,nLft,Right(sTxt,Len(sTxt)-4),"ESQUERDA","NAVYBLUE",64,14,nTop+3,nRig-7,RGB(230,230,250),"ARIAL",,Str(nCurWindow,5)+"FUNDO_JANELA_TOP") //escreve o texto da janela

   NewDrawField(nTop+1,nRig-6,nRig,,10,nTop+4) //faz o quadrado de cima da figura lado direito
   AddObjects(nCurWindow,{|nWindow| wvw_DrawImage( nWindow,nTop+1,nRig-6,nTop+3,nRig,nSty)}) //figura do lado direito em cima
   If nStr#Nil //cor do fundo //se habilitado o desenho debaixo
      NewShowLabel(nBot-2,nLft,"","ESQUERDA","VERMELHO",10,,nBot+1,nRig,nStr) //cor do fundo
      NewDrawField(nBot-2,nLft  ,nRig,,12,nBot+1) //linha do fundo
   EndIf
EndIf
wvw_paint(nCurWindow)
COR_NORMAL
Return Nil
::fecha janelas

Código: Selecionar todos

Procedure CloseWindow()
Local lCursor:=SetCursor(0)
Local Ls,Cs,Li,Ci
WVW_lCloseWindow() 
nCurWindow--       
wvw_paint(nCurWindow)
SetCursor(lCursor)
Return .T.
:: MENSAGENS

Código: Selecionar todos

Procedure ShowMessage(nTop,nLft,cMsg,cTime,cTxt) //mensagens FIXA 
Return DrawShow(cMsg,cTxt,nTop,{"&Ok"},1,1,2)
//*
Procedure ShowWait(nTop,nLft,cMsg,cTxt) //mensagem de processamento
Return DrawShow(cMsg,cTxt,nTop,,,,3)
//*
Procedure ShowWaitProc(aMessage,oTempo)
Local xTempo:=Seconds()-aSeconds
WVW_ProcessMessages()
If oTempo # Nil .And. oTempo > 0
	ShowWait(,,aMessage)
	Inkey(oTempo)
	CloseWindow()
EndIf
If xTempo>2.Or.mpg=0//segundos
	aSeconds:=Seconds()
   mpg:=If(mpg>60,0,mpg+1)
   wvw_Paint(nCurWindow)
EndIf
Return .T.
//*
Function NewAnsWer(cMsg,cTxt,nTop,nBut,nNil,nEsc,nFoc,nSho) //perguntas 
Return DrawShow(cMsg,cTxt,nTop,nBut,nEsc,nFoc,nSho)
// SHOWMESSAGE, SHOWWAIT, NEWANSWER chamam a debaixo para execução.

Function DrawShow(cMsg,cTxt,nTop,nBut,nEsc,nFoc,nSho) // FAZ TODA TELA DE EXECUCAO : ANSWER, SHOWWAIT, ETC   chamando a DRAWEXEC
Local nLft,nRig,nBot // controla a posicao da janela, ficando controlado os valores para cada uma delas
Local aMsg:={} //controla a mensagem, colocando assim local fica as escritas corretas para cada janela
mpg :=0 //controla o carrinho passando, assim fica uma posicao para cada janela

//////////// DEFINICAO DAS VARIAVEIS ACIMA
//////////// Acerto dos dados abaixo

nSho:=If(nSho=Nil,1,nSho) 
cMsg:=If(cMsg=Nil.And.nSho=3,{"Aguarde processamento..."},If(cMsg=Nil,"Escolha a opção desejada, ou <ESC> para cancelar.",cMsg))
nFoc:=If(nFoc=Nil,2,nFoc)
cTxt:=If(cTxt=Nil,"Atenção!",cTxt) 
nTop:=If(nTop=Nil,10,If(nTop>15,1,nTop))
nBot:=nTop+8

//////////// Transforma cMsg em MATRIZ
If ValType(cMsg)=="A"
	aMsg:=cMsg
Else
	AAdd(aMsg,cMsg)
EndIf
/// chamo a drawexec e oresto é faz tudo
Return DrawExec(aMsg,cTxt,nTop,nLft,nRig,nBot,nBut,nEsc,nFoc,nSho) 
//*
Function DrawExec(aMsg,cTxt,nTop,nLft,nRig,nBot,nBut,nEsc,nFoc,nSho)
Local Keyin:=0,aRet:=If(nBut=Nil,"L","N") //controla se é logico ou nao
Local oMText:=0
nBut:=If(nBut=Nil,{"&Sim","&Não"},nBut)
nLft:=If(nSho=3,10,If(Len(nBut)=4,15,If(Len(nBut)=3,20,25)))
nRig:=If(nSho=3,70,If(Len(nBut)=4,65,If(Len(nBut)=3,60,55)))
//////////// Verifica qual linha é a maior para saber o tamanho da janela abaixo
For ixx:=1 To Len(aMsg)
    oMText:=If(Len(aMsg[ixx]) > oMText,Len(aMsg[ixx]),oMText)
Next
//////////// Arruma o tamanho da janela de acordo com o texto
While oMText > (nRig-nLft-4) //-08 -5
    nLft--    //mais para esquerda
    nRig++    //mais para direita
    If nLft <= 1 //.Or. nRig > 100
Exit
    EndIf
End
//////////// Emite som apenas para pergunta e exclamação
//////////// nsho 1 = PERGUNTA
//////////// nsho 2 = EXCLAMACAO
//////////// nsho 3 = AGUARDE BONECO
//////////// nsho 4 = AGUARDE CARRINHO
//////////// nsho 5 = PROCESSAMENTO AZUL

If nSho=1         //pergunta
   C_PLAYSOUND(wD_Audios+"pergunta.wav")
ElseIf nSho=2 //exclamacao
   C_PLAYSOUND(wD_Audios+"notifica.wav")
EndIf
//////////// AQUI COMEÇA O DESENHO
//SetCursor(0)

//////////// 1º= LABEL TEXTO EM NEGRITO ; 2º= LINHA SEPARADORA ; 3º= BOX COM FUNDO BRANCO PARA TEXTO ; 4º= LINHA SEPARADORA

If wE_ModelSys$"NB".And.nSho=2 //resposta vermelho
   //novo
   xDfB:=nBot-nTop
   nTop:=If(nTop-2 > 1,nTop-2,nTop)
   nBot:=nTop+xDfB
   OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
   AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(139,0,0))})   //39,64,139 54,54,54
   AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot  ,nRig  ,RGB(139,0,0))})   //39,64,139 54,54,54
   NewShowLabel(nTop-1,nLft," "+cTxt,"ESQUERDA","AMARELO",64,14,nTop-1,nRig-8,RGB(139,0,0),"ARIAL")
ElseIf wE_ModelSys$"NB".And.nSho=1 //pergunta azul
   xDfB:=nBot-nTop
   nTop:=If(nTop-2 > 1,nTop-2,nTop)
   nBot:=nTop+xDfB
   OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
   AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(0,0,139))})   //39,64,139 54,54,54
   AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot  ,nRig  ,RGB(0,0,139))})   //39,64,139 54,54,54
   NewShowLabel(nTop-1,nLft+1," "+cTxt,"ESQUERDA","AMARELO",64,14,nTop-1,nRig-8,RGB(0,0,139),"ARIAL")
ElseIf wE_ModelSys$"NB".And.nSho=3   //showwait
   xDfB:=nBot-nTop
   nTop:=If(nTop-2 > 1,nTop-2,nTop)
   nBot:=nTop+xDfB
   OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
   AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(255,215,0))})   //39,64,139 54,54,54
   AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot  ,nRig  ,RGB(255,215,0))})   //39,64,139 54,54,54
   NewShowLabel(nTop-1,nLft+1," "+cTxt,"ESQUERDA","PRETO",64,14,nTop-1,nRig-8,RGB(255,215,0),"ARIAL")
Else //antigo
   OpenWindow(nTop-2,nLft,nBot,nRig) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
   AddObjects(nCurWindow,{|nWindow|     wvw_DrawLabel(nWindow,nTop+1,nLft+1,cTxt+":",TA_LEFT,,RGB( 0,0,0),,"ARIAL",20-o_wvwFR,12-o_wvwLR,700,,.T.,)})
EndIf
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot-3,nRig,RGB(255,255,255))})  //
AddObjects(nCurWindow,{|nWindow|      wvw_DrawLine(nWindow,nTop+1,nLft,nTop+1,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID
AddObjects(nCurWindow,{|nWindow|      wvw_DrawLine(nWindow,nBot-3,nLft,nBot-3,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID linha final

/////////// Desenha a imagem da tela //pergunta exclamacao a esquerda
AddObjects( nCurWindow, {|nWindow| wvw_DrawImage( nWindow,nTop+2,nLft,nTop+5,nLft+7,nSho)})
If nSho=3
	/////////// Desenha a imagem da tela a direita se for aguarde processamento
   AddObjects(nCurWindow,{|nWindow| wvw_DrawImage( nWindow,nTop+2,nRig-8,nTop+5,nRig,6)})

   AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nBot-1,nLft,nBot  ,nRig,RGB(255,255,255))})  //
   AddObjects(nCurWindow,{|nWindow|      wvw_DrawLine(nWindow,nBot-2,nLft,nBot-2,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID
   AddObjects(nCurWindow,{|nWindow|      wvw_DrawLine(nWindow,nBot  ,nLft,nBot  ,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID linha final
   
   /////////// Desenha o carrinho em baixo a esquerda
   AddObjects( nCurWindow, {|nWindow| wvw_DrawImage( nWindow,nBot-1,nLft+mpg,nBot,nLft+3+mpg,4)})

EndIf
/////////// Abaixo as linhas com os textos se existirem
If Len(aMsg)>=3
   If(Len(aMsg)>=1,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+2,If(nSho<=2,nLft+10,40),aMsg[1],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas       0,0,139
   If(Len(aMsg)>=2,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+3,If(nSho<=2,nLft+09,40),aMsg[2],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.)
   If(Len(aMsg)>=3,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+4,If(nSho<=2,nLft+09,40),aMsg[3],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas       0,0,139
   If(Len(aMsg)>=4,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+5,If(nSho<=2,nLft+09,40),aMsg[4],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas       0,0,139 
ElseIf Len(aMsg)>=1
   If(Len(aMsg)>=1,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+3,If(nSho<=2,nLft+10,40),aMsg[1],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas       0,0,139
   If(Len(aMsg)>=2,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+4,If(nSho<=2,nLft+09,40),aMsg[2],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.)
EndIf
MyKeyBoard("")
////////// CHAMA O REDEZENHO NO ATO DO FINAL DA EDICAO DA MENSAGEM passi so para nsho3
wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse
/////////// Se for pergunta ou mensagem, mostra o botão e fecha a janela
If nSho<=2
   Keyin:=MyNewButton(nBot-1,nFoc,nBut,nRig,.F.)
   CloseWindow()
Else

EndIf
Return If(aRet=="L",Keyin=1,Keyin)
:: botões para a newanswer, showmessage e/ou direto

Código: Selecionar todos

Function BtClick(OnClick)
oBKey:=nBPos:=OnClick
HB_KeyPut(13) 
Return .T.
//*
Static Procedure PCNewButton(nBot,nFoc,nBut,nCol)
nBSty:=1 
nBStB:=Nil //0.5 //1.0 = todo botao, 0.5 50% 	0 = nao vai ser estidado
nBM3D:=Nil //.T. //.T. transparante .f. nao transparente
nBImg:=Nil //wD_Images+"OK3D.BMP"
nColA:=nCol-11 //11 77 ou 69 -1 inicial na direita da tela
wvw_pbsetfont(, ,19-o_wvwFR,8-o_wvwLR,FW_BOLD)

If Len(nBut)>=5 //tem quarto botao                                                  //img   //bloco        //aof //1.0 0.5 0
   If(nBPos>0,wvw_PBDestroy(NIL,nBt5),.T.) //se existir eu apago          //IT
	nBt5:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=5,"(","")+ MyWinLetra(nBut[5])+If(nFoc=5,")",""),nBImg, {|| BTClick(5) }, Nil,nBStB,nBM3D)
   wvw_pbSetStyle(NIL, nBt5,If(nFoc=5,nBSty,))                                                                          //TRANSPARENTE
   nColA:=nColA-12
EndIf
If Len(nBut)>=4 //tem quarto botao                                                  //img   //bloco        //aof //1.0 0.5 0
   If(nBPos>0,wvw_PBDestroy(NIL,nBt4),.T.) //se existir eu apago          //IT
	nBt4:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=4,"(","")+ MyWinLetra(nBut[4])+If(nFoc=4,")",""),nBImg, {|| BTClick(4) }, Nil,nBStB,nBM3D)
   wvw_pbSetStyle(NIL, nBt4,If(nFoc=4,nBSty,))                                                                          //TRANSPARENTE
   nColA:=nColA-12
EndIf
If Len(nBut)>=3 //tem terceiro botao
   If(nBPos>0,wvw_PBDestroy(NIL,nBt3),.T.)
	nBt3:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=3,"(","")+ MyWinLetra(nBut[3])+If(nFoc=3,")",""),nBImg, {|| BTClick(3) }, NIL,nBStB,nBM3D)
   wvw_pbSetStyle(NIL, nBt3,If(nFoc=3,nBSty,))
   nColA:=nColA-12
EndIf
If Len(nBut)>=2 //tem segundo botao
   If(nBPos>0,wvw_PBDestroy(NIL,nBt2),.T.)
	nBt2:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=2,"(","")+ MyWinLetra(nBut[2])+If(nFoc=2,")",""),nBImg, {|| BTClick(2) }, NIL,nBStB,nBM3D)
   wvw_pbSetStyle(NIL, nBt2,If(nFoc=2,nBSty,))
   nColA:=nColA-12
EndIf
If Len(nBut)>=1 //tem primeiro botao
   If(nBPos>0,wvw_PBDestroy(NIL,nBt1),.T.)
   nBt1:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=1,"(","")+ MyWinLetra(nBut[1])+If(nFoc=1,")",""),nBImg, {|| BTClick(1) }, NIL,nBStB,nBM3D) //__Keyboard(K_ENTER)
   wvw_pbSetStyle(NIL, nBt1,If(nFoc=1,nBSty,))
EndIf
wvw_pbSetFocus(NIL,If(nFoc=5,nBt5,If(nFoc=4,nBt4,If(nFoc=3,nBt3,If(nFoc=2,nBt2,nBt1)))))      //focaliza

Return 

Procedure MyNewButton(nBot,nFoc,nBut,nCol,nAud,nVie,nLft,nTxt,nFun)
Local xbFundo:=RGB(245,245,220) 
Private oBKey:=nBPos:=nBSty:=Ch:=0
Private nBt1:=nBt2:=nBt3:=nBt4:=nBt5:=""
nAud:=If(nAud=Nil,.T.,nAud)
nVie:=If(nVie=Nil,.F.,nVie)    //mostra a imagem do boneco
nLft:=If(nLft=Nil,nCol-(10*Len(nBut)),nLft)    //coloca a imagem no canto esquerdo da tela
If nAud = .T.
   C_PLAYSOUND(wD_Audios+"pergunta.wav")
   If nVie = .T.
      /////////// Desenha a imagem da tela //pergunta // exclamacao
      NewDrawField(nBot-1,nLft,nCol,"",10,nBot+2) //8 linha
      NewShowLabel(nBot-1,nLft,"",3,"VERMELHO",30,10,nBot+1,nCol,xbFundo) //,,"FUNDO_BUTTON")

      If nTxt # Nil
         NewShowLabel(nBot,nLft+1,nTxt,"ESQUERDA","NAVYBLUE",24,11,nBot,nCol,xbFundo) //,,"FUNDO_BUTTON")
      EndIf
      wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse
   EndIf
EndIf

PcNewButton(nBot,nFoc,nBut,nCol)

nBPos:=nFoc //foco do botao
nTBt:=Len(nBut) //tamanho do botao
nTBw:=If(nFun # Nil,0,0) //tempo de execucao automatica do botao
Do while !((ch:=inkey(nTBw))==K_ESC)  //1 segundo para ele entrar e desenhar a função
	If nFun # Nil
      ChkLibVenda(.F.) //funcao minha de venda que nao importa para desenhos
	EndIf
	
   Do Case
      Case ch==K_ENTER //.Or.ch==K_LDBLCLK //enter para selecionar o botao nao colocar
           oBKey:=nBPos   //recebe o botao posicionado
      Case ch==K_TAB   .Or. ch==K_RIGHT .Or. ch==K_DOWN  //tab avan‡a
           nBPos++
      Case ch==K_SH_TAB.Or. ch==K_LEFT .Or. ch==K_UP  //shift + tab volta
           nBPos--
      Case (ch<=-1.And.ch>=-9).Or.ch=28.Or.ch=-40.Or.ch=-41 //Fs chama as teclas de funcao
          aBlock:=SetKey(ch)
          If aBlock#Nil
             EVal(aBlock)
             ch:=0
          EndIf
      OtherWise 
          For i2:=1 To nTBt     //varre o vetor
              If "&"+Upper(Chr(ch)) $ Upper(nBut[i2])
                 oBKey:=nBPos:=i2
          Exit //sai da execucao com a posição aceita  do for
              EndIf
          Next
	EndCase
   nBPos:=If(nBPos > nTBt,1,if(nBPos < 1,nTBt,nBPos))
   PcNewButton(nBot,nBPos,nBut,nCol)

   If oBKey>0 //se okey ja for escolhido no caso das letras, ja sai
Exit
   EndIf
EndDo

//apagar o botao

For iX:=1 to nTBt
   wvw_PBDestroy(NIL,If(iX=1,nBt1,If(ix=2,nBt2,If(ix=3,nBt3,If(ix=4,nBt4,nBt5))))) 
Next
//WVW_SETMOUSEMOVE(,lMouseMove)
If nAud = .T.
   If nVie = .T. //apagar 
      /////////// Desenha a imagem da tela //pergunta // exclamacao
      NewDrawField(nBot-1,nLft,nCol,"",10,nBot+2) //8 linha
      NewShowLabel(nBot-1,nLft,"",3,"VERMELHO",30,10,nBot+1,nCol,xbFundo) //,,"FUNDO_BUTTON")
   EndIf
EndIf

wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse ver se vai ficar aqui

Return oBKey

//ufa, creio que é o final de todas os defines abaixo para execução em gui da forma acima.
#include "Fileio.ch"
#include "Fiscal.ch"
#include "setcurs.ch"
#Include "button.ch"
#Include "box.ch"
#include "inkey.ch"
#include "memoedit.ch"
#include "common.ch"
#Include "winuser.ch"
#Include "HBGtinfo.ch" //tanto para gtwvw como gtwvg
#Include "Windows.Ch"
#Include "hbsetup.ch"
#Include "tbrowse.ch"
#Include "hbclass.ch"
#include "Directry.ch"
#include "error.ch"
#include "getexit.ch"

#include "WINGDI.CH"
#include "hbcompat.ch" //impressao
#include "hbsqlit3.ch"
#include "tip.ch"


Espero ter lhe ajudado e não confundido, hehehehe.
Demorei para chegar neste padrão de tela, mas mesmo assim quero migrar para HW_GUI.
Um abraço
T+
:))
:)Pos

Imprimir Relatórios

Enviado: 30 Mai 2015 16:53
por Josmar dos Santos
Boa tarde Leandro. Obrigado por compartilhar o seu conhecimento..e parabéns pelo seu trabalho. Muito Objetivo e Profissional...


Um Abraço


Josmar

:{