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 

Captura de WM_DRAWITEM

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Captura de WM_DRAWITEM Responder citando

Bien, intentando hacer el MENU XP, me he dado cuenta, existe una manera de hacerlo, (como segunda opcion), y estoy tratando de capturar
el mensaje WM_DRAWITEM, que es cuando se dibuja, el menu, para reasignar, los eventos OnDrawItem,

hasta el momento, solo tengo esta parte, ya que no encuentro, una manera clara, de hacerlo..


Código:
private:   // User declarations
//WM_DRAWITEM vamos hacerl con mesnajes de windows
void __fastcall DrawItemCes(TCMFocusChanged& Msg){
    Caption =  (Msg.Sender)->ClassName();

//    TMenuItem *ces = dynamic_cast<TMenuItem *>(Msg.WParam);
//    ces->OnDrawItem = DrawItemXPCES;
    inherited::Dispatch(&Msg);
}
BEGIN_MESSAGE_MAP
//    VCL_MESSAGE_HANDLER(WM_DRAWITEM, TMessage, DrawItemCes);
//    MESSAGE_HANDLER(MYWM_NOTIFY, TMessage, MyNotify);
    MESSAGE_HANDLER(CM_FOCUSCHANGED, TCMFocusChanged,DrawItemCes)
END_MESSAGE_MAP(inherited)


alguien tiene una idea de como puedo capturarlo o si me falta otro mensaje, que deba capturar, esto esta en prueba, ya que el codigo, que tengo funciona perfectamente bien, para los Items, del menu, pero no para los Items, que estan como comandos del menu, es decir,
si tengo el menu,
Idea Archivo
--------
abir
cerrar
etc

la vista, se cambia, perfectamente, en abrir, cerrar, etc, pero en la parte de archivo, no realiza, nada, esto es para no hacerlo, de la manera en que estamos haciendolo conjuntamente, con _Willa
ya que al introducir, un Tmemo, o un RichEdit, los menus, se descuadran, quedando recortados, de la siguiente manera

Idea Archi
--------
abir
cerrar
etc

el icono, es para indicar que el menu tiene una imagen.. que tampoco sale..
saludos

algo de Orientacion...
_LEO tendras una idea
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Es que es eso precisamente lo que hace el Builder, al recibir el mensaje WM_DRAWITEM dispara OnDrawItem y al recibir WM_MEASUREITEM el OnMeasureItem.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Entonces quiere decir, que debo capturar los 2 mensajes, para ver si puedo meter, dentro ellos, las funciones, para redibujar, los menus y hacerlos un poco mas rapidos..

gracias..

ahora, si tengo mas idea..

si encuentro un ejemplo, lo pongo, gracias..

o si alguien los ha capturado, tambien es valido..

saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

quiero morir!!!!!
como detecto antes que se dibuje el menu... no puedo, en que mensaje, le doy, ya probe muchos codigos, y siempre se dibujan el menu antes, que lo pueda detener..


el codigo, funciona perfectamente para los elementos, del menu, pero no para el que aparece en la barra de menu.
es decir
Archivo
--------
abrir
cerrar
etc

en abrir, cerrar y etc, se dibuja perfectamente bien, pero en archivo, me lo deja tal y cual, lo que no quiero, es meterlo en el evento
Archivo1DrawItem(etc, etc), quiero hacerlo al momento que windows dibuje, el menu..

saludos, ejem ejem, espero ideas..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Bien, la solucion ha quedado de la siguiente manera, aun con el detalle del LLenado cuando existe un Memo o un RichEdit, ya que al parecer windows, no permite, realizar este tipo de menus, cuando existe, un TMemo o un TRichEdit, ya que elimina, las imagenes, contenidas dentro del menu..

espero que todos les sirva y puedan implementarlo

saludos.. si todo funciona correctamente, lo llevaremos a Trucos y Tips.

saludos..

Archivo .h
Código:

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes>
#include <Controls>
#include <StdCtrls>
#include <Forms>
#include <Menus>
#include <ImgList>
#include <ComCtrls>
#include <memory>

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
    TMainMenu *MainMenu1;
    TPopupMenu *PopupMenu1;
    TMenuItem *Archiv1;
    TMenuItem *Salir1;
    TMenuItem *nuevo1;
    TMenuItem *N1;
    TMenuItem *nuevo21;
    TMenuItem *menugrande1;
    TMenuItem *menuchi1;
    TMenuItem *otraopcion1;
    TMenuItem *otraopcion21;
    TMenuItem *opc11;
    TMenuItem *opc21;
    TMenuItem *opc31;
    TMenuItem *opc211;
    TMenuItem *opc221;
    TMenuItem *N2;
    TMenuItem *N3;
    TMenuItem *N4;
    TMenuItem *opc231;
    TMenuItem *hola1;
    TMenuItem *como1;
    TMenuItem *estas1;
    TImageList *ImageList1;
    TMenuItem *copiar1;
    TMenuItem *pegar1;
    TMenuItem *nose1;
    TMenuItem *SELECION1;
    TMenuItem *OTRASELECCION1;
    TMenuItem *Ayuda1;
//----
    void __fastcall DrawItemXPCES(TObject* Sender, TCanvas* ACanvas,const TRect &ARect, bool Selected);
    void __fastcall EstiloXPCES(TForm *FormXPCES);
    void __fastcall MeasureItemXPCES(TObject *Sender,TCanvas *ACanvas, int &Width, int &Height);
private:   // User declarations
public:      // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


archivo .cpp
Código:

//CODIGO PARA EL MENU TIPO XP. REALIAZADO POR
// CESAR. CUAUHTEMOC SALAZAR GONZALEZ.
// 25/11/2004
//---------------------------------------------------------------------------
#include <vcl>
#include <Systobj> // para el menu TObjet Sender
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 EstiloXPCES(this);
}
//--------------------------EstiloXPCES-----------------------------------------
//funcion para asigar los eventos de los menus
// tanto para OnDrawItem, OnMeasuerItem
//------------------------------------------------------------------------------
void __fastcall TForm1::EstiloXPCES(TForm *FormXPCES){
// variables para el estilo
// buscar los menus dentro del form
// si hay un menu, reasignamos los eventos
// a las nuevas funciones.. opcion a los demas botones...
    for (int iCC = 0; iCC <FormXPCES>ComponentCount-1; iCC++){
        if( FormXPCES->Components[iCC]->InheritsFrom(__classid(TMenuItem))){
            TMenuItem *MenuItem = dynamic_cast<TMenuItem>(FormXPCES->Components[iCC]);
            MenuItem->OnDrawItem = DrawItemXPCES;
            MenuItem->OnMeasureItem = MeasureItemXPCES;
            if(MenuItem->Count > 0){
                for(int i=0; i <MenuItem>Count-1; i++){
                    MenuItem->Items[i]->OnDrawItem = DrawItemXPCES;
                    MenuItem->Items[i]->OnMeasureItem = MeasureItemXPCES;
                    if(MenuItem->Items[i]->Count > 0){
                        for(int x=0; x <MenuItem>Items[i]->Count-1; x++){
                            MenuItem->Items[i]->Items[x]->OnDrawItem = DrawItemXPCES;
                            MenuItem->Items[i]->Items[x]->OnMeasureItem = MeasureItemXPCES;
                        }
                    }
                }
            }


        }
    }
}
//-----------------------------OnDrawItemXPCES----------------------------------
void __fastcall TForm1::DrawItemXPCES(TObject* Sender, TCanvas* ACanvas,const TRect &ARect, bool Selected)
{
    AnsiString Txt;
    Graphics::TBitmap *B; // = new Graphics::TBitmap();
    TRect IConRect, TextRect;
    TColor FBackColor, FIconBackColor, FSelectedBkColor;
    TColor FFontColor, FSelectedFontColor,FDisabledFontColor, FSeparatorColor, FCheckedColor ;

    TCanvas *CanvasTmp;
    TRect RectTmp;
    TColor c1,c2;
    int Rf,Gf,Bf;
    int Rd,Gd,Bd;
    int cR, cG, cB;
    float nTonos;
    float incremento ;
    //-------------------
    int i, X1, X2;
    int TextFormat;
    bool HasImgLstBitmap;
    TMenuItem  *FMenuItem = ((TMenuItem*)Sender);
    TMenu *FMenu = FMenuItem->Parent->GetParentMenu();
    //----------------------fin de la variables-----------------------
    FIconBackColor        = (TColor) 0x00d7dcdf; // color icono barra CESAR
    FBackColor            = (TColor) 0x00F7F8F9; //color fondo CESAR
    FSelectedBkColor      = (TColor) 0x00d2bdb6; // Color barra Seleccion CESAR
    FFontColor            = clBlack;   // LETRA SIN SELECCIONAR
    FSelectedFontColor    = clNavy; // letra seleccionada
    FDisabledFontColor    = clGray; //ESTADO DESHABILITADO..
    FSeparatorColor       = clGray ; //color separador
    FCheckedColor         = clGray; // DESHABILITADO CON CHECKED
//--------------------------
    ACanvas->Brush->Color = FBackColor;
    ACanvas->FillRect(ARect);

//--------------
    if (FMenu->IsRightToLeft()){
      X1 = ARect.Right-20;
      X2 = ARect.Right;
    }else{
      X1 = ARect.Left;
      X2 = ARect.Left + 20;
    }
//--------------
    // RECTANGULO DEL MENU.. ES DECIR EL TEXTO
    TextRect = ARect;
    // RECTANGULO DEL MENU.. ES DECIR EL ICONO
    IConRect = Rect(X1, ARect.Top, X2, ARect.Bottom);
//-------------- PINTA LA ZONA BLANCA DE FONDO
    Txt = " " + FMenuItem->Caption;
    B = new Graphics::TBitmap();
    B->Transparent = True;
    B->TransparentMode = tmAuto;
    HasImgLstBitmap = false;
    if ((FMenuItem->Parent->GetParentMenu()->Images != NULL) || (FMenuItem->Parent->SubMenuImages != NULL)){
        if (FMenuItem->ImageIndex != -1)
            HasImgLstBitmap = true;
        else
            HasImgLstBitmap = false;
    }
//------------------------------
    if (HasImgLstBitmap){
         if (FMenuItem->Parent->SubMenuImages != NULL)
            FMenuItem->Parent->SubMenuImages->GetBitmap(FMenuItem->ImageIndex, B);
         else
            FMenuItem->Parent->GetParentMenu()->Images->GetBitmap(FMenuItem->ImageIndex, B);

    }else{
        if (FMenuItem->Bitmap->Width > 0)
            B->Assign((Graphics::TBitmap*)FMenuItem->Bitmap);
    }
//---------------------------------
    if (FMenu->IsRightToLeft()){
        X1 = ARect.Left;
        X2 = ARect.Right-25;
    }else{
        X1 = ARect.Left+25;
        X2 = ARect.Right;
    }
//---------------------------------
    TextRect = Rect(X1, ARect.Top, X2, ARect.Bottom);
    ACanvas->Pen->Color   = FBackColor;
    ACanvas->Brush->Color = FBackColor;
    ACanvas->FillRect(TextRect);

//--------------
   TColor FSelectedBkColor2 = FBackColor;
    bool bPasa=false;
    if(FMenu->InheritsFrom(__classid(TMainMenu))){
        for(int  i=0; i<FMenuItem>GetParentMenu()->Items->Count;i++){
            if( FMenuItem->GetParentMenu()->Items[i].Parent ){
                ACanvas->Brush->Color = FBackColor;
                ACanvas->FillRect(ARect);
                if (FMenuItem->ImageIndex > -1 && FMenuItem->Bitmap->Width <0>FillRect(TextRect);
                    bPasa=true;
                    break;
                }
            }
        }
    }
//--------------
    if (bPasa){
        ACanvas->Brush->Color = FSelectedBkColor2;// FIconBackColor;
        ACanvas->FillRect(IConRect);
    }
//--------------  PINTA EL DEGRADADO
        ACanvas->Brush->Color = FIconBackColor; //cesar
        ACanvas->Brush->Color = FBackColor; //cesar
        RectTmp = IConRect; // para pintar el degradado
        ACanvas->FillRect(RectTmp);
        // LADO DERECHO
        c2 = static_cast<TColor>( ColorToRGB((TColor) 0x00d2bdb6) );
        c1 = static_cast<TColor>( ColorToRGB((TColor) 0x00F7F8F9) );
        Rf = GetRValue(c1);
        Gf = GetGValue(c1);
        Bf = GetBValue(c1);
        Rd = GetRValue(c2)-Rf;
        Gd = GetGValue(c2)-Gf;
        Bd = GetBValue(c2)-Bf;
        nTonos = 750;
        incremento = incremento = (float) nTonos / RectTmp.Width();
        for (int i=RectTmp.Left; i<RectTmp>Brush->Color = (TColor) RGB(cR, cG, cB);
            ACanvas->Pen->Color   = (TColor) RGB(cR, cG, cB);
            ACanvas->MoveTo(RectTmp.left+i, RectTmp.top);
            ACanvas->LineTo(RectTmp.left+i, RectTmp.Bottom);
        }

//-------------- PINTA LA BARRA DE SELEECION
    if (FMenuItem->Enabled)
        ACanvas->Font->Color = FFontColor;
    else
        ACanvas->Font->Color = FDisabledFontColor;
//--------------
    if (Selected){
        TRect Barra = TextRect;
        Barra.Left -= 25;
        ACanvas->Brush->Style = bsSolid;
        ACanvas->Brush->Color = FSelectedBkColor;
        ACanvas->FillRect(Barra);
        ACanvas->Pen->Color   = FSelectedFontColor;
        ACanvas->Brush->Color = FSelectedBkColor;
        ACanvas->Brush->Style = bsClear;
        ACanvas->RoundRect(Barra.Left, Barra.top, Barra.Right,Barra.Bottom, 5, 5);
        if (FMenuItem->Enabled){
            ACanvas->Brush->Color = FSelectedBkColor;
            ACanvas->Brush->Style = bsSolid;
            ACanvas->Font->Color = FSelectedFontColor;
        }
    }
//-------------- PINTA LA IMAGEN DEL CHECKED
    X1 = IConRect.Left + 2;
//--------------
    if (B !=NULL)
        ACanvas->Draw(X1, IConRect.top + 2, B);
//--------------
    if (FMenuItem->Checked){
        ACanvas->Pen->Color = FCheckedColor;
        ACanvas->Brush->Style = bsClear;
        ACanvas->RoundRect(IConRect.Left, IConRect.top, IConRect.Right,IConRect.Bottom, 5, 5);
     // CUANDO ESTA SELECCIONADO O NO, UN CHECKED
        ACanvas->TextOutA(IConRect.Left+8, IConRect.top+1,"»");
     }
//--------------LINEA DE SEPARACION DE MENU
    if (!FMenuItem->IsLine()){
        SetBkMode(ACanvas->Handle, TRANSPARENT);
// ESTABLECER LA FUENTE DEL TEXTO.
        ACanvas->Font->Name = "Arial";
        //--------------
        if (FMenu->IsRightToLeft()){
            ACanvas->Font->Charset = ARABIC_CHARSET;
            TextFormat = DT_RIGHT + DT_RTLREADING;
        }else
            TextFormat = 0;
        //--------------
        if (FMenuItem->Default){
              TextRect.Left++;
              TextRect.Right++;
              TextRect.Top++;
              ACanvas->Font->Color = clGray;
              DrawTextEx(ACanvas->Handle,Txt.c_str(),Txt.Length(),&TextRect, TextFormat, NULL);
              TextRect.Left--;
              TextRect.Right--;
              TextRect.Top--;
              ACanvas->Font->Color = FFontColor;
        }
        //--------------
        DrawTextEx(ACanvas->Handle,Txt.c_str(),Txt.Length(),&TextRect, TextFormat, NULL);
        Txt = ShortCutToText(FMenuItem->ShortCut) +  " ";
        //--------------
        if (FMenu->IsRightToLeft())
            TextFormat = DT_LEFT;
        else
            TextFormat = DT_RIGHT;
        //--------------
        DrawTextEx(ACanvas->Handle,Txt.c_str(),Txt.Length(),&TextRect, TextFormat, NULL);
    }else{
        ACanvas->Pen->Color = FSeparatorColor;
        ACanvas->MoveTo(ARect.Left + 26,TextRect.Top +int((TextRect.Bottom - TextRect.Top) / 2));
        ACanvas->LineTo(ARect.Right - 2,TextRect.Top +int((TextRect.Bottom - TextRect.Top) / 2));
    }
//----------------------------------------------
    delete B;

}
//-----------------------------MeasureItemXPCES---------------------------------

void __fastcall TForm1::MeasureItemXPCES(TObject *Sender,TCanvas *ACanvas, int &Width, int &Height){
    Width+=20;
}


este menu dibuja, una barra degradada, dentro del menu. asi, que espero que lo puedan usar,

ojo. los componentes dentro del Form, son
Menu, ImagenList y un PopMenu..

Saludos...
Gracias _Willa, por intentar conmigo hacerlo.. saludos..
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Mar 23 Ene, 2007 5:45 pm, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Cesar,

He estado buscando me he encontrado con la siguiente información

http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vccore/html/vcconreflectedwindowmessageids.asp

Espero que te sirva.
_________________
Saludos
~~~~~~~~
Wink _Willa
~~~~~~~~
www.avancegame.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Gracias, claro que me sirve.. saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
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.