Você está na página 1de 16

Programacin Grfica

Dibujando Crculos y Lneas en Visual C++


Laboratorio No. 11 Ahora veremos algunos procedimientos de dibujo ms complicados. Utilizaremos como base el programa del Laboratorio No. 8 llamado SimpleDraw, y le agregaremos la capacidad de dibujar crculos. La aplicacin que construiremos tendr la funcionalidad de dibujar lneas (clic izquierdo para dibujar una lnea, clic derecho para iniciar una nueva lnea). Pero, presionando la tecla C del teclado ahora introduciremos el modo crculo, el cual nos permitir dibujar crculos usando el clic derecho para definir el centro del crculo y el clic izquierdo para especificar el radio y dibujarlo. Para regresar al modo lnea presionamos la tecla L del teclado. Tanto lneas como crculos son almacenados en la clase document de tal forma que OnDraw pueda refrescar la ventana del programa cuando se requiera. Por supuesto que las MFC tienen funciones para dibujar Crculos y Elipses (en la clase CDC), sin embargo generaremos nuestra propia funcin DrawCirc para mostrar los detalles del proceso para dibujar curvas, basado en pequeos segmentos de lnea. La geometra de la operacin para dibujar un crculo se muestra en la siguiente figura:

El proceso de dibujo utilizado se conoce como dibujo paramtrico ya que usamos el ngulo Phi del crculo como un parmetro para generar las coordenadas de los puntos del crculo. Por cada valor de Phi determinamos el pixel correspondiente a las coordenadas para xp y yp, y entonces el crculo se dibuja como una serie de pequeas lneas rectas, mientras se incrementa Phi desde 0 hasta 2 radianes (0 a 360).

Luis Hernndez Lara

Programacin Grfica

1. Inicie Microsoft Visual Studio. 2. Crear un Nuevo Proyecto. Tipo de proyecto: Aplicacin MFC. Nombre del proyecto: SimpleDrawCirc Tipo de Aplicacin: Documento nico. Compatibilidad con la arquitectura documento/vista. Estilo del proyecto: MFC estndar. Uso de MFC: Utilizar MFC en un archivo DLL compartido. 3. Agregar Variables Miembro al Proyecto. A continuacin generaremos seis variables miembro. Las primeras tres las llamaremos m_NumLines, m_FPoint y m_LPoint, cuyo papel ser el de contener el nmero de lneas dibujadas, y los puntos inicial y final de cada una de las lneas del dibujo que se disee en la ventana. Las otras tres variables sern m_NumCircs, m_CircCenter y m_CircRadius, cuyo papel ser el de contener el nmero de crculos dibujados, y las coordenadas del centro del crculo y el valor del radio del mismo. Las variables miembro estarn asociadas a la clase CSimpleDrawCircDoc. Agregue las variables miembro a la clase especificada, con los valores siguientes:
Miembro de la Clase: Acceso: Tipo de variable: Nombre de variable:

CSimpleDrawCircDoc CSimpleDrawCircDoc CSimpleDrawCircDoc CSimpleDrawCircDoc CSimpleDrawCircDoc CSimpleDrawCircDoc

public public public public public public

CPoint CPoint int CPoint double int

m_FPoint m_LPoint m_NumLines m_CircCenter m_CircRadius m_NumCircs

A continuacin haga clic sobre la clase CSimpleDrawCircDoc en la vista de clases. Observaremos en la parte inferior de la ventana, que aparecen las variables miembro asociadas a dicha clase. Un doble clic sobre el nombre de la funcin miembro (por ejemplo, sobre m_FPoint) nos conduce a la lnea de cdigo donde fue declarada la variable, dentro de la ventana de Edicin del entorno de desarrollo. 4. Agregando cdigo a la funcin constructora CSimpleDrawCircDoc. Active la pestaa Explorador de soluciones del lado derecho de la ventana de desarrollo. Primeramente debemos considerar la redeclaracin de las variables miembro m_FPoint y m_LPoint para que contengan las coordenadas de los puntos inicial y final de cada una de las lneas dibujadas por el usuario, para ello las variables adems de haber sido declaradas de la clase point (CPoint), deben ser arreglos para contener ms de una coordenada x, y. Recordemos que las variables de la clase point contienen a los miembros x, y. Lo mismo sucede para las variables

Luis Hernndez Lara

Programacin Grfica

miembro m_CircCenter de la clase CPoint, que contendr las coordenadas del punto central del crculo y m_CircRadius que contendr el valor del radio, por lo que deben ser arreglos para contener los valores de los crculos dibujados. La declaracin de las variables la encontramos en el archivo de encabezado SimpleDrawCircDoc.h ya que en la clase CSimpleDrawCircDoc fue donde agregamos las variables. Haga doble clic sobre el archivo de encabezado SimpleDrawCircDoc.h, y observar en la ventana de cdigo la definicin de las variables miembro (si no las ve inmediatamente, recorra el archivo mostrado y las encontrar):

A continuacin, modifique la declaracin de las variables m_FPoint, m_LPoint, m_CircCenter, m_CircRadius exclusivamente, para que queden definidas como arreglos. En este caso de tamao [100] pensando en que dibujaremos no ms de 100 lneas y crculos. El cdigo queda como sigue:
01 02 03 04 05 06 07 08 09 10 11 // Funciones de asignacin de mensajes generadas protected: DECLARE_MESSAGE_MAP() public: CPoint m_FPoint[100]; CPoint m_LPoint[100]; int m_NumLines; CPoint m_CircCenter[100]; double m_CircRadius[100]; int m_NumCircs; };

Tabla 1. Listado de SimpleDrawCircDoc.h

A continuacin, debemos considerar la inicializacin de las variables miembro para que nos permitan almacenar el punto inicial de las lneas, el nmero de lneas dibujadas y el nmero de crculos dibujados. Esta inicializacin se ejecuta 3
Luis Hernndez Lara

Programacin Grfica

en la funcin OnNewDocument, la cual se puede localizar dentro del archivo SimpleDrawCircDoc.cpp. Usted puede encontrarla fcilmente haciendo doble clic sobre el archivo SimpleDrawCircDoc.cpp dentro de la ventana del Explorador de soluciones. Entonces aparece la ventana de cdigo dentro del rea de desarrollo de la aplicacin. Ah buscamos la funcin OnNewDocument. Agregamos cdigo para modificar la inicializacin automtica que hizo el asistente (en otra funcin, CSimpleDrawCircDoc()), de tal forma que: 1. m_NumLines se inicialice a 0. Contendr el nmero de lneas dibujadas. 2. m_NumCircs se inicialice a 0. Contendr el nmero de crculos dibujados. 3. m_FPoint, se inicialice a 0, 0. Coordenada x, y inicial de dibujo, cuando el usuario de su primer clic con el botn izquierdo del ratn, sin antes haber dado clic con el botn derecho. Modifique el cdigo de la funcin OnNewDocument, para que se vea como a continuacin se muestra:
01 02 03 04 05 06 07 08 09 10 11 12 13 // Este es el listado de la funcin OnNewDocument BOOL CSimpleDrawCircDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: agregar aqu cdigo de reinicio // (los documentos SDI volvern a utilizar este documento) m_NumLines = 0; m_NumCircs = 0; m_FPoint[0].x = 0; // coordenada x de inicio m_FPoint[0].y = 0; // coordenada y de inicio return TRUE; }

Tabla 2. Listado de OnNewDocument de SimpleDrawCirDoc.cpp

Nota: Hemos movido la inicializacin de variables miembro a OnNewDocument de manera que al hacer clic en File > New en el men del la ventana de ejecucin del programa, se limpie la pantalla y se inicie un nuevo dibujo. El asistente realiz la inicializacin de las variables miembro que creamos, en la funcin CSimpleDrawCircDoc. Dicha inicializacin no nos sirve y se contrapone con la que acabamos de realizar. Por tal motivo, necesitamos nulificarla, por lo que en la vista Explorador de soluciones demos doble clic al archivo SimpleDrawCircDoc.cpp. Ah buscamos la funcin CSimpleDrawCircDoc()

Luis Hernndez Lara

Programacin Grfica

A continuacin procedemos a dejar como comentario las inicializaciones, para que no tengan efecto.
01 02 03 04 05 06 07 08 09 10 11 12 // Construccin o destruccin de CSimpleDrawCircDoc CSimpleDrawCircDoc::CSimpleDrawCircDoc() //: m_FPoint(0) //, m_LPoint(0) //, m_NumLines(0) //, m_CircCenter(0) //, m_CircRadius(0) //, m_NumCircs(0) { // TODO: agregar aqu el cdigo de construccin nico }

Tabla 3. Listado de CSimpleDrawCircDoc de SimpleDrawCirDoc.cpp

5. Agregar la pluma y otras variables, miembro. El siguiente paso en nuestro programa SimpleDrawCirc es reconocer que necesitamos la pluma azul en ms de una de las funciones de la clase view. Tanto en OnDraw como en OnLButtonDown y en DrawCirc que se encargarn de dibujar las lneas y los crculos. En esta situacin, es mejor crear el objeto CPen como una variable miembro de la clase CSimpleDrawCircView. Tambin necesitaremos dos nuevas variables miembro que nos servirn, una para establecer el modo de dibujo: lneas o crculos (m_DrawMode), y otra para controlar si se va a dibujar un crculo, y si ya contamos con las coordenadas del centro (m_CenterSet).

Luis Hernndez Lara

Programacin Grfica

En la vista de clases localice la clase CSimpleDrawCircView y agregue las siguientes variable miembro:
Miembro de la Clase: Acceso: Tipo de variable: Nombre de variable:

CSimpleDrawCircView CSimpleDrawCircView CSimpleDrawCircView

public public public

CPen CString CString

m_BluePen m_DrawMode m_CenterSet

Al dar doble clic sobre la variable miembro m_BluePen y ver la ventana de cdigo, nos damos cuenta de que el asistente no las inicializ.

Por lo tanto procedemos a inicializar el objeto pluma en la funcin constructora CSimpleDrawCircView de la clase view, y las variables miembro. Para ello vaya al Explorador de soluciones y d doble clic sobre el archivo SimpleDrawCircView.cpp y en la ventana de Edicin de cdigo localice la funcin CSimpleDrawCircView. Agregue y modifique el cdigo de inicializacin como se muestra a continuacin:
01 02 03 04 05 06 07 08 09 CSimpleDrawCircView::CSimpleDrawCircView() //: m_DrawMode(_T("")) //, m_CenterSet(_T("")) { // TODO: agregar aqu el cdigo de construccin m_CenterSet = "No"; m_DrawMode = "Lneas"; m_BluePen.CreatePen(PS_SOLID,2,RGB(0,0,255)); }

Tabla 4. Listado de CSimpleDrawCircView de SimpleDrawCircView.cpp

Con m_BluePen declarada e inicializada como una variable miembro, est disponible para cualquier funcin de la clase view y no necesita ser definida otra vez.

Luis Hernndez Lara

Programacin Grfica

Como puede observar, tambin eliminamos la inicializacin automtica que hizo el asistente. 6. Agregar una Funcin Miembro al Proyecto. La base de este programa es una funcin que construiremos con el fin de dibujar crculos, y a la que llamaremos DrawCirc. Esta funcin dibuja crculos con los argumentos de entrada: posicin del centro y el radio. DrawCirc es creada como una funcin miembro de la clase CSimpleDrawCircView. En la vista de clases, d clic con el botn derecho del ratn sobre la clase CSimpleDrawCircView, seleccione agregar una funcin del men contextual que aparece. A continuacin en el Asistente para agregar funciones miembro, agregue la funcin, con dos parmetros (cada parmetro debe agregarlo a la Lista de parmetros con el botn Agregar del asistente):
Tipo de valor devuelto: Acceso: Nombre de la funcin: Tipo de parmetro: Nombre del parmetro:

void

public

DrawCirc

CPoint double

Center Radius

Los dos parmetros deben estar agregados a la lista de parmetros, a continuacin d clic en Finalizar. La funcin ha sido agregada.

Luis Hernndez Lara

Programacin Grfica

7. Agregar cdigo a la funcin DrawCirc. A continuacin hay que agregar cdigo a la funcin DrawCirc perteneciente a la clase CSimpleDrawCircView que acabamos de crear. De la Vista de clases, seleccione la clase CSimpleDrawView, dando doble clic sobre el nombre de la clase, aparece la ventana de cdigo. Como no aparece inmediatamente el cdigo para la funcin DrawCirc, la buscamos a travs de la zona que muestra funciones y variables miembro de la Vista de clases, o en su caso la buscamos en la zona de bsqueda de la ventana de desarrollo.

Modifique la funcin para que quede como se muestra:


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 // Este es el listado de DrawCirc void CSimpleDrawCircView::DrawCirc(CPoint Center, double Radius) { CClientDC aDC(this); aDC.SelectObject(&m_BluePen); double Phi = 0.; int nseg = 50; double DPhi = (2. * 3.14158) / nseg; aDC.MoveTo(int(Center.x+Radius), Center.y); for(int i=1; i<=nseg; i++){ Phi += DPhi; int xp = int(Center.x + Radius * cos(Phi)); int yp = int(Center.y + Radius * sin(Phi)); aDC.LineTo(xp, yp); } }

Tabla 5. Listado de la funcin DrawCirc de SimpleDrawCircView.cpp

La lista de argumentos de la lnea 02 muestra la posicin central del crculo como el objeto Center del tipo CPoint y el radio del crculo como Radius. La lnea 04 obtiene el contexto del dispositivo como aDC y la lnea 05 selecciona la pluma azul. Phi es inicializado a cero en la lnea 06 y el nmero de segmentos a ser usados en el crculo es colocado a cincuenta en la lnea 07.

Luis Hernndez Lara

Programacin Grfica

El incremento angular DPhi es colocado en la lnea 08, basado en el nmero de segmentos (2/nseg). Recuerde de geometra bsica que 2 es igual a 6.28 radianes, que equivale a 360. La lnea 09 hace el movimiento del cursor hacia la posicin Phi=0 del crculo. Entonces el loop de las lneas 10 a 14 mueve alrededor del crculo, dibujando pequeos segmentos de lnea. La lnea 11 incrementa Phi en cada paso. Las lneas 12 y 13 colocan las coordenadas xp y yp del pixel de acuerdo con las ecuaciones de la Figura 1, mientras que la lnea 14 dibuja el segmento de lnea usando la funcin LineTo. El crculo se dibuja en el sentido de las manecillas del reloj. Debido a los ejes coordenados de Windows. La Figura 1, se presenta en el formato tradicional de los ejes coordenados x, y. Para que ste completa la definicin de la funcin DrawCirc, debemos agregar una referencia a la biblioteca de funciones matemticas de C++, para que las funciones sin y cos puedan ejecutarse. Localice el archivo SimpleDrawCircView.cpp en la vista Explorador de soluciones y al principio de ste agregue la declaracin: #include Math.h Agregue la declaracin al inicio del archivo, para que se vea como:

8. Agregar cdigo a la funcin OnDraw. A continuacin hay que agregar cdigo a la funcin OnDraw perteneciente a la clase CSimpleDrawCircView. De la Vista de clases, seleccione la clase CSimpleDrawCircView, dando doble clic sobre el nombre de la clase, aparece la ventana de cdigo. Como no aparece inmediatamente el cdigo para la funcin OnDraw, la buscamos a travs de la zona que muestra funciones y variables miembro de la Vista de clases, o en su caso la buscamos en la zona de bsqueda de la ventana de desarrollo.

Luis Hernndez Lara

Programacin Grfica

Modifique la funcin para que quede como se muestra:


01 02 03 04 05 06 07 08 09 10 11 12 13 // Este es el listado de OnDraw void CSimpleDrawCircView::OnDraw(CDC* pDC) { CSimpleDrawCircDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: agregar aqu el cdigo de dibujo para datos nativos pDC->SelectObject(&m_BluePen); for(int i=0; i<pDoc->m_NumLines; i++) { pDC->MoveTo(pDoc->m_FPoint[i]); pDC->LineTo(pDoc->m_LPoint[i]); } // fin de for for(int i=0; i<pDoc->m_NumCircs; i++){ DrawCirc(pDoc->m_CircCenter[i],pDoc->m_CircRadius[i]); } }

Tabla 6. Listado de la funcin OnDraw de SimpleDrawCircView.cpp

La funcin OnDraw dibuja lneas rectas en las lneas de cdigo 08 a 10. Obtiene m_NumLines del documento en la lnea 08 y entonces dibuja cada lnea con las funciones MoveTo y LineTo en las lneas 09 y 10. El ciclo Loop de las lneas 11 y 12 maneja crculos de una manera similar. m_NumCircs es obtenido del documento en la lnea 11, para controlar el Loop. El centro y radio del crculo son recuperados del documento y colocados en la lista de argumentos de DrawCirc en la lnea 12. Recuerde que OnDraw redibuja lo que est en la ventana, cada vez que esta de redimensiona. 9. Controlar el modo de dibujo. Crear el manejador de mensajes OnKeyDown. Se requiere una funcin manejadora de mensajes de Windows enviados al programa SimpleDrawCirc, siempre que se presione cualquiera de las teclas C o L, que nos permitirn cambiar el modo de dibujo. Primero, ubiquemos de nueva cuenta la Vista de clases del proyecto.
Luis Hernndez Lara

10

Programacin Grfica

A continuacin haga clic con el botn derecho del ratn sobre la clase CSimpleDrawCircView, para activar el men flotante, del cual seleccionaremos la opcin Propiedades. Una vez elegida la opcin Propiedades, aparece la ventana de propiedades para la clase CSimpleDrawCircView. Al hacer clic sobre el icono Mensajes (de la barra de herramientas de Propiedades), se muestran una lista de los mensajes de Windows (WM_). Recorriendo esa lista, encontraremos WM_KEYDOWN. Haga clic sobre WM_KEYDOWN para resaltarlo, y entonces active la lista desplegable que aparece del lado derecho. Haga clic sobre el elemento OnKeyDown y en ese momento se agregar la funcin OnKeyDown a la clase CSimpleDrawCircView. Podemos entonces cerrar la ventana de propiedades. A continuacin haga clic sobre la clase CSimpleDrawCircView en la Vista de clases. Observaremos en la parte inferior de la ventana, que aparecen las funciones y variables miembro asociadas a dicha clase, en ellas encontraremos a la funcin miembro que acabamos de agregar. Como no aparece inmediatamente el cdigo para la funcin OnKeyDown, la buscamos a travs de la zona que muestra funciones y variables miembro de la Vista de clases, o en su caso la buscamos en la zona de bsqueda de la ventana de desarrollo.

Modifique la funcin para que quede como se muestra:

11

Luis Hernndez Lara

Programacin Grfica

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

// Este es el listado de OnKeyDown void CSimpleDrawCircView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Agregue aqu su cdigo de controlador de mensajes ... CSimpleDrawCircDoc* pDoc = GetDocument(); CClientDC aDC(this); CString Buffer; char KeyStruck = nChar; if(KeyStruck == 'C'){ m_DrawMode = "Crculos"; Buffer ="Crculos..."; aDC.TextOut(10,5,Buffer); // Despliega ayuda Buffer = "clic derecho para el centro del crculo."; aDC.TextOut(10,25,Buffer); Buffer = "clic izquierdo para el radio."; aDC.TextOut(10,45,Buffer); } // fin de if if(KeyStruck == 'L'){ m_DrawMode = "Lneas"; pDoc->UpdateAllViews(NULL); } // fin de if CView::OnKeyDown(nChar, nRepCnt, nFlags); }

Tabla 7. Listado de la funcin OnKeyDown de SimpleDrawCircView.cpp

La variable miembro m_DrawMode de la clase view identifica el modo de dibujo activo. Esta variable es inicializada como Lneas en la funcin constructora CSimpleDrawCircView de manera que el programa al comenzar su ejecucin est listo para dibujar lneas. Cuando una C ha sido presionada, la oracin if en la lnea 09 se satisface y el cdigo de las lneas 10 a 16 se ejecuta. En la lnea 10 el modo de dibujo es colocado a Crculos. Cuando L es presionada, la oracin if de la lnea 17 es satisfecha, el modo de dibujo es colocado a Lneas en la lnea 18 y entonces la funcin UpdateAllViews es llamada en la lnea 19. Esto resulta en la ejecucin de la funcin OnDraw la cual limpia la ventana y redibuja el dibujo actual. En el proceso de redibujado, el mensaje de ayuda para dibujar crculos desaparece. La lnea 20 es proporcionada por el asistente de la aplicacin. 10. Crear el manejador de mensajes OnRButtonDown. Se requiere una funcin manejadora de mensajes de Windows enviados al programa SimpleDrawCirc siempre que el botn derecho del ratn es presionado (clic). Primero, ubiquemos de nueva cuenta la Vista de clases del proyecto. A continuacin haga clic con el botn derecho del ratn sobre la clase CSimpleDrawCircView, para activar el men flotante, del cual seleccionaremos la opcin Propiedades. Una vez elegida la opcin Propiedades, aparece la ventana de propiedades para la clase CSimpleDrawCircView.

12

Luis Hernndez Lara

Programacin Grfica

Al hacer clic sobre el icono Mensajes (de la barra de herramientas de Propiedades), se muestran una lista de los mensajes de Windows (WM_). Recorriendo esa lista, encontraremos WM_RBUTTONDOWN. Haga clic sobre WM_RBUTTONDOWN para resaltarlo, y entonces active la lista desplegable que aparece del lado derecho. Haga clic sobre el elemento OnRButtonDown y en ese momento se agregar la funcin OnRButtonDown a la clase CSimpleDrawCircView. Podemos entonces cerrar la ventana de propiedades. A continuacin haga clic sobre la clase CSimpleDrawCircView en la Vista de clases. Observaremos en la parte inferior de la ventana, que aparecen las funciones y variables miembro asociadas a dicha clase, en ellas encontraremos a la funcin miembro que acabamos de agregar. Ahora tenemos una nueva funcin miembro llamada OnRButtonDown, asociada a un evento de manejo del ratn. A continuacin localice la funcin OnRButtonDown dentro del archivo SimpleDrawCircView.cpp de la vista Explorador de soluciones.

11. Agregando cdigo a la funcin OnRButtonDown de SimpleDrawCircView.cpp Agregue cdigo a la funcin OnRButtonDown, para que se vea como a continuacin se muestra:
01 02 03 04 05 06 07 08 09 10 11 12 // Este es el listado de OnRButtonDown void CSimpleDrawCircView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Agregue aqu su cdigo de controlador de mensajes ... CSimpleDrawCircDoc* pDoc = GetDocument(); if(m_DrawMode == "Lneas"){ pDoc->m_FPoint[pDoc->m_NumLines] = point; } if(m_DrawMode == "Crculos"){ pDoc->m_CircCenter[pDoc->m_NumCircs] = point; m_CenterSet = "Si"; } CView::OnRButtonDown(nFlags, point); }

Tabla 8. Listado de OnRButtonDown de SimpleDrawCircView.cpp

13

Luis Hernndez Lara

Programacin Grfica

Si el modo de dibujo es Lneas, la oracin de la lnea 07 es ejecutada para colocar en m_FPoint (el punto inicial de una nueva lnea), al valor actual de la posicin del ratn. Si el modo de dibujo es Crculos, la lnea 09 coloca las coordenadas de m_CircCenter a la posicin del ratn. La lnea 10 entonces coloca la variable m_CenterSet al valor Si, indicando que las coordenadas del centro han sido colocadas para este crculo. Si sucesivos clics derechos del ratn son recibidos en el modo lnea, la oracin de la lnea 07 simplemente actualiza el primer punto de la siguiente lnea a ser dibujada con el valor de la posicin del ratn al ejecutar un nuevo clic derecho. Una lnea no ser dibujada mientras no se reciba un clic izquierdo. 12. Crear el manejador de mensajes OnLButtonDown. Se requiere una funcin manejadora de mensajes de Windows enviados al programa SimpleDrawCirc siempre que el botn izquierdo del ratn es presionado (clic). Primero, ubiquemos de nueva cuenta la Vista de clases del proyecto. A continuacin haga clic con el botn derecho del ratn sobre la clase CSimpleDrawCircView, para activar el men flotante, del cual seleccionaremos la opcin Propiedades. Una vez elegida la opcin Propiedades, aparece la ventana de propiedades para la clase CSimpleDrawCircView. Al hacer clic sobre el icono Mensajes (de la barra de herramientas de Propiedades), se muestran una lista de los mensajes de Windows (WM_). Recorriendo esa lista, encontraremos WM_LBUTTONDOWN. Haga clic sobre WM_LBUTTONDOWN para resaltarlo, y entonces active la lista desplegable que aparece del lado derecho. Haga clic sobre el elemento OnLButtonDown y en ese momento se agregar la funcin OnLButtonDown a la clase CSimpleDrawCircView. Podemos entonces cerrar la ventana de propiedades. Ahora tenemos una nueva funcin miembro llamada OnLButtonDown, asociada a un evento de manejo del ratn. A continuacin localice la funcin OnLButtonDown dentro del archivo SimpleDrawCircView.cpp de la vista Explorador de soluciones.

14

Luis Hernndez Lara

Programacin Grfica

13. Agregando cdigo a la funcin OnLButtonDown de SimpleDrawCircView.cpp Agregue cdigo a la funcin OnLButtonDown, para que se vea as:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Este es el listado de OnLButtonDown void CSimpleDrawCircView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Agregue aqu su cdigo de controlador de mensajes ... CSimpleDrawCircDoc* pDoc = GetDocument(); CClientDC aDC(this); aDC.SelectObject(&m_BluePen); if(m_DrawMode == "Lneas"){ int i = pDoc->m_NumLines; aDC.MoveTo(pDoc->m_FPoint[i]); aDC.LineTo(point); pDoc->m_LPoint[i] = point; pDoc->m_FPoint[i+1] = point; pDoc->m_NumLines++; } if((m_DrawMode == "Crculos") && (m_CenterSet == "Si")){ int j = pDoc->m_NumCircs; int dx = point.x - pDoc->m_CircCenter[j].x; int dy = point.y - pDoc->m_CircCenter[j].y; double RadSq = dx*dx + dy*dy; // r2 = x2 + y2 pDoc->m_CircRadius[j] = sqrt(RadSq); DrawCirc(pDoc->m_CircCenter[j], pDoc->m_CircRadius[j]); pDoc->m_NumCircs++; m_CenterSet = "No"; } CView::OnLButtonDown(nFlags, point); }

Tabla 9. Listado de OnLButtonDown de SimpleDrawCircView.cpp

Las lneas 09-14 aplican cuando el modo de dibujo es colocado a Lneas. La lnea 09 recupera m_NumLines del documento y las lneas 10 y 11 dibujan la lnea en la ventana desde el punto de inicio a la posicin del ratn cuando el clic izquierdo es recibido. Las lneas 12-14 almacenan m_LPoint, el siguiente m_FPoint y m_NumLines es incrementada. Si el modo de dibujo es Crculos y el centro del crculo ha sido colocado por un clic derecho, las lneas 16-21 calculan, almacenan los datos del crculo y lo dibujan. La lnea 16 obtiene m_NumCircs del documento. La lnea 17 obtiene la posicin x del punto donde el ratn hizo clic, relativo a la coordenada x del centro del crculo y la lnea 18 obtiene la posicin y del punto donde el ratn hizo clic, relativo a la coordenada y del centro del crculo. Las lneas 19 y 20 calculan el radio del crculo y lo almacenan en el documento. La lnea 21 llama a la funcin DrawCirc para que dibuje el crculo con las coordenadas del centro y el radio especificadas. Finalmente, la lnea 22 incrementa m_NumCircs para prepararse para un nuevo crculo y la lnea 23 actualiza m_CenterSet a No de manera que un nuevo clic derecho tenga que ser recibido antes de otro clic izquierdo a ser procesado en el modo crculo.

15

Luis Hernndez Lara

Programacin Grfica

14. Ejecute la aplicacin. Salve, construya y ejecute su proyecto. Una vez creado un dibujo, seleccione Archivo > Nuevo del men de la aplicacin. Qu sucede?

16

Luis Hernndez Lara

Você também pode gostar