Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-03-2024
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Para conseguir que un ComboBox estilo csOwnerDrawFixed escriba el Texto cuando su ItemIndex es -1, es decir, cuando no se ha elegido ninguna opción, podemos realizar un SubClassing y manejar el mensaje WM_PAINT.

Dado que la propiedad Text del ComboBox queda inhabilitada, en el ejemplo uso el Tag para almacenar un puntero char pero el texto se puede manejar como se quiera, siempre y cuando la función CBProc que va a tratar el Mensaje WM_PAINT tenga acceso a él.

Nótese que el tratamiento de WM_PAINT se realiza con API y no con VCL, esto es debido a que WM_PAINT empieza a ser llamado antes de que el Canvas del ComboBox esté operativo.

Muestro un ejemplo completo de un formulario con un ComboBox.


Este sería el archivo.h

Código PHP:
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
  
TComboBox *ComboBox1;
  
void __fastcall ComboBox1DrawItem(TWinControl *Controlint Index,
          
TRect &RectTOwnerDrawState State);
private:
  
TWndMethod OldCBProc;
  
void __fastcall CBProc(TMessageMessage);

public:        
// User declarations
  
__fastcall TForm1(TComponentOwner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif 


Este sería el archivo.cpp

Código PHP:
// Realiza un SubClassing sobre un TWinControl
void __fastcall SetSubClass(TWinControl *WCTWndMethod newProcTWndMethod *oldProc)
{
  *
oldProc WC->WindowProc;
  
WC->WindowProc newProc;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
  : 
TForm(Owner)
{
  
// Realizamos el SubClassing
  
SetSubClass(ComboBox1CBProc, &OldCBProc);
   
// Guardamos el Texto en el Tag
  
ComboBox1->Tag = (LONG_PTR)"Elija una Opción";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Controlint Index,
      
TRect &RectTOwnerDrawState State)
{
  
TComboBox *CB dynamic_cast<TComboBox*>(Control);
  if(
CB){
    
Rect.Right -= GetSystemMetrics(SM_CXVSCROLL);
    
SetTextAlign(CB->Canvas->HandleTA_CENTER);
    
CB->Canvas->TextOut(Rect.Right/2Rect.Top + (CB->ItemHeight CB->Font->Height)/2CB->Items->Strings[Index]);
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CBProc(TMessageMessage)
{
  
OldCBProc(Message);  // Permitimos que primero se traten por defecto todos los mensajes 
    // Tratamos nuestro WM_PAINT
  
if((Message.Msg == WM_PAINT || Message.Msg == WM_SETFOCUS) && ComboBox1->ItemIndex 0){
    
// Preparamos el Texto
    
char *Text = (char*)ComboBox1->Tag;
    
// Preparamos el rectángulo apropiado
    
TRect Rect ComboBox1->ClientRect;
    
InflateRect(&Rect, -2, -2);
    
Rect.Right -= GetSystemMetrics(SM_CXVSCROLL); // Para salvar el botón del ComboBox

    //Preparamos un HDC con la fuente del ComboBox y seleccionamos la alineación al centro
    
HDC hDC GetDC(ComboBox1->Handle);
    
SelectObject(hDCComboBox1->Font->Handle);
    
TEXTMETRIC Metric;
    
GetTextMetrics(hDC, &Metric);
    
FillRect(hDC, &RectGetSysColorBrush(COLOR_WINDOW));
    
SetTextAlign(hDCTA_CENTER);
       
// Escribimos Text centrado
    
ExtTextOut(hDCRect.Right/2, (Rect.Bottom Metric.tmHeight)/1ETO_CLIPPED, &RectTextstrlen(Text), 0);
   
    
// Liberamos el HDC
    
ReleaseDC(hDCComboBox1->Handle);
  }

Espero que esto responda a tu pregunta.


Saludos.

Última edición por escafandra fecha: 02-03-2024 a las 23:07:55.
Responder Con Cita
  #2  
Antiguo 03-03-2024
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ajustando un poco ComboBox1DrawItem para que centre bien la opción elegida al dibujarla en la zona EDIT del ComboBox:


Código PHP:
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Controlint Index,
      
TRect &RectTOwnerDrawState State)
{
  
TComboBox *CB dynamic_cast<TComboBox*>(Control);
  if(
CB){
    
CB->Canvas->FillRect(Rect);
    if(!
State.Contains(odComboBoxEdit))
      
Rect.Right -= GetSystemMetrics(SM_CXVSCROLL);
    
SetTextAlign(CB->Canvas->HandleTA_CENTER);
    
CB->Canvas->TextOut(Rect.Right/2Rect.Top + (CB->ItemHeight CB->Font->Height)/2CB->Items->Strings[Index]);
  }


El ajuste con GetSystemMetrics(SM_CXVSCROLL) es para que al desplegar el ComboBox no de la sensación de incoherencia en el centrado entre Items y la zona EDIT.


Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Manejo de excepciones de base datos sql con c++builder6 michal C++ Builder 1 06-09-2017 09:58:06
Dudas con TDBGrid FrianxD C++ Builder 4 05-10-2008 20:26:54
dudas para editar en TDBGrid pborges36 Conexión con bases de datos 6 22-08-2008 15:08:09
Combobox con checkbox en Delphi7 o Builder6?? hexman23 Varios 1 18-05-2007 21:31:40
TComboBox calogero Varios 5 19-01-2007 17:20:20


La franja horaria es GMT +2. Ahora son las 05:02:52.


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
Copyright 1996-2007 Club Delphi