Lineas, circulos y otros dibujos

16/04/2004 - 13:23 por Sergio | Informe spam
Tengo que hacer una serie de dibujos sobre un formulario, y necesito que
esos dibujos sean "editables", es decir, que pueda cojerlos en un
momento dado y borrarlos, cambiarles el tamaño, arrastrarlos hasta otra
posición... como el editor de formularios del visual studio.

Había pensado en hacerme una nueva clase, que derive de CWnd, aprovechar
su funcionalidad, y añadirle la mía propia. Pero no se muy bien como
hacerlo.
He empezado por derivar OnDrawItem, para que muestre una linea, pero no
se como hacer que haga la llamada a OnDrawItem.

Si alguien me puede proporcionar información, o sabe donde puedo
encontrarla estaria muy agradecido.

Preguntas similare

Leer las respuestas

#1 Eduardo Sobrino MVP
18/04/2004 - 16:23 | Informe spam
Sergio:

"OnDrawItem" se ejecuta en eventos relacionados a un "Item" como un
"MenuItem", un boton, otros y no es uno de los eventos de "CWnd". Para
refrescar el contenido de una ventana en la clase de "CWnd" redefine
"RefreshWindow(...)". Como sabes si invalidas la ventana (invocando
"Invalidate(...)") refrescaras la ventana.

Por otro lado "CWnd" es una envoltura ("Wrapper Class") alrededor de una
ventana de "Windows". Otras classes como "CFramwWnd" que se derivan de
"CWnd" y añaden un bonche de funcionalidad adicional.

Eduardo Sobrino, MVP


"Sergio" wrote in message
news:
Tengo que hacer una serie de dibujos sobre un formulario, y necesito que
esos dibujos sean "editables", es decir, que pueda cojerlos en un
momento dado y borrarlos, cambiarles el tamaño, arrastrarlos hasta otra
posición... como el editor de formularios del visual studio.

Había pensado en hacerme una nueva clase, que derive de CWnd, aprovechar
su funcionalidad, y añadirle la mía propia. Pero no se muy bien como
hacerlo.
He empezado por derivar OnDrawItem, para que muestre una linea, pero no
se como hacer que haga la llamada a OnDrawItem.

Si alguien me puede proporcionar información, o sabe donde puedo
encontrarla estaria muy agradecido.
Respuesta Responder a este mensaje
#2 Sergio
19/04/2004 - 08:30 | Informe spam
Eduardo Sobrino MVP escribió:
Sergio:

"OnDrawItem" se ejecuta en eventos relacionados a un "Item" como un
"MenuItem", un boton, otros y no es uno de los eventos de "CWnd". Para
refrescar el contenido de una ventana en la clase de "CWnd" redefine
"RefreshWindow(...)". Como sabes si invalidas la ventana (invocando
"Invalidate(...)") refrescaras la ventana.

Por otro lado "CWnd" es una envoltura ("Wrapper Class") alrededor de una
ventana de "Windows". Otras classes como "CFramwWnd" que se derivan de
"CWnd" y añaden un bonche de funcionalidad adicional.

Eduardo Sobrino, MVP



Y como redefino RefreshWindow()? Es una función que no he encontrado
por ningún lado.
Respuesta Responder a este mensaje
#3 Eduardo Sobrino MVP
20/04/2004 - 01:50 | Informe spam
No es "RefreshWindow" sino "RedrawWindow" (sorry). Aqui te envio un ejemplo
que escribi y probe para que veas:

-

class MiVentana : public CWnd
{
DECLARE_DYNAMIC(MiVentana)
public:
MiVentana();
virtual ~MiVentana();

BOOL RedrawWindow(
LPCRECT lpRectUpdate = NULL,
CRgn* prgnUpdate = NULL,
UINT flags = RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
)
{
CWnd::RedrawWindow(lpRectUpdate,prgnUpdate,flags) ;
// TODO: Pon tu codigo aqui.
return TRUE;
}

protected:
DECLARE_MESSAGE_MAP()
};

-

// use algo parecido a esto para probar el codigo (no incluyo el codigo de
CTestDrawWinDlg el que es simple
// mente una forma con dos botones Button1 y Button2.

MiVentana *pMiVentana = 0;
void CTestDrawWinDlg::OnBnClickedButton1()
{
if (pMiVentana) return ;
pMiVentana = new MiVentana();
pMiVentana->Create(_T("STATIC"), "Hola", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 200, 20), this, 1234);
pMiVentana->ShowWindow(SW_SHOW);
// pMiVentana->RedrawWindow();
}
void CTestDrawWinDlg::OnBnClickedButton2()
{
if (pMiVentana)
pMiVentana->RedrawWindow();
}
-


Dejame saber si tienes problemas.

Eduardo Sobrino, MVP



"Sergio" wrote in message
news:%
Eduardo Sobrino MVP escribió:
> Sergio:
>
> "OnDrawItem" se ejecuta en eventos relacionados a un "Item" como un
> "MenuItem", un boton, otros y no es uno de los eventos de "CWnd". Para
> refrescar el contenido de una ventana en la clase de "CWnd" redefine
> "RefreshWindow(...)". Como sabes si invalidas la ventana (invocando
> "Invalidate(...)") refrescaras la ventana.
>
> Por otro lado "CWnd" es una envoltura ("Wrapper Class") alrededor de una
> ventana de "Windows". Otras classes como "CFramwWnd" que se derivan de
> "CWnd" y añaden un bonche de funcionalidad adicional.
>
> Eduardo Sobrino, MVP

Y como redefino RefreshWindow()? Es una función que no he encontrado
por ningún lado.
Respuesta Responder a este mensaje
#4 Eduardo Sobrino MVP
20/04/2004 - 01:52 | Informe spam
No es "RefreshWindow" sino "RedrawWindow" (sorry). Aqui te envio un ejemplo
que escribi y probe para que veas:

-

class MiVentana : public CWnd
{
DECLARE_DYNAMIC(MiVentana)
public:
MiVentana();
virtual ~MiVentana();

BOOL RedrawWindow(
LPCRECT lpRectUpdate = NULL,
CRgn* prgnUpdate = NULL,
UINT flags = RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
)
{
CWnd::RedrawWindow(lpRectUpdate,prgnUpdate,flags) ;
// TODO: Pon tu codigo aqui.
return TRUE;
}

protected:
DECLARE_MESSAGE_MAP()
};

-

// use algo parecido a esto para probar el codigo (no incluyo el codigo de
CTestDrawWinDlg el que es simple
// mente una forma con dos botones Button1 y Button2.

MiVentana *pMiVentana = 0;
void CTestDrawWinDlg::OnBnClickedButton1()
{
if (pMiVentana) return ;
pMiVentana = new MiVentana();
pMiVentana->Create(_T("STATIC"), "Hola", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 200, 20), this, 1234);
pMiVentana->ShowWindow(SW_SHOW);
// pMiVentana->RedrawWindow();
}
void CTestDrawWinDlg::OnBnClickedButton2()
{
if (pMiVentana)
pMiVentana->RedrawWindow();
}
-


Dejame saber si tienes problemas.

Eduardo Sobrino, MVP



"Sergio" wrote in message
news:%
Eduardo Sobrino MVP escribió:
> Sergio:
>
> "OnDrawItem" se ejecuta en eventos relacionados a un "Item" como un
> "MenuItem", un boton, otros y no es uno de los eventos de "CWnd". Para
> refrescar el contenido de una ventana en la clase de "CWnd" redefine
> "RefreshWindow(...)". Como sabes si invalidas la ventana (invocando
> "Invalidate(...)") refrescaras la ventana.
>
> Por otro lado "CWnd" es una envoltura ("Wrapper Class") alrededor de una
> ventana de "Windows". Otras classes como "CFramwWnd" que se derivan de
> "CWnd" y añaden un bonche de funcionalidad adicional.
>
> Eduardo Sobrino, MVP

Y como redefino RefreshWindow()? Es una función que no he encontrado
por ningún lado.
Respuesta Responder a este mensaje
#5 Sergio
20/04/2004 - 12:37 | Informe spam
Gracias por el ejemplo.

Una pregunta, porque al crearlo tengo que hacerlo así?
p.Create(_T("STATIC"),_T(""),WS_CHILD|WS_VISIBLE,CRect(0,0,100,100),this,10000);
me refiero a la parte de _T("STATIC"), si yo no quiero que sea texto
estatico, sino figuras.

Y luego otro detalle(ya que estoy aprovecho): para volver a pintar el
objeto que me he creado, porque puede que me hayan puesto una ventana
delante, y necesito que vuelva a pintar las lineas y círculos, ya que me
desaparecen, lo tendria que hacer en el OnPaint de la vista, no? Porque
al hacerlo en el OnPaint() de mi clase, me deja de pintar algunas partes
de los menus y barras de herramientas.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida