SoloCodigo

Programación General => Pascal => Mensaje iniciado por: t21 en Lunes 11 de Agosto de 2003, 06:38

Título: aqui esta el codigo en tp para el mouse
Publicado por: t21 en Lunes 11 de Agosto de 2003, 06:38
Unit mousegr2;

InTerface
Uses Dos,Crt,Graph;
Type Vermelho_Verde_Azul = Record Vermelho, Verde, Azul : Byte; End;
     TMenu= Record A, B : Integer;X:boolean;End;

VAR
                         Cor : Array[0..63] Of Vermelho_Verde_Azul;
                 AX,BX,CX,DX : word;
                 ExisteMouse : Boolean;
 Driver_grafico,Modo_Grafico,
                        Erro : Integer;

PROCEDURE Mouse( var Reg_AX, Reg_BX, Reg_CX, Reg_DX : word );

PROCEDURE LigaMouse;

PROCEDURE DesligaMouse;

Function  BotaoDireito:Boolean;

Function  BotaoEsquerdo:Boolean;

Function  BotaoCentral:Boolean;

Procedure Mostra_Ponteiro(Esconde : Boolean);

Procedure CursorMouse(Var X,Y:Integer);

Procedure WindowMouse(X,Y,X1,Y1:Byte);

Procedure Menu(X1,Y1,XX,YY : Integer; Texto : String; Cor, Bordas : Byte;
Var R:TMenu; A : Integer);

{Procedure Imagem_Menu(X1,Y1,X2,Y2 : Integer;  Boo : Boolean);}
Procedure Escreva(X,Y : Integer; St: String; Cor : byte);

Procedure Relogio(X,Y : Integer; Cor :Byte);

Procedure Data(X,Y : Integer; Cor : Byte; Caso : Boolean);

Procedure Tela(A : Integer);

Procedure PoeBotao(X1,Y1,XX,YY : Integer; Texto : String; Cor, Bordas : Byte);

Procedure Botao(X1,Y1,XX,YY : Integer; Texto : String; Cor, Bordas  : Byte;
Var Click : Boolean; On_Off : Integer);

Procedure Barra(X1,Y1,XX,YY : Integer; Texto : String; Cor, Bordas : Byte);

{Procedure Aviso(X, Y, X1, Y1 : Integer; Texto : String);}

Procedure Imagem(X1,Y1,X2,Y2 : Integer; Boo : Boolean);

Procedure Reg_Click(var C1, C2 : Integer);

Implementation

Var Regs : Registers;  { Registradores do MS DOS }
{Executa a Interrupcao do Mouse}
PROCEDURE Mouse( var Reg_AX, Reg_BX, Reg_CX, Reg_DX : word );
  begin
    With Regs DO
      begin
        AX := Reg_AX; BX := Reg_BX; CX := Reg_CX; DX := Reg_DX;
      end;
    intr($33,Regs);
    With Regs DO
      begin
        Reg_Ax := AX; Reg_BX := BX; Reg_CX := CX; Reg_DX := DX;
      end;
  end;

{Reseta As Variaveis da Interrupcao}
Procedure Reseta;
Begin
  AX:=0;
  BX:=0;
  CX:=0;
  DX:=0;
End;

PROCEDURE LigaMouse;
begin
    Reseta;
    AX := 1 ; Mouse( AX,BX,CX,DX )
end;

PROCEDURE DesligaMouse;
  begin
    Reseta;
    AX := 0 ; Mouse( AX,BX,CX,DX )
  end;

Procedure Mostra_Ponteiro(Esconde : Boolean);
begin
     Reseta;
     If Esconde Then Ax := 1 Else Ax := 2;
     Mouse(Ax,Bx,Cx,Dx);
End;


{*************************************}
{AS TRES FUNCOES ABAIXO, RETORNAM TRUE SE}
{ SEU RESPECTIVO BOTAO FOR PRESSIONADO}
{*************************************}
Function  BotaoEsquerdo:Boolean;
Begin
  Reseta;
  AX:=3;
  Mouse(AX,BX,CX,DX);
  BotaoEsquerdo:= BX = 1 ;

End;

Function  BotaoDireito:Boolean;
Begin
  Reseta;
  AX:=3;
  Mouse(AX,BX,CX,DX);
  BotaoDireito:= BX = 2 ;
End;

Function  BotaoCentral:Boolean;
Begin
  Reseta;
  AX:=3;
  Mouse(AX,BX,CX,DX);
  Botaocentral:= BX = 4 ;
End;

{RETORNA AS COORDENADAS DE PIXEL PARA
CARACTERES, REALIZANDO OS CALCULOS A SEGUIR}

Procedure CursorMouse(Var X,Y:Integer);
Begin
  Reseta;
  AX:=3;
  Mouse(AX,BX,CX,DX);
  X:=CX;
  Y:=DX;
End;

{DEFINE A AREA DE TRABALHO DO MOUSE, OU SEJA
UMA JANELA}

Procedure WindowMouse(X,Y,X1,Y1:Byte);
Begin
  Reseta;
  AX:=7;
  CX:=X * 8;
  DX:=X1 * 8;
  Mouse(AX,BX,CX,DX);

  Reseta;
  AX:=8;
  CX:=Y * 8;
  DX:=Y1 * 8;
  Mouse(AX,BX,CX,DX);
End;

Procedure Escreva(X,Y : Integer; St: String; Cor : byte);
Begin
  Regs.Ah:=$13;
  Regs.Al:=$01;
  Regs.Bl:=Cor;
  Regs.Bh:=$00;
  Regs.Cx:=Length(St);
  Regs.Dl:=X;
  Regs.Dh:=Y;
  Regs.Es:=Seg(St[1]);
  Regs.Bp:=Ofs(St[1]);
  Intr(16,Regs)
End;

Procedure Relogio(X,Y : Integer; Cor :Byte);
Var H,M,S,MS : Word;
          St : String[10];
Function Principal(W : Word) : String;
Begin
  Str(W : 0, St);
  If Length(St) = 1 Then St := '0' + St;
  Principal := St;
End;
Begin
  GetTime(H,M,S,MS);
  Escreva(X, Y, Principal(H) + ':' + Principal(M),Cor);
End;

Procedure Data(X,Y : Integer; Cor : Byte; Caso : Boolean);
Var
      J, M, D, W : Word;
  St,St1,St2,St3 : String[9];
Const
  Mes :array[1..12] of string[9] =('Janeiro','Fevereiro','Marco','Abril',
         'Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro',
         'Dezembro');
Begin
  Getdate(J,M,D,W);
  Case W Of
    0 : St := 'Domingo';
    1 : St := 'Segunda-Feira';
    2 : St := 'Terca-Feira';
    3 : St := 'Quarta-Feira';
    4 : St := 'Quinta-Feira';
    5 : St := 'Sexta-Feira';
    6 : St := 'Sabado';
  End;
  Str(D,St1);Str(M,St2);Str(J,St3);
  If D in[0..9] Then St1 := '0'+St1;
  If M in[0..9] Then St2 := '0'+St2;
  If Caso = True Then Escreva(X,Y,St+' '+St1+' '+Mes[M]+' '+St3,Cor)
                 Else Escreva(X,Y,St1+'/'+St2+'/'+St3[3]+St3[4],Cor);
End;

Procedure PoeBotao(X1,Y1,XX,YY : Integer; Texto : String; Cor, Bordas : Byte);

var
  Horizontal, Vertical : Real;
               P, X, Y : Integer;
Begin
  SetFillStyle(1,7);Bar(X1,Y1,XX,YY);
  SetColor(15);
  for P :=0 to Bordas do Line(X1+p,Y1+p,XX-p,Y1+p);
  for P :=0 to Bordas do Line(XX-p,Y1+p,XX-p,YY-p);
  SetColor(8);
  for P :=0 to Bordas do Line(X1+p,YY-p,XX-p,YY-p);
  for P :=0 to Bordas do Line(X1+p,Y1+p,X1+p,YY-p);
  SetTextStyle(2,0,6);
  Horizontal :=((XX-X1)/2)+X1-(Length(Texto)*10)/2;Vertical:=((YY-Y1)/2)+Y1-5;
  SetColor(1);OutTextXY(Round(Horizontal)+1,Round(Vertical)-5,Texto);
  SetColor(1);OutTextXY(Round(Horizontal)+2,Round(Vertical)-5,Texto);
end;

Procedure Botao(X1,Y1,XX,YY : Integer; Texto : String; Cor, Bordas : Byte;
Var Click : Boolean; On_Off : Integer);

var
  Horizontal, Vertical : Real;
               P, X, Y : Integer;
                     B : Boolean;

   Procedure Off;
   Var P : Integer;
   Begin
       Mostra_Ponteiro(False);
       SetFillStyle(1,7);Bar(X1,Y1,XX,YY);
       SetColor(15);
       for P :=0 to Bordas do Line(X1+p,Y1+p,XX-p,Y1+p);
       for P :=0 to Bordas do Line(XX-p,Y1+p,XX-p,YY-p);
       SetColor(8);
       for P :=0 to Bordas do Line(X1+p,YY-p,XX-p,YY-p);
       for P :=0 to Bordas do Line(X1+p,Y1+p,X1+p,YY-p);
       SetTextStyle(2,0,6);
       Horizontal :=((XX-X1)/2)+X1-(Length(Texto)*10)/2;Vertical:=((YY-Y1)/2)+Y1-5;
       SetColor(1);OutTextXY(Round(Horizontal)+1,Round(Vertical)-5,Texto);
       SetColor(1);OutTextXY(Round(Horizontal)+2,Round(Vertical)-5,Texto);
       Mostra_Ponteiro(True);
       CliCk:=False;
   End;

   Procedure On;
   Var P : Integer;
   Begin
        Mostra_Ponteiro(False);
        SetFillStyle(1,7);Bar(X1,Y1,XX,YY);
        SetColor(8);
        for P :=0 to Bordas do Line(X1+P,Y1+P,XX-P,Y1+P);
        for P :=0 to Bordas do Line(XX-P,Y1+P,XX-P,YY-P);
        SetColor(15);
        for P :=0 to Bordas do Line(X1+P,YY-P,XX-P,YY-P);
        for P :=0 to Bordas do Line(X1+P,Y1+P,X1+P,YY-P);
        SetColor(8);
        SetTextStyle(2,0,6);
        Horizontal :=((XX-X1)/2)+X1-(Length(Texto)*10)/2;
        Vertical :=((YY-Y1)/2)+Y1-4;
        OutTextXY(Round(Horizontal),Round(Vertical)-5,Texto);
        OutTextXY(Round(Horizontal)+1,Round(Vertical)-5,Texto);
        SetTextStyle(0,0,0);
        Mostra_Ponteiro(True);
        Delay(150);

        Reseta;
        AX:=3;
        Mouse(AX,BX,CX,DX);
        While BX = 1 Do Cursormouse(X,Y);
        Click := True;
   End;

Begin
  CursorMouse(X,Y);
   If ((X>X1)and(X<XX)) and ((Y>Y1)and(Y<YY)) and (Botaoesquerdo) then B:=true
                                                                  else B:=false;
   If (B) And (On_Off = 1) Then On;
   If (On_Off = 2) Then Off;
End;

Procedure Reg_Click_Solto(var C1, C2 : Integer);{Armazena onde foi clicado}
Begin
     C1 := CX;
     C2 := DX;
End;

Procedure Reg_Click(var C1, C2 : Integer);{Armazena onde foi clicado}
Var X, Y, S, S1 : Integer;
Begin
     Reseta;
     AX:=3;
     Mouse(AX,BX,CX,DX);
     C1 := CX;
     C2 := DX;
     While BX = 1 Do Cursormouse(X,Y);
     Reg_CliCk_Solto(S, S1);
End;


{Ex.:   Barra(1,440,640,475,'TESTE COM BARRA DE TAREFAS',1,1);}
Procedure Barra(X1,Y1,XX,YY : Integer; Texto : String; Cor, Bordas : Byte);

var
  Horizontal, Vertical : Real;
                     P : Integer;
begin
  SetFillStyle(1,7);Bar(X1,Y1,XX,YY);
  SetColor(15);
  for P :=0 to Bordas do Line(X1+p,Y1+p,XX-p,Y1+p);
  for P :=0 to Bordas do Line(XX-p,Y1+p,XX-p,YY-p);
  SetColor(8);
  for P :=0 to Bordas do Line(X1+p,YY-p,XX-p,YY-p);
  for P :=0 to Bordas do Line(X1+p,Y1+p,X1+p,YY-p);
  SetTextStyle(2,0,6);
  Horizontal :=((XX-X1)/2)+X1-(Length(Texto)*10)/2;Vertical:=((YY-Y1)/2)+Y1-5;
  SetColor(1);OutTextXY(Round(Horizontal)+1,Round(Vertical)-5,Texto);
  SetColor(1);OutTextXY(Round(Horizontal)+2,Round(Vertical)-5,Texto);
end;

Procedure Tela(A : Integer);
Const PelAddrRgR  = $3C7;
      PelAddrRgW  = $3C8;
      PelDataReg  = $3C9;

{Type Vermelho_Verde_Azul = Record Vermelho, Verde, Azul : Byte; End;}

Var I : Integer; Ch : Char; {Cor : Array[0..63] Of Vermelho_Verde_Azul;}

    Procedure Pega_Cor(C : Byte; Var Vermelho, Verde, Azul : Byte);
      Begin
           Port[PelAddrRgR] := C;
           Vermelho := Port[PelDataReg];
              Verde := Port[PelDataReg];
               Azul := Port[PelDataReg];
      End;

      Procedure Seleciona_Cor(C, Vermelho, Verde, Azul : Byte);
        Begin
             Port[PelAddrRgW] := C;
             Port[PelDataReg] := Vermelho;
             Port[PelDataReg] := Verde;
             Port[PelDataReg] := Azul;
        End;

        Procedure Seleciona_Intensidade(B : Byte);
         Var                        I : Integer;
             Fvermelho, Fverde, Fazul : Byte;
           Begin
                For I := 0 To 63 Do
                    Begin
                         Fvermelho := Cor . Vermelho * B DIV 63;
                         Fverde := Cor . Verde * B DIV 63;
                         Fazul := Cor . Azul * B DIV 63;
                         Seleciona_Cor(I, Fvermelho, Fverde, Fazul);
                    End;
           End;

Begin
   If A = 0 Then
               Begin
   For I := 0 To 63 Do Pega_Cor(I, Cor.Vermelho, Cor.Verde, Cor.Azul);
   For I := 63 DownTo 0 Do Begin Seleciona_Intensidade(I); Delay(20); End;
               End;
   If A = 1 Then
                Begin
   For I := 0 To 63 Do Begin Seleciona_Intensidade(I); Delay(20); End;
                End;
End;

Procedure Menu(X1,Y1,XX,YY : Integer; Texto : String;Cor , Bordas : Byte;
Var R : TMenu; A : Integer);

var
     Horizontal, Vertical : Real;
          C1, C2, P, X, Y : Integer;
                        B : Boolean;
  Procedure Destaca;
  var p : integer;
  Begin
    R.X := True;
     C2 := 0; Inc(C1); If C1=1 Then
   begin
    Mostra_Ponteiro(False);
    SetFillStyle(1,1);Bar(X1,Y1,XX,YY);
    SetColor(0);
    for P :=0 to Bordas do Line(X1+P,Y1+P,XX-P,Y1+P);
    for P :=0 to Bordas do Line(XX-P,Y1+P,XX-P,YY-P);
    SetColor(0);
    for P :=0 to Bordas do Line(X1+P,YY-P,XX-P,YY-P);
    for P :=0 to Bordas do Line(X1+P,Y1+P,X1+P,YY-P);
    SetColor(15);
    SetTextStyle(2,0,6);
    Horizontal :=((XX-X1)/2)+X1-(Length(Texto)*10)/2;
    Vertical :=((YY-Y1)/2)+Y1-4;
    OutTextXY(Round(Horizontal),Round(Vertical)-5,Texto);
    OutTextXY(Round(Horizontal)+1,Round(Vertical)-5,Texto);
    SetTextStyle(0,0,0);
    CursorMouse(X,Y);
    Mostra_Ponteiro(True);
   end;
end;

Procedure Normal;
Var p : Integer;
Begin
  C1 := 0; Inc(C2);
  If C2=1 Then
  Begin
    Mostra_Ponteiro(False);
    SetFillStyle(1,15);Bar(X1,Y1,XX,YY);
    SetColor(8);
    For P :=0 To Bordas Do Line(X1+p,Y1+p,XX-p,Y1+p);
    For P :=0 To Bordas Do Line(XX-p,Y1+p,XX-p,YY-p);
    SetColor(8);
    For P :=0 To Bordas Do Line(X1+p,YY-p,XX-p,YY-p);
    For P :=0 To Bordas Do Line(X1+p,Y1+p,X1+p,YY-p);
    SetTextStyle(2,0,6);
    Horizontal :=((XX-X1)/2)+X1-(Length(Texto)*10)/2;
    Vertical:=((YY-Y1)/2)+Y1-5;
    SetColor(1);OutTextXY(Round(Horizontal)+1,Round(Vertical)-5,Texto);
    SetColor(1);OutTextXY(Round(Horizontal)+2,Round(Vertical)-5,Texto);
    Mostra_Ponteiro(True);
    R.X := False;
  End;
End;
Begin
  CursorMouse(R.A,R.B);
  If (A = 1) Then Begin C2 := 0; Normal; End;
   If ((R.A>X1)and(R.A<XX)) and ((R.B>Y1)and(R.B<YY)) then
      B := True else B := False;
   If (B) Then Destaca Else If (R.X) Then Normal
End;

Procedure Imagem(X1,Y1,X2,Y2 : Integer; Boo : Boolean);
Var   S1 : Word;
   PMenu : Pointer;
Begin
     If Boo Then Begin
                    S1 := ImageSize(X1,Y1,X2,Y2);
                    Getmem(PMenu,s1);
                    GetImage(X1,Y1,X2,Y2,PMenu^);
                 End;
     If Not Boo Then Begin
                             Mostra_Ponteiro(False);
                             PutImage(X1,Y1,PMenu^,0);
                             Freemem(PMenu,S1);
                             Mostra_Ponteiro(True);
                          End;
End;

{Procedure Aviso(X, Y, X1, Y1 : Integer; Texto : String);
Var I : Integer;
    T : Word;
  OKA : Boolean;
    P : Pointer;
begin
       Mostra_Ponteiro(False);
       T := ImageSize(X,Y,X1,Y1);
       Getmem(P,T);
       GetImage(X,Y,X1,Y1,P^);
     SetFillStyle(1,7);
     Bar(X,Y,X1,Y1);
     SetFillStyle(1,1);
     Bar(X,Y,X1,Y+20);
     SetColor(15);
     SetTextStyle(DefaultFont, HorizDir,1);
     Rectangle(X,Y,X1,Y1);
     I := (((X1-X)-(Length(Texto)*8)) Div 2);
     OutTextXY(I + X,Y+7,Texto);
     I := (((X1-X)-(40)) Div 2);
     PoeBotao(X + I, Y1-35, X + I + 40, Y1-10, 'OK',0,0);
     Mostra_Ponteiro(True);
     OKA := False;
     repeat
       Botao(X + I,Y1-35,X + I + 40,Y1-10,'OK',0,0,OKA,1);
     until (OKA);
      If OKA Then Begin
                      Mostra_Ponteiro(False);
                      PutImage(X,Y,P^,0);
                      Freemem(P,T);
                      Mostra_Ponteiro(True);
                      Exit;
                  End;
End;}

Begin
  Detectgraph(Driver_Grafico,Modo_Grafico);
  Initgraph(Driver_Grafico,Modo_Grafico,'tpbgi');
  Erro:=Graphresult;
  If Erro<>Grok Then
   Begin
     Write(Grapherrormsg(erro));
     Halt;
   End;
End.