Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Buscando una filigrana gráfica

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Buscando una filigrana gráfica Responder citando

Lo que voy a sugerir sé que se puede hacer implementado la librería LMDTools, pero no quiero instalar nada que no me sea imprescindible. La pregunta es esta:

¿Se puede cambiar la alineación del caption en un TButton? Este elemento no trae la propiedad Align y por lo tanto el texto siempre sale centrado, pero me gustaría poder cambiarla.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Depende de que alineación elijas, por ejemplo a izquierdas:
Código:
SetWindowLong(Button1->Handle, GWL_STYLE, GetWindowLong(Button1->Handle, GWL_STYLE) | BS_LEFT);
Button1->Repaint();


Mira los estilos de botón: Button Styles




Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

escafandra escribió:

Código:
SetWindowLong(Button1->Handle, GWL_STYLE, GetWindowLong(Button1->Handle, GWL_STYLE) | BS_LEFT);
Button1->Repaint();

Funciona a la perfección salvo en un caso: Cuando creo los botones de forma dinámica.
Código:
for (int nBoton = 0; nBoton < slBotones->Count; nBoton ++)
{
     TButton *Boton     = new TButton(Panel2);
     Boton->Parent      = Panel2;
     Boton->Caption     = slBotones->Strings[nBoton];
     Boton->Enabled     = true;
     Boton->Font->Style = TFontStyles() >> fsBold;
     Boton->Height      = 25;
     Boton->Left        = Panel2->Width - (slBotones->Count - nBoton) * (nButWidth + 8);
     Boton->Tag         = nBoton + 1;
     Boton->Top         = 5;
     Boton->Visible     = true;
     Boton->Width       = nButWidth;
     Boton->OnClick     = ButtonClick;
}

En este caso me deja alineción centrada.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Pues esto funciona bien:

Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int nButWidth = 50;
  for (int nBoton = 0; nBoton < 3; nBoton ++)
  {
     TButton *Boton     = new TButton(Panel2);
     Boton->Parent      = Panel2;
     Boton->Caption     = IntToStr(nBoton);//slBotones->Strings[nBoton];
     Boton->Enabled     = true;
     Boton->Font->Style = TFontStyles() >> fsBold;
     Boton->Height      = 25;
     Boton->Left        = Panel2->Width - (3 - nBoton) * (nButWidth + 8);
     Boton->Tag         = nBoton + 1;
     Boton->Top         = 5;
     Boton->Visible     = true;
     Boton->Width       = nButWidth;
//     Boton->OnClick     = ButtonClick;
     SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) | BS_RIGHT);
  }
}


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

escafandra escribió:
Pues esto funciona bien:

Pues a mi no. El código me funciona unas veces sí y otras no; por ejemplo:



En todos los formularios tengo una llamada a una función que lo que hago es poner el escritorio que define el usuario. La función es así:
Código:
void ColorForm(TForm *Form)
{
     int nFondo, nPapel, nTinta, nWidth;
     TComponent *Source;

     nFondo = ColorFondo == 0 ? clWindow : (TColor)ColorFondo;
     nPapel = ColorPapel == 0 ? clWhite : (TColor)ColorPapel;
     nTinta = ColorTinta == 0 ? clBlack : (TColor)ColorTinta;

     Form->Icon          = Application->Icon;
     Form->Caption       = Application->Title;
     Form->Color         = nFondo;
     Form->Font->Color   = nTinta;
     Form->Font->Name    = FontName;
     Form->Font->Size    = FontSize;
     Form->PixelsPerInch = 96;

     for (int nCount = 0; nCount < Form->ComponentCount; nCount ++)
     {
          Source = Form->Components[nCount];

          if (Source->ClassNameIs("TButton"))
          {
               TButton *Boton = static_cast<TButton *>(Source);
               SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) | BS_LEFT);
               Boton->Repaint();
          }
          if (Source->ClassNameIs("TCGauge"))
          {
          etc.
     }
     Form->AutoSize = true;
}


En la primera imagen hago así la llamada:
Código:
__fastcall TfLogin::TfLogin(TComponent* Owner)
     : TForm(Owner)
{
     fPersona->Tag = 0;
     this->Timer1->Enabled = false;
     ColorForm(this);

     Memo1->Color       = clRed;
     Memo1->Font->Color = clWhite;
     Memo1->Font->Style = TFontStyles() << fsBold;
     Memo1->Lines->Clear();
     Memo1->Lines->Add("Recuerde: El sistema distingue");
     Memo1->Lines->Add("entre mayúsculas y minúsculas");

     Maquina->Text = getenv("COMPUTERNAME");
     this->AutoSize = true;
}


Pero en la segunda, como hasta que no se activa el formulario no sé como va a ser exactamente, lo hago así:
Código:
void __fastcall TfMensaje::FormActivate(TObject *Sender)
{
     int nButWidth, nWidth;

     nWidth = 0;
     for (int nLinea = 0; nLinea < slMensaje->Count; nLinea ++)
     {
          Label2->Caption = slMensaje->Strings[nLinea];
          nWidth = std::max(Label2->Width, nWidth);
     }

     this->Position = poDesigned;
     Label1->Caption = "";
     Label1->Width   = nWidth;
     Label1->Visible = slMensaje->Count < 3;
     Text1->Caption  = "";
     Text1->Width    = nWidth;
     Text1->Visible  = slMensaje->Count >= 3;
     if (slMensaje->Count < 3)
          Label1->Caption = slMensaje->Text.SubString(1, slMensaje->Text.LastDelimiter("\r") - 1);
     else
     {
          for (int nLinea = 0; nLinea < slMensaje->Count; nLinea ++)
               Text1->Caption = Text1->Caption + slMensaje->Strings[nLinea] + "\r\n";
          Text1->Caption = Text1->Caption.SubString(1, Text1->Caption.LastDelimiter("\r") - 1);
          Text1->Height = 19 * slMensaje->Count;
          Text1->Refresh();
     }

     nButWidth = 75;
     for (int nBoton = 0; nBoton < slBotones->Count; nBoton ++)
     {
          Label2->Caption = slBotones->Strings[nBoton];
          nButWidth = std::max(Label2->Width + 14, nButWidth);
     }

     if (Label1->Visible)
          this->Width = std::max((nButWidth + 8) * slBotones->Count + 8, Label1->Left + Label1->Width + 8) + 6;
     else
          this->Width = std::max((nButWidth + 8) * slBotones->Count + 8, Text1->Left + Text1->Width + 8) + 6;
     Panel1->Height = Text1->Visible ? Text1->Top + Text1->Height + Image1->Top : 2 * Image1->Top + Image1->Height;
     Panel1->Refresh();

     ColorForm(this);
     this->Label1->Color       = this->Panel1->Color;
     this->Label1->Font->Size  = FontSize;
     this->Label1->Font->Style = TFontStyles() >> fsBold;
     this->Text1->Color        = this->Panel1->Color;
     this->Text1->Font->Size   = FontSize;
     this->Text1->Font->Style  = TFontStyles() >> fsBold;
     this->Refresh();

     for (int nBoton = 0; nBoton < slBotones->Count; nBoton ++)
     {
          TButton *Boton     = new TButton(Panel2);
          Boton->Parent      = Panel2;
          Boton->Caption     = slBotones->Strings[nBoton];
          Boton->Enabled     = true;
          Boton->Font->Style = TFontStyles() >> fsBold;
          Boton->Height      = 25;
          Boton->Left        = Panel2->Width - (slBotones->Count - nBoton) * (nButWidth + 8);
          Boton->Tag         = nBoton + 1;
          Boton->Top         = 5;
          Boton->Visible     = true;
          Boton->Width       = nButWidth;
          SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) | BS_LEFT);
//          Boton->OnClick     = ButtonClick;
     }
     this->Position = poScreenCenter;
}

Además tal cual está, con el OnClick comentado, no me vale porque entonces el formulario no me responde. Y he probado cambiando la llamada a ColorForm y poniéndola detrás de la creación de los botones y tampoco lo hace.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:

Además tal cual está, con el OnClick comentado, no me vale porque entonces el formulario no me responde.


Claro, lo comente para hacer una prueba basada en tu código y no implementar el OnCkilc Very Happy

Date cuenta que cuando añadimos estilos con un "or" binario, no eliminamos información previa contenida en el estilo. Para ello hay que hacer un "and not"

Código:

  TComponent *Source;
  DWORD NoStyle = BS_LEFT | BS_CENTER | BS_RIGHT;
  for(int nCount = 0; nCount < Form->ComponentCount; nCount ++){
    Source = Form->Components[nCount];
    if(Source->ClassNameIs("TButton")){
      TButton *Boton = static_cast<TButton *>(Source);
      if(Boton){
        DWORD S = GetWindowLong(Boton->Handle, GWL_STYLE);
        SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) & ~NoStyle | BS_LEFT);
        Boton->Repaint();
      }
    }
  }


Si quieres actuar sobre loe estilos "verticales", debes eliminarlos con una técnica similar
Código:
DWORD NoStyle = BS_TOP | BS_VCENTER | BS_BOTTOM;



Te paso el código que escribí para el ejemplo inicial en mi primera respuesta, así te haces una mejor idea:
Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Check_MultilineClick(TObject *Sender)
{
  DWORD Style = 0;
  DWORD NoStyle = BS_MULTILINE;

  if(Check_Multiline->Checked){
    Button1->Caption = "Esto es un ejemplo de un botón con texto multilínea que se alinea en diferentes puntos";
    Style = BS_MULTILINE;
  } else
    Button1->Caption = "BOTÓN";


  SetWindowLong(Button1->Handle, GWL_STYLE, GetWindowLong(Button1->Handle, GWL_STYLE) & ~NoStyle | Style);
  Button1->Repaint();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RadioHorizontalClick(TObject *Sender)
{
  DWORD Style = 0;
  DWORD NoStyle = BS_LEFT | BS_CENTER | BS_RIGHT;

  if(RadioHorizontal->ItemIndex == 0)      Style = BS_LEFT;
  else if(RadioHorizontal->ItemIndex == 1) Style = BS_CENTER;
  else if(RadioHorizontal->ItemIndex == 2) Style = BS_RIGHT;

  SetWindowLong(Button1->Handle, GWL_STYLE, GetWindowLong(Button1->Handle, GWL_STYLE) & ~NoStyle | Style);
  Button1->Repaint();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RadioVerticalClick(TObject *Sender)
{
  DWORD Style = 0;
  DWORD NoStyle = BS_TOP | BS_VCENTER | BS_BOTTOM;

  if(RadioVertical->ItemIndex == 0)    Style = BS_TOP;
  else if(RadioVertical->ItemIndex == 1) Style = BS_VCENTER;
  else if(RadioVertical->ItemIndex == 2) Style = BS_BOTTOM;

  SetWindowLong(Button1->Handle, GWL_STYLE, GetWindowLong(Button1->Handle, GWL_STYLE) & ~NoStyle | Style);
  Button1->Repaint();
}
//---------------------------------------------------------------------------


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias. Lo probaré.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Pues sigue haciendo lo mismo: Unas veces si alinea el texto a la izquiera y otras lo deja centrado.


La imagen de arriba es el formulario en el que se crean los botones dinámicamente y la de bajo los tiene definidos desde el diseño (el botón de la izquierda es un TBitBtn, pero veo que tampoco funciona).

Ahora tengo puesto así el código:
Código:
DWORD NoStyle = BS_LEFT | BS_CENTER | BS_RIGHT;

for (int nCount = 0; nCount < Form->ComponentCount; nCount ++)
{
     Source = Form->Components[nCount];

     if (Source->ClassNameIs("TBitBtn"))
     {
          TButton *BitBtn = static_cast<TBitBtn *>(Source);
          SetWindowLong(BitBtn->Handle, GWL_STYLE, GetWindowLong(BitBtn->Handle, GWL_STYLE) & ~NoStyle | BS_LEFT);
          BitBtn->Repaint();
     }
     if (Source->ClassNameIs("TButton"))
     {
          TButton *Boton = static_cast<TButton *>(Source);
          SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) & ~NoStyle | BS_LEFT);
          Boton->Repaint();
     }
     etc.
}

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

El truco no funciona con TBitBtn puesto que ese botón no es estándar y es redibujado. Si quieres ajustar esos botones tendrás que crearte uno derivado y completar tu método de redibujado para alinear el texto a tu gusto.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

escafandra escribió:
El truco no funciona con TBitBtn puesto que ese botón no es estándar y es redibujado. Si quieres ajustar esos botones tendrás que crearte uno derivado y completar tu método de redibujado para alinear el texto a tu gusto.

Saludos.

Vale, pero en la imagen de arriba de mi mensaje anterior lo que hay son tres TButton.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

No consigo reproducir tu error.

Mira este ejemplo creando dinámicamente tres botones:

Código:

// Crear tres botones
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int nBtuton = 3;
  int bWidth = 90;
  int Left = (Width - nBtuton*(bWidth + 8))/2;

  for(int n=0; n<nBtuton; n++){
    TButton *Boton = new TButton(this);
    Boton->Parent  = this;
    Boton->Caption = "Botón " + IntToStr(n);
    Boton->Width   = bWidth;
    Boton->Left    = Left + n*(bWidth + 8);
    Boton->Top     = 8;
  }

}
//---------------------------------------------------------------------------
// Alinear a la izquierda el texto de TODOS los botones
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  DWORD NoStyle = BS_LEFT | BS_CENTER | BS_RIGHT;
  TComponent *Source;
  for(int nCount = 0; nCount < ComponentCount; nCount ++){
    Source = Components[nCount];
    if(Source->ClassNameIs("TButton")){
      TButton *Boton = static_cast<TButton *>(Source);
      SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) & ~NoStyle | BS_LEFT);
      Boton->Repaint();
    }
  }
}


Si los creo y alineo todo seguido, también funciona




Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Algo tengo que estar haciendo mal. Con este código:
Código:
for (int nBoton = 0; nBoton < slBotones->Count; nBoton ++)
{
     TButton *Boton     = new TButton(Panel2);
     Boton->Parent      = Panel2;
     Boton->Caption     = slBotones->Strings[nBoton];
     Boton->Enabled     = true;
     Boton->Font->Style = TFontStyles() >> fsBold;
     Boton->Height      = 25;
     Boton->Left        = Panel2->Width - (slBotones->Count - nBoton) * (nButWidth + 8);
     Boton->Name        = "Boton" + IntToStr(nBoton + 1);
     Boton->Tag         = nBoton + 1;
     Boton->Top         = 5;
     Boton->Visible     = true;
     Boton->Width       = nButWidth;
     Boton->OnClick     = ButtonClick;
}

for (int nCount = 0; nCount < this->Panel2->ComponentCount; nCount ++)
{
     Source = this->Panel2->Components[nCount];
     if (Source->ClassNameIs("TButton"))
     {
          TButton *Boton = static_cast<TButton *>(Source);
          SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) & ~NoStyle | BS_LEFT);
          Boton->Repaint();
     }
}
this->Refresh();
this->Position = poScreenCenter;

Ahora mismo sale esto. Y he probado poniendo el código del SetWindowLong dentro del bucle de creación de los botones y da lo mismo.


Empiezo a pensar que debo tener algo por ahí que me trastoca el tema gráfico. Tendré que ver que hay en los formularios que lo hacen bien que no esté en los otros o viceversa.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:
Algo tengo que estar haciendo mal. Con este código...


Prueba a cambiar Components por Controls

Código:
for (int nCount = 0; nCount < this->Panel2->ControlCount; nCount ++)
{
     Source = this->Panel2->Controls[nCount];
     if (Source->ClassNameIs("TButton"))
     {
          TButton *Boton = static_cast<TButton *>(Source);
          SetWindowLong(Boton->Handle, GWL_STYLE, GetWindowLong(Boton->Handle, GWL_STYLE) & ~NoStyle | BS_LEFT);
          Boton->Repaint();
     }
}


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.