 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 26 Nov, 2004 5:59 pm Asunto: Captura de WM_DRAWITEM |
|
|
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,
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
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 _________________
 |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 26 Nov, 2004 6:21 pm Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 26 Nov, 2004 6:24 pm Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 30 Nov, 2004 1:47 am Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 30 Nov, 2004 11:35 pm Asunto: |
|
|
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.. _________________

Ultima edición por Cesar C. Salazar Gonzalez el Mar 23 Ene, 2007 5:45 pm, editado 2 veces |
|
| Volver arriba |
|
 |
_Willa Capt


Registrado: 28 Ago 2002Mensajes: 169Ubicación: Madrid ( España )
|
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 03 Dic, 2004 5:43 pm Asunto: |
|
|
Gracias, claro que me sirve.. saludos _________________
 |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|