Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Agregar boton con imagen (https://www.clubdelphi.com/foros/showthread.php?t=65213)

pedrosan 27-11-2009 20:04:04

Agregar boton con imagen
 
Hola a todos, les comento un poco el problema que tengo a ver si alguien tiene info al respecto. Basicamente estoy agregando un boton en tiempo de ejecución de la siguiente manera :

CreateWindow('Button', ' ', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT or WS_CLIPSIBLINGS ,
205, 2, 30, 25, hw, HMENU(WM_BUTTON_50),0,nil);

Lo hago de esta manera ya que despues a traves de un HOOK identifico cuando hace click sobre este boton (wParam = WM_BUTTON_50).

Es posible agregarle una imagen a este boton? o alguien sabe de algun otro componente que pueda agregar con imagen y al que por supuesto pueda definirle HMENU(WM_BUTTON_50) de manera tal que pueda identificarlo a traves de HOOK cuando se haga click en el mismo?
Muchas gracias!

escafandra 28-11-2009 14:08:43

¿Porqué no usas un SpeedButton?. Puedes asignar su evento OnClick dinámicamete también.

Saludos.

pedrosan 30-11-2009 15:49:53

Hola, gracias por la sugerencia. Habia probado hacer con un SpeedButton pero tuve problemas a la hora de asignarle un ParentWindow ya que no posee esa propiedad y lo necesito dentro de una determinada ventana. Trate con la funcion SetParent, pero tengo problemas a la hora de obtener el Handle del speedbutton. Alguna de idea de como puedo asignar el speedbutton en tiempo de ejecucion a una ventana? De todas maneras voy a seguir probando, a lo mejor algo esoty haciendo mal. Gracias!

escafandra 30-11-2009 20:10:43

Un ejemplo con un TBitBtn:

Código:

   
    TBitBtn* B = new TBitBtn((void*)NULL);
    B->Left = 100;
    B->Top =  100;
    B->Width = 75;
    B->Height = 25;
    B->Parent = this;
    ::SetParent(B->Handle, Panel1->Handle);  // Lo pasa a otro ventana

Saludos.

pedrosan 01-12-2009 15:13:44

Muchas gracias escafandra, excelente aporte como de costumbre :) Ahora bien, me esta costando un poco la equivalencia del código en DELPHI, sobre todo (void*)NULL, no se si lo estoy haciendo bien y parece me está trayendo problemas...si tenes a mano la equivalencia te lo agradecería,sino igual ya con la idea que me diste me va servir mucho... Muchas gracias nuevamente!

escafandra 01-12-2009 23:04:32

(void*)NULL es un puntero nulo, equivalente a nil.

Saludos.

pedrosan 03-12-2009 17:04:53

Al final logré agregarle imagen al boton creado con la funcion windowcreate. Aqui dejo el código:

//Creo el boton
B1 := CreateWindow('Button', '', WS_CLIPSIBLINGS or WS_BORDER or WS_VISIBLE or BS_PUSHBUTTON or BS_HOLLOW or WS_CHILD or BS_ICON,205, 2, 30, 25, hw, HMENU(WM_BUTTON_50),0,nil);

//envío mensaje para cargar imagen en el boton SendMessage(B1,BM_SETIMAGE,IMAGE_ICON,LoadImage(0,'C:\Image48x48.ico',IMAGE_ICON,0,0,LR_LOADFROMFILE ));


Saludos!

escafandra 04-12-2009 13:29:40

A pesar de que lo solucionaste, quiero ilustrar el ejemplo que puse en C++Builder:
Cita:

Empezado por escafandra (Mensaje 347770)
Un ejemplo con un TBitBtn:

Código:

   
    TBitBtn* B = new TBitBtn((void*)NULL);
    B->Left = 100;
    B->Top =  100;
    B->Width = 75;
    B->Height = 25;
    B->Parent = this;
    ::SetParent(B->Handle, Panel1->Handle);  // Lo pasa a otro ventana

Saludos.

Lo traduzco a delphi. Probado en delphi 6:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  B:  TBitBtn;
begin
    B:= TBitBtn.Create(nil);
    B.Left:= 10;
    B.Top:=  10;
    B.Width:=Image1.Picture.Width;
    B.Height:= Image1.Picture.Height;
    B.Parent:= self;
    B.Glyph:= Image1.Picture.Bitmap;

   // Lo pasa a otra ventana, en este caso un panel, pero podría ser cualquiera dado su Handle
    Windows.SetParent(B.Handle, Panel1.Handle);  
end;

Saludos.

pedrosan 04-12-2009 16:21:45

Boton redondo??
 
Gracias por la respuesta escafandra, te comento que ya habia probado hacer algo como lo q indicas arriba, el tema es q el boton se me agregaba pero sin imagen, es decir un boton con fondo NEGRO,un boton todo negro, no se cual será el motivo, es por eso que decidi seguir intentando a traves de funciones de la api de windows hasta q salió je. A lo mejor tuve ese problema por el tipo de ventana a la que le agregaba el TBitBtn boton, no era un panel común, es una ventana de otra aplicacion, en fin...

Cambiando un poco de tema, ahora estoy intentando crear el boton pero "redondeado"...intenté con el siguiente código pero nada :( Primero que nada me gustaría saber si es posible hacer para asi poder seguir investigando y probando. Dejo el código que se me ocurrio pero no funciona je:
Código Delphi [-]
B1 := CreateWindow('Button', '',WS_VISIBLE or WS_CHILD {or WS_DLGFRAME´}  or BS_FLAT or BS_ICON ,205, 2, 30, 25, hw, HMENU(WM_BUTTON_50),0,nil);       
      
//envío mensaje para agregar imagen al boton
SendMessage(B1,BM_SETIMAGE,IMAGE_ICON,LoadImage(0,'C:\Imagen_48x48.ico',IMAGE_ICON,80,80,LR_LOADFROM  FILE)); 
      
windows.GetClientRect(B1,rcClient);      
RoundRect(GetDC(B1),rcClient.Left,rcClient.Top,rcClient.Right,rcClient.Bottom,20,20); 
windows.RedrawWindow(B1,@rcClient,hw,RDW_UPDATENOW);
Algún aporte??muchas gracias!

Saludos!


La franja horaria es GMT +2. Ahora son las 03:36:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi