SoloCodigo

Programación General => C/C++ => Visual C++ => Mensaje iniciado por: picyo en Miércoles 25 de Mayo de 2011, 18:47

Título: Inclusion de objeto en un namespace
Publicado por: picyo en Miércoles 25 de Mayo de 2011, 18:47
Estoy con un libro de Visual C++ , en donde hay un ejercicio simple, que es dibujar un círculo empelando ,entre otras, la clase CRect. En este ejercicio se dice crear un objeto de dicha clase y un tipo entero, en el archivo de cabecera "EX04AView.h". cabe decir que el tipo de proyecto es MFC/Single Document/ok a las demas opciones
Siguiendo los diferentes pasos consigo dicho circulo.

Código: C++
  1.  
  2. //EX04AView.h: interfaz de la clase CEX04AView
  3. //(...)
  4. //////// agregadas
  5. private:
  6.     int m_nColor;
  7.     CRect m_rectEllipse;
  8. //(...)
  9.  
  10.  

Código: C++
  1.  
  2. // EX04AView.cpp: implementación de la clase CEX04AView
  3. #include "stdafx.h"
  4. #include "EX04A.h"
  5.  
  6. #include "EX04ADoc.h"
  7. #include "EX04AView.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #endif
  12.  
  13. //(...)
  14.  
  15. // Controladores de mensaje de CEX04AView
  16. //////////////////
  17. ////////////////// este código sale al hacer Class View/Menu Sub ->Propierties/Meesage
  18. /////////////////  Es del tipo MENSAJE. Tipo mensaje es cuando responden a un EVENTO del teclado, mouse...
  19. void CEX04AView::OnLButtonDown(UINT nFlags, CPoint point)
  20. {
  21.     // TODO: Add your message handler code here and/or call default
  22.  
  23.     if(m_rectEllipse.PtInRect(point)){   //m_rectEllipse-> Objeto creado en .h de clase CRect.
  24.         if (m_nColor==GRAY_BRUSH){        // si en m_rectEllipse hay un punto en el rectángulo ( que se puede dibujar dentro
  25.             m_nColor=WHITE_BRUSH;      // de la elipse para modificar tamaño), es TRUE.
  26.         }
  27.         else {
  28.             m_nColor=GRAY_BRUSH;
  29.         }
  30.     InvalidateRect(m_rectEllipse); // esta funcion provoca el redibujo de la Vista 
  31.     }
  32.     //CView::OnLButtonDown(nFlags, point);
  33. }
  34.  
  35.  
esto lo que me hace es en mi clase EX04 crear un círculo de ese modo.


Pues bien, para ver si lo he entendido ( copiar es muy fácil) he ido siguiendo los pasos, y viendo que es lo que hago, pero con un proyecto que tenia abierto anteriormente, y dibujar un círculo en uno de los frames. ¿ Qué hay distinto? Pues que esta vez el tipo de proyecto  no es MFC, sinó he usado CLR/MFC Aplicattion y el proyecto se llama "nb"

He ido al form donde quiero hacer ese dibujo ( no me importa, de momento, si el círculo sobreescribe cualquier cosa) y he agregado dichas variables en la clase View. Aqui viene el problema. La variable entera la permite, pero la variable , o objeto mejor dicho "CRect m_rectEllipse;" no lo reconoce. Y aqui viene el...bueno... pero viene de un Form no???
En el proyecto del libro, no se incluye ningún namespace, lo que si pasa es que se crea la clase ahi del modo :
Código: C++
  1.  
  2. class CEX04AView : public CView
  3. {
  4.  
o sea, que  CEX04View tiene todas las propiedades de la clase padre CView.

Entonces veo como se hace la clase en el proyecto "nb" y es así :
Código: C++
  1. #pragma once
  2.  
  3. using namespace System;
  4. using namespace System::ComponentModel;
  5. using namespace System::Collections;
  6. using namespace System::Windows::Forms;
  7. using namespace System::Data;
  8. using namespace System::Drawing;
  9. namespace nb {
  10.     /// <summary>
  11.     /// Summary for CMyView ///
  12.     /// WARNING: If you change the name of this class, you will need to change the
  13.     ///          'Resource File Name' property for the managed resource compiler tool
  14.     ///          associated with all .resx files this class depends on.  Otherwise,
  15.     ///          the designers will not be able to interact properly with localized
  16.     ///          resources associated with this form.
  17.     /// </summary>
  18.     public ref class CMyView : public System::Windows::Forms::Form  //[color=#0000FF]Este tipo"View"no proviene de CView??[/color]
  19.     {
  20.     public:
  21.         CMyView(void)
  22.  

Bueno en azúl esta mas bien la pregunta a todo...¿ Por qué esta clase no proviene de CView como la del proyecto EX04A? Una respuesta que es posible, supongo que me diriais..es que está encapsulada. Y el que tenga esos namespaces hace ques e usen variables, funciones y demas de esos namespaces.
Lo que intenté hacer, dentro del código, es darle propiedades a esta clase CMyView de CView, en la declaración de la clase, algo asi como añadir ::CView ( lo que seria, haciendo el paralelismo en Java, si mal no recuerdo, un extends). Y claro... no me ha compilado asi que por ahi no va la cosa...

¿ Cómo puedo meter ese objeto "CRect   m_rectEllipse;"   en este proyecto "nb" para que funciones como en el proyecto "EX04A"?
Título: Re: Inclusion de objeto en un namespace
Publicado por: rfog en Martes 7 de Junio de 2011, 17:58
Estás mezclando churras con merinas.

Estás intentando heredar una clase de WIndowsForms como si fuera MFC.

WindowsForms usa un lenguaje similar al C++ que se llama C++/CLI.
Título: Re: Inclusion de objeto en un namespace
Publicado por: picyo en Martes 7 de Junio de 2011, 19:49
bueno soy totalmente autodidacta, por eso estoy aqui. Puedo mezclar fácilmente churras, meninas, espaguetis, tocino y velocidad. Este post lo colgué hace unos dias, y he intentado hacerlo de otro modo. de todos modos gracias
Título: Re: Inclusion de objeto en un namespace
Publicado por: rfog en Martes 7 de Junio de 2011, 20:06
A lo mejor esto te aclara un poco las cosas:

http://geeks.ms/blogs/rfog/archive/2009 ... c-cli.aspx (http://geeks.ms/blogs/rfog/archive/2009/06/15/191-qu-233-es-c-y-qu-233-es-c-cli.aspx" onclick="window.open(this.href);return false;)