Pular para o conteúdo principal

Editando imagens usando o Protheus

Você conhece a Classe TDrawer?

Usando-a você pode abrir e manipular imagens com extensões BMP (Bitmap), JPG (Joint Photographic Group) e PNG (Portable Network Graphics).

Para isto, basta você adicionar a função (exemplo abaixo), em seu programa (usar include TOTVS.CH ou PROTHEUS.CH), fazer a chamada a ela num botão e compilar.


Segue a função:


User Function TDrawer
Private isText := .F.
Private colors := {CLR_HRED, -1} // Linha Vermelha / Fundo Transparente

DEFINE DIALOG oDlg TITLE "Exemplo TDrawer" FROM 180,180 TO 550,700 PIXEL

// Menu de Opções
oMenu := TMenu():New()
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Abre',,,,{||isText:=.F.,openFile()}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Salva',,,,{||isText:=.F.,saveFile()}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Texto',,,,{||isText:=.T.}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Selecao',,,,{||isText:=.F.,oDrawer:SetType(0)}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Traço',,,,{||isText:=.F.,oDrawer:SetType(1)}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Livre',,,,{||isText:=.F.,oDrawer:SetType(2)}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Circulo',,,,{||isText:=.F.,oDrawer:SetType(3)}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Retang.',,,,{||isText:=.F.,oDrawer:SetType(4)}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Oval',,,,{||isText:=.F.,oDrawer:SetType(5)}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Fonte',,,,;
{||oDrawer:SetFontText(TFont():New('Verdana',0,-30)),alert('Fonte alterada')}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Cores',,,,{||defineColor()}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Desfaz',,,,{||oDrawer:Undo()}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Recorta',,,,{||oDrawer:Crop()}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Cola',,,,{||oDrawer:Paste()}))
oMenu:Add(TMenuItem():New(oMenu:Owner(),'Limpa',,,,{||oDrawer:ClearImage()}))

// Cria Scroll e TDrawer para a imagem
oTScrollBox := TScrollBox():New(oDlg,02,80,184,180,.T.,.T.,.T.)
oDrawer := tDrawer():New(0,0,oTScrollBox,900,550)

// Define cores iniciais
oDrawer:SetColors(colors[1], colors[2])

// Blocos de código do mouse
oDrawer:blClicked := {|o,x,y| click(x,y)}
oDrawer:brClicked := {|o,x,y| Alert('Click direito do mouse')}

ACTIVATE MSDIALOG oDlg CENTERED
Return

//------------------------------
// Funções de apoio
//------------------------------
Static Function click(x,y)
if (isText)
text := 'Digite o texto'
inputQuery('Adiciona texto','Digite texto - "|" para pulo de linha',@text)
oDrawer:AddText(x,y,text)
endif
Return

Static Function saveFile()
Local cFile := 'C:\Dir\imagem.JPG'
inputQuery('Salva imagem','Arquivo (JPG, PNG ou BMP)',@cFile)
oDrawer:SaveImage( cFile, 'JPG' )
Return

Static Function openFile()
cFile := AllTrim( cGetFile( 'Arquivo JPG|*.Jpg|Arquivo PNG|*.Png|Arquivo BMP|*.Bmp',;
'Selecione arquivo', 0, 'C:\Dir\', .T.,;
GETF_LOCALFLOPPY + GETF_LOCALHARD + GETF_NETWORKDRIVE ) )

if ( file(cFile) )
oDrawer:OpenImage(cFile)
endif
Return

Static Function inputQuery(cTitulo,cDescr,cResult)
Local cGet1 := PadR(cResult,200)
Local oGet1
Local oDlgInput
DEFINE MSDIALOG oDlgInput TITLE cTitulo FROM 178,181 TO 270,443 PIXEL

@ 002,002 Say cDescr Size 131,008 of oDlgInput Pixel
@ 014,002 Get oTGet VAR cGet1 SIZE 130,009 PIXEL OF oDlgInput
oBtn1 := TButton():New( 30,002, 'Ok' , oDlgInput,;
{|| cResult:=Trim(cGet1),oDlgInput:End() },25,15,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn2 := TButton():New( 30,034, 'Cancela', oDlgInput,;
{|| cResult:='',oDlgInput:End() },25,15,,,.F.,.T.,.F.,,.F.,,,.F. )

ACTIVATE MSDIALOG oDlgInput CENTERED
Return

Static Function defineColor()
Local oDlgColor
DEFINE MSDIALOG oDlgColor TITLE 'Escolhe as Cores Linha/Fundo' FROM 01,01 TO 450,450 PIXEL

oColorPen := tColorTriangle():New(001,02,oDlgColor,200,100)
oColorBrush := tColorTriangle():New(102,02,oDlgColor,200,100)
oBtn1 := TButton():New( 202,006, 'Ok', oDlgColor,{|| colors[1]:=oColorPen:retColor(),;
colors[2]:=oColorBrush:retColor(),oDlgColor:End() },;
25,15,,,.F.,.T.,.F.,,.F.,,,.F. )

ACTIVATE MSDIALOG oDlgColor CENTERED

// Define cores para a pintura
oDrawer:SetColors(colors[1], colors[2])
Return


Não esqueça de incluir no topo de seu programa: #include "TOTVS.CH" ou #include "PROTHEUS.CH".

Bom proveito!


• Veja também: Impressão com imagens no Protheus





Comentários

Postagens mais visitadas deste blog

Teclas de Atalhos TOTVS Developer Studio (Eclipse)

Seguem os atalhos para o TOTVS Developer Studio  (Eclipse)  : CTRL+H Localizar vários locais CTRL+F Localizar / substituir CTRL+K Localizar proximo resultado abaixo CTRL+SHIFT+K Localizar proximo resultado acima F11 Depurar F5 Percorre linha F6 Pula linha CTRL+F8 Trocar perspectiva CTRL+F7 Mudar visualização CTRL+F6 Navegar entre os fontes abertos CTRL+M Maximiza / miniminiza fonte CTRL+N Novo (wizard) CTRL+L Ir para linha CTRL+D Deleta toda linha CTRL+ALT+DOWN Duplica linha para baixo CTRL+ALT+UP Duplica linha para cima CTRL+SHIFT+L Apresenta lista de atalhos ALT+UP Move linha para cima ALT+DOWN Move linha para baixo CTRL+SHIFT+I Indenta o fonte CTRL+F9 Compilar CTRL+ESPAÇO A

Impressão com imagens no Protheus

Muitas vezes é necessário incluir uma imagem num relatório (uma logomarca por exemplo). Uma das maneiras de se fazer isto, é usar a classe TMSPRINTER() . O programa exemplo abaixo, ilustra bem como fazer. Este usa também a classe TFONT() (o tamanho do fonte leva o sinal de menos) : # include "PROTHEUS.CH" # include "RWMAKE.CH" user function fImprimeG() local oFont08 := tfont():New( 'Courier new' ,, -8, .t.),,; oFont09 := tfont():New( 'Courier new' ,, -9, .t.),,; oFont10 := tfont():New( 'Courier new' ,,-10, .t.) oPrint:=tmsprinter():new( "Impressao Grafica" ) oPrint:setportrait() oPrint:SetpaperSize(9) // PAPEL A4 if .not. oPrint:Setup() // MOSTRA JANELA DE CONFIGURAÇÃO DE IMPRESSAO msgalert( "IMPRESSAO CANCELADA." ) return nil endif // ESTE BLOCO PODE FICAR EM LOOP (DO WHILE, FOR..., ETC.) oPrint:StartPage() // oPrint:sayBitmap(linha, coluna, "C:\SUAPASTA\SUAIMAGEM.BMP", largura, al

Variáveis públicas do Protheus

Variáveis Públicas Disponíveis no Protheus: Nome Tipo Tamanho Descrição aEmpresas (A) Array contendo tantos elementos quanto forem as empresas e filiais cadastradas no sistema sendo que cada elemento se encontra no formato “EEFF” (Empresa + Filial) Ex.: “5501”. cAcesso (C, 128) Permissões de Acesso do Usuário. cEmpAnt (C, 2) Número da Empresa que está em uso no momento. Ex.: "55". cModulo (C, 3) Sigla do Módulo que está em uso no momento. Ex.: "EST" para o Módulo de Estoque. cNivel (N, 1) Nível de Acesso do Usuário podendo variar de 0 a 9 sendo que 9 indica um Administrador. cNumEmp (C, 4) Número da Empresa + Filial que está em uso no momento. Ex.: "9901". cSenha (C, 6) Senha do Usuário. cUserName (C, 15) Nome do Usuário sem brancos a direita. cUsuario (C, 533) Informações do usuário:de 001 a 006 – Senha do Usuário (6 dígitos)de 007 a 021 – Nome do Usuário (15 dígitos)de 022 a 533 – Permissões de Acesso (512 dígitos) dDataBa