| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 24 Nov, 2017 11:59 am Asunto: Buscando una filigrana gráfica |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 24 Nov, 2017 4:54 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 29 Nov, 2017 6:45 pm Asunto: |
|
|
| 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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 29 Nov, 2017 10:47 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 30 Nov, 2017 10:32 am Asunto: |
|
|
| 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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 30 Nov, 2017 1:22 pm Asunto: |
|
|
| 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
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Sab 23 Dic, 2017 11:05 am Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Dom 31 Dic, 2017 2:33 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 03 Ene, 2018 12:34 pm Asunto: |
|
|
| 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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 04 Ene, 2018 12:53 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 05 Ene, 2018 1:48 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 26 Ene, 2018 10:41 pm Asunto: |
|
|
| 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 |
|
 |
|