GARANTIR DESCONTO

Fórum trabalhando com imagens sem flick #328234

29/08/2006

0

Minha aplicação tem uma imagem de fundo na form principal, usando Timage, que nunca me deu problema.
Só que agora eu coloquei alguns ´icones´ na minha form pra chamar outras janelas do programa. Esses icones são Timage com um bitmap de 32x32 pixels que podem ser arrastados com o mouse.

Quando eu arrasto os icones, tudo pisca, se eu coloco doublebuffered para true, aí dá umas piscadonas lentas.

eu testei com um componente chamado evWallpaper da TCF, e ficou ótimo, nada de piscadas etc. mas o componente é pago.

Quero saber onde consigo um componente free ou como eu faço um descendente de Timage que me permita colocar imagens de fundo no form sem flick?

Grato!


Vitor Rubio

Vitor Rubio

Responder

Posts

29/08/2006

Micheus

Ví num outro forum, um colega postar algo sobre mover figuras desta forma, entretanto a imagem fica com certa transparência (neste momento, o que ele não queria). Para isto ele utilizava estes métodos (não tinha exemplo, só os métodos).
TImageList.SetDragImage(0,0,0);
TImageList.DragLock(Parent.handle,x,y);
TImageList.ShowDragImage;
TImageList.BeginDrag(parent.handle,0,0);
TImageList.DragMove(x,y);
TImageList.HideDragImage;
TImageList.EndDrag;
TImageList.DragUnlock;

Tente dar umas olhada no help ou procurar por algum código utilizando eles.

Para tentar entender o problema, citado por ele, fiz o seguinte código (que aparentemente seria o uso sugerido por ele). Se não aparecer opção melhor, tente fazer um teste para ver se lhe é útil (derepente dá para adaptar).

procedure TForm1.FormCreate(Sender: TObject);
var
  Bmp,
  Mask :TBitMap;
begin
  Bmp := TBitmap.Create;
  Bmp.LoadFromFile(´U:\Micheus\mick4b.bmp´);
  Mask := TBitmap.Create;
  Mask.LoadFromFile(´U:\Micheus\mick4bmask.bmp´);
  ImageList1.Add(Bmp, Mask);
  Bmp.Free;
  Mask.Free;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ImageList1.SetDragImage(0,0,0);
  ImageList1.DragLock(handle,x,y);
  ImageList1.Draw(Canvas, x, y, 0, dsTransparent, itImage);
  ImageList1.BeginDrag(handle,0,0);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ImageList1.Dragging then
  begin
    ImageList1.DragMove(x,y);
    ImageList1.Draw(Canvas, x, y, 0, dsTransparent, itImage);
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ImageList1.HideDragImage;
  ImageList1.EndDrag;
  ImageList1.DragUnlock;
end;


[]s


Responder

Gostei + 0

30/08/2006

Vitor Rubio

Legal, mas eu tenho um Timage pra cada imagem. Vou precisar de um ImageList pra cada uma? Pergunto isso porque os eventos onclick, ondblclick e onmousedown/up das minhas imagens são tratadas. Alem disso, não são simples Timage, na verdade é uma filha da classe timage onde eu adicionei algumas propriedades.

por exemplo, tem a propriedade ´comando´ string, que quando o usuario dá um duplo-clique na imagem, ela dá um shellexecute no comando, abrindo um programa. Se eu uso imagelist, como trato dos ecentos de click?

Alem disso, minha imagem não é um bmp, é um jpg, o que complica um pouco.

Valew!


Responder

Gostei + 0

31/08/2006

Micheus

No momento não poderia fazer um programa para testar sua situação. Entretanto, acho que seria possível contorná-la.
A questão jpg/bmp não seria problema, já que seria posível obter o bitmap em seu TImage. Imagino que vc deseje implementar isto para reposicionar suas imágens na janela, é isto? Neste caso, seria possível que a imagem inicial fosse movida apenas quando o mouse fosse solto na nova posição?
Se vc não tiver uma resposta antes, quando eu puder fazer uns testes lhe dou um parecer.
Sinto não ter lhe ajudado.


Responder

Gostei + 0

31/08/2006

Vitor Rubio

Muito pelo contrario, você ajudou muito!

Fiz de um jeito diferente, mas a dica que você me deu foi a base.
Não posso postar o código aqui, só amanha, porque está na empresa, mas a diferença está principalmente no seguinte: coloquei o codigo do startdrag, pra começar a arrastar, não quando clica, mas somente se está clicado E o mouse se move clicado. No mouse up eu coloquei o código pra colar a Timage no lugar certo. Mesmo assim, quando eu reposiciono a TImage, ele dá uma piscadinha de nada, bem pikinininha, mas perceptível. Eu acho que precisaria achar outro componenete que não fosse o Timage.

Eu tambem usava um label embaixo da imagem para aparecer o nome, mas a tela piscava por causa do reposicionamento do label, então eu preecisava arrumar um jeito de aparecer o nome embaixo sem o label, talvez via canvas.

O que eu quero fazer é o seguinte: Manja a área de trabalho do windows, com seus ícones que podem ser arrastados, que ficam azuis quando clicados e tal? quero fazer igualzinho, só que ao invez de icones pra atalhos, programas ou arquivos, terei icones que exeecutam funções / chamam forms do meu sistema.

Com as dicas que você me deu, consegui chegar beeeeem perto, talvez eu deixe assim mesmo se não conseguir melhorar.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar