Está en la página 1de 15

Ing.

Ricardo Castaeda

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE INGENIERA MECNICA

CURSO MB544 COMPUTACION II

Clase 11

2006
3. GRAFICOS EN VISUAL C
3.1. La clase CDC permite definir una clase de objetos denominados contextos
de dispositivo (DC). Cuando se quiere dibujar en un dispositivo grfico como una
pantalla o una impresora, primero hay que obtener un identificador de un contexto
de dispositivo que represente al dispositivo fsico y que delimite el rea donde se
puede pintar. Esto es porque una aplicacin Windows no accede directamente al
1
Ing. Ricardo Castaeda

hardware de un dispositivo grfico cuando quiere presentar un grfico o texto


formateado, sino que utiliza una interfaz de dispositivo grfico (GDI) que permite
realizar la presentacin grfica de una forma sencilla.
De la clase CDC se derivan las clases CClientDC, CwindowDC, CpaintDC y
CMetaFileDC, cada una de ellas con fines especficos para dar solucin al proceso
en curso.
Para utilizarla hay cuatro pasos:
Obtener el DC de un objeto determinado (ventana, impresora, etc.)
Establecer los atributos de dibujo (color, plumas).
Utilizar la API de Windows para dibujos en el DC.
Liberar el DC una vez que se haya terminado de dibujar.
3.2. Tipos de contexto de dispositivo.
La obtencin del contexto es algo fundamental. Windows proporciona una amplia
gama, como: Contexto para dibujar en pantalla, para acceder a la impresora, otro
para recabar informacin.
DC de pantalla El DDC o Display Device Context se utiliza para acceder a los
objetos existentes en pantalla . Para crear este tipo de contexto se utiliza dos
funciones: BeginPaint() y GetDC(), para la liberacin tenemos: EndPaint() y
ReleaseDC().
Dc de Impresora El PDC o Printer Device Context es el DC que se utiliza para
acceder a cualquier tipo de
3.3. La clase CPaintDC se utiliza con la funcin OnPaint . para visualizar texto o
grficos en el rea de trabajo de una ventana en respuesta a un mensaje
VM_PAINT( se ejecuta la funcin OnPaint) hay que crear un objeto DC
perteneciente a la clase CpaintDC o una clase derivada de ella.
3.4. La clase Cbrush permite definir el pincel a utilizar con las funciones de dibujo.
Esta herramienta afecta a la forma en la que es pintado el interior de las figuras
cerradas. Cuando crea un contexto de dispositivo, existe un pincel por defecto que
pinta de blanco el interior de las figuras cerradas.
3.5. La clase Cpen permite definir la pluma a utilizar con las funciones de dibujo.
Esta herramienta afecta a la forma en la son dibujadas las lneas: lneas slidas,
lneas discontinuas, etc. Cuando se crea un contexto de dispositivo, existe una
pluma por defecto que dibuja lneas negras slidas que tienen ancho de un pixel.
APLICACIN DE GRAFICOS 01 Como aplicacin de simple documento
desarrollemos una aplicacin para dibujar un crculo:

2
Ing. Ricardo Castaeda

Siga las opciones indicadas

1) Ahora abra el archivo Graficos1Doc.h y modifique la declaracin de la siguiente


manera

3
Ing. Ricardo Castaeda

class CGraficos1Doc : public CDocument


{protected: // create from serialization only
CGraficos1Doc();
DECLARE_DYNCREATE(CGraficos1Doc)
// Attributes
public:
int m_posicionx;
int m_posiciony;

// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGraficos1Doc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CGraficos1Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CGraficos1Doc)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP() };

2) El siguiente paso ser la declaracin de los datos miembro de la clase vista, abrimos el
archivo Graficos1View.h

class CGraficos1View : public CView


{ protected: // create from serialization only
CGraficos1View();
DECLARE_DYNCREATE(CGraficos1View)
// Attributes
public:
CGraficos1Doc* GetDocument();
int m_posicionx;
int m_posiciony;

// Operations

4
Ing. Ricardo Castaeda

public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGraficos1View)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CGraficos1View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CGraficos1View)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

3) Ahora inicialice los datos miembro de la clase de documento en la funcin


miembro OnNewDocument() de la clase CGraficos1Doc, para lo cual apertura el
archivo GraficosDoc.cpp y busque la funcin mencionada:

BOOL CGraficos1Doc::OnNewDocument()
{if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
m_posicionx=50;
m_posiciony=50;
return TRUE;
}
4) Ahora entre a MFC ClassWizard con CTRL+W y se le presentara la siguiente
ventana y haga clic en edit code para escribir lo siguiente:

5
Ing. Ricardo Castaeda

5) Escribir:
void CGraficos1View::OnInitialUpdate()
{ CView::OnInitialUpdate();
// Se obtiene el apuntador al documento
CGraficos1Doc* pDoc = GetDocument();
// Actualiza los datos miembro de la vista con los valores
// Correspondientes del documento
m_posicionx = pDoc->m_posicionx;
m_posiciony = pDoc->m_posiciony;

}
6) Para desplegar el circulo abra Graficos1View.cpp y localize OnDraw() y escriba el
siguiente cdigo:
void CGraficos1View::OnDraw(CDC* pDC)
{ CGraficos1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// define los limites rectangulares a dibujar
RECT rect;
rect.left = m_posicionx-20;
rect.top = m_posiciony -20;
rect.bottom = m_posiciony + 20;
rect.right = m_posicionx + 20;
// Dibuja el circulo
pDC->Ellipse(&rect);
}

6
Ing. Ricardo Castaeda

7) Para dibujar el circulo abrir el MFC ClassWizard y seleccionar el siguiente evento :


Class name: CGraficos1View
ObjectID : CGraficos1View
Message: WM_LBUTTONDOWN y escriba lo siguiente:

void CGraficos1View::OnLButtonDown(UINT nFlags, CPoint point)


{
m_posicionx = point.x;
m_posiciony = point.y;
// llamar a la funcion invalidate para ejecutar OnDraw()
Invalidate();
// Extrae el apuntador al documento
CGraficos1Doc* pDoc = GetDocument();
pDoc->m_posicionx = m_posicionx;
pDoc->m_posiciony = m_posiciony;
//Indicar que el documento fue modificado
pDoc->SetModifiedFlag(TRUE);

CView::OnLButtonDown(nFlags, point);
}

Compilar , Ejecutar y suerte.

7
Ing. Ricardo Castaeda

APLICACIN DE GRAFICOS 02
La Clase Cfont Crear un nuevo proyecto llamado Graficos2 y dar OK a
continuacin seleccionar Single Document y Finsh.
Ahora crear en la clase CGraficos2View la funcin que recibir el nombre
ShowFonts(CDC +pDC), para ello hacer clic derecho sobre la clase y elegir Add Member
Function tal como se muestra:

Y debe aparecer:

8
Ing. Ricardo Castaeda

Y escribimos

void CGrafico2View::ShowFonts(CDC *pDC)


{ LOGFONT logFont;
logFont.lfHeight= 8;
logFont.lfWidth =0;
logFont.lfEscapement = 0;
logFont.lfOrientation =0 ;
logFont.lfWeight = FW_NORMAL;
logFont.lfItalic = 0;
logFont.lfUnderline = 0;
logFont.lfStrikeOut = 0;
logFont.lfCharSet = ANSI_CHARSET;
logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logFont.lfQuality = PROOF_QUALITY;
logFont.lfPitchAndFamily = VARIABLE_PITCH| FF_ROMAN;
strcpy(logFont.lfFaceName,"Comic Sans MS");
// Inicia la posicion del texto en la ventana
UINT position = 0;
// Crea y muestra 8 fuentes de ejemplo
for ( UINT x=0; x<8;++x)
{ // Fija lanueva altura de la fuente
logFont.lfHeight = 16+(x*8);
// Crea una nueva fuente y la selecciona en el DC
CFont font;
font.CreateFontIndirect(&logFont);
CFont* oldFont = pDC->SelectObject(&font);
//Imprime el texto con lanueva fuente
position += logFont.lfHeight;
pDC->TextOut(20,position,"Texto de Ejemplo");
// restaura la fuente anterior en el DC
pDC->SelectObject(oldFont);
}

Ahora ubique la funcion ONDraw() de la clase CGrafico2View y escribir solo lo indicado

void CGrafico2View::OnDraw(CDC* pDC)


{
CGrafico2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); // TODO: add draw code for native data here
ShowFonts(pDC);
ShowFonts(pDC);

}
Suerte y ejecute

9
Ing. Ricardo Castaeda

APLICACIN DE GRAFICOS 03
DESARROLLEMOS LA SERIE DE FOURIER UTILIZANDO LAS CLASES:
CBrush, CPen y CPaintDC.

Siga las opciones indicadas

10
Ing. Ricardo Castaeda

11
Ing. Ricardo Castaeda

12
Ing. Ricardo Castaeda

Ingrese cdigo en la funcin ON_PAINT, que se obtiene

El cdigo escrito es:


void CF01View::OnPaint()
{
CPaintDC dc(this); // device context for painting
static DWORD dwColor [9] = {RGB(0,0,0), RGB(245,0,0), RGB(0,245,0),
RGB(0,0,245), RGB(245,245,0), RGB(245,0,245),
RGB(0,245,245), RGB(127,127,127), RGB(245,245,245) };

13
Ing. Ricardo Castaeda

int i,j,ltitulo,ang;
double y, yp;

CBrush n_brocha;
CBrush *v_brocha;
CPen n_pincel;
CPen *v_pincel;
// Crea superficie de dibujo
dc.SetMapMode(MM_ISOTROPIC); //Escala de sistema
dc.SetWindowExt(500,500);// Tamao de la ventana
dc.SetViewportExt(m_cxClient, -m_cyClient);// Tamao del rea de dibujo
dc.SetViewportOrg(m_cxClient/20, m_cyClient/2);//establece origen de coordenadas

ang = 0;
yp = 0.0;

n_pincel.CreatePen(BS_SOLID,2,RGB(0,0,0));
v_pincel= dc.SelectObject(&n_pincel);

//dibuja los ejes de coordenadas x&y


dc.MoveTo(0,240);
dc.LineTo(0,-240);
dc.MoveTo(0,0);
dc.LineTo(400,0);
dc.MoveTo(0,0);

// Dibuja el espectro de la onda de Fourier


for( i = 0; i<= 400; i++)
{ for(j = 1; j <= nterms ; j++)
{
y = ( 150.0/((2.0*j)-1.0))* sin(((j*2.0)-1.0)*0.015708*ang);
yp = yp + y;
}
dc.LineTo(i, (int)yp);
yp-=yp;
ang++;
}
// Preparacin para rellenar el interior del espectro
n_brocha.CreateSolidBrush(dwColor[7]);
v_brocha = dc.SelectObject(&n_brocha);
dc.ExtFloodFill(150,10,dwColor[0], FLOODFILLBORDER);
dc.ExtFloodFill(300,-10,dwColor[0],FLOODFILLBORDER);
// Imprime titulo
ltitulo = strlen(mititulo);
dc.TextOut(200-(ltitulo*8/2),185, mititulo,ltitulo);

//Borra los objetos


dc.SelectObject(v_brocha);
n_brocha.DeleteObject();

14
Ing. Ricardo Castaeda

// TODO: Add your message handler code here

// Do not call CView::OnPaint() for painting messages


}
A continuacin para manejar el tamao de la ventana ingrese cdigo en la funcin OnSize
que se obtiene

Ingrese el siguiente cdigo


void CF01View::OnSize(UINT nType, int cx, int cy)
{ CView::OnSize(nType, cx, cy);
m_cxClient = cx;
m_cyClient= cy;
// TODO: Add your message handler code here
}
Para completar realice las siguientes declaraciones en F01 View.cpp
#include "stdafx.h"
#include "F1.h"
#include "F1Doc.h"
#include "F1View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "math.h" // A PARTIR DE AQU SON LAS DECLARACIONES
int m_cxClient,m_cyClient;
int nterms = 10;
char mititulo[80] = "10 armonicos de Fourier";
:

15