Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ingeniería
Ingeniería Mecánica
Gráficos en
Visual C++
1
• Para gráficos (incluyendo texto) en Visual C++
Windows utiliza la interfaz Graphics Device Interfaz
(GDI) lo que llama a los gestores de dispositivo ya
sea de video, impresora o trazadores de gráficos ya
establecidos.
• Se tiene a la
interfaz GDI
que provee
de la
aplicación y
va al
dispositivo
Un ejemplo es el OnDraw en
Visual C++.
La ventanita que se aprecia fue
confeccionada en un
documento unico.
void CGRAFICADELARAIZView::OnPaint()
{ CPaintDC dc(this);
static DWORD dwColor[9]={RGB(0,0,0), RGB(255,0,0), RGB(0,255,0),
RGB(0,0,255), RGB(255,255,0), RGB(255,0,255), RGB(0,255,255),
RGB(127,127,127), RGB(255,255,255)};
CPen n_pincel;
CPen *v_pincel;
CRect rect;
GetClientRect(rect);
int cx=(rect.right -rect.left);
int cy=(rect.bottom-rect.top);
dc.SetMapMode(MM_ANISOTROPIC);
//Establecer la escala del sistema de coordenadas
dc.SetWindowExt(840,300);
dc.SetViewportOrg(cx,-cy);
dc.SetViewportExt(cx,-cy);
dc.SetViewportOrg(cx/2,cy/2);
Ing. Daniel Osorio Maldonado 29/11/2019 44
//Dibujar curvas
float x,x2;
for (x=0; x<300; x+=0.1)//valores de x a evaluar
{x2=(8*pow(x,0.5));//
dc.SetPixel(x,x2,RGB(0,0,255));//permite visualizar la grafica
dc.TextOut(50,40,"RAIZ");//crea un texto dentro de la pantalla }
//DIBUJA LINEAS DE LOS EJES COORDENADOS
n_pincel.CreatePen(PS_SOLID, 1,dwColor[0]);
v_pincel=dc.SelectObject(&n_pincel);
dc.MoveTo(0,-140);
dc.LineTo(0,140);
dc.TextOutW(0,145,_T("Y”),1);
dc.SelectObject(v_pincel);
n_pincel.DeleteObject();
n_pincel.CreatePen(PS_SOLID, 1,dwColor[0]);
v_pincel=dc.SelectObject(&n_pincel);
dc.MoveTo(-100,0);
dc.LineTo(300,0);
dc.TextOut(305,0,"X",1);
dc.SelectObject(v_pincel);
n_pincel.DeleteObject();
}
Ing. Daniel Osorio Maldonado 29/11/2019 45
Muestra el siguiente grafico
n_pincel.CreatePen(PS_SOLID, 1,dwColor[0]);
v_pincel=dc.SelectObject(&n_pincel);
dc.MoveTo(-100,0);
dc.LineTo(100,0);
dc.TextOut(105,0,"X",1);
dc.SelectObject(v_pincel);
n_pincel.DeleteObject();}
n_pincel.CreatePen(PS_SOLID, 1,dwColor[0]);
v_pincel=dc.SelectObject(&n_pincel);
dc.MoveTo(-100,0);
dc.LineTo(300,0);
dc.TextOut(305,0,"X",1);
dc.SelectObject(v_pincel);
n_pincel.DeleteObject();
}
n_pincel.CreatePen(PS_SOLID, 1,dwColor[0]);
v_pincel=dc.SelectObject(&n_pincel);
dc.MoveTo(-650,0);
dc.LineTo(650,0);
dc.TextOut(655,0,"X",1);
dc.SelectObject(v_pincel);
n_pincel.DeleteObject();
}
Dibujar algo sobre una ventana lleva implícito pintar antes el fondo:,
por ejemplo, de blanco.
Por esta causa, cuando una ventana reciba un mensaje WM.PAINT si
la función OnPaint o la función OnDraw no incluyen código que
dibuje algo, el contenido de la ventana se borrará.
//CElipse
IMPLEMENT_SERIAL(CElipse,CFigura,0)
CElipse:: CElipse(int X1,int Y1,int X2, int Y2,
COLORREF ColorP, int anchop,int Estilop,COLORREF ColorB);
X1(X1),y1(Y1),x2(X2),y2(Y2), CFigura(ColorP,EstiloP,ColorB)
{
}
CElipse::~CElipse()
{
}
void CRepintarliew::OnDibujarCirculo()
{
// Dibujar una circunferencia de radio 100 unidades
CElipse *pCir = new CElipse(-100, 100, 100, -100, RGB(255,255,0), 2);
// Añadir el objeto a la lista
CRepintarDoc* pDoc = GetDocument ():
pDoc->mpListaFiguras->AddHead(pCir);
// Dibujar
InvalidateRect(NULL, TRUE); // indirectamente llama a OnDraw
}
void CRepintarView::OnDibujartexto()
{
// Escribir texto
CTexto *ptex = new CTexto( -15, 0, CString(“Circulo”)):
// Añadir el objeto a la lista
CRepintarDoc* pDoc = GetDocurnent():
pDoc->m_pListaFiguras->AddHead(pTex);
// Dibujar
Ing. Daniel Osorio Maldonado
InvalidateRect(NULL, TRUE); // indirectamente llama a OnDraw 29/11/2019 72
}
La función OnDraw se encarga de pintar la colección objetos.
Para ello, primero establece el sistema de coordenadas y después recorre
la colección de objetos en el mismo orden en el que han sido creados
invocando para cada uno de ellos su función AutoPintado correpondiente
(polimorfismo).
El resultado es el repintado de todos los objetos en el mismo orden que
fueron creados.
void CRepintarView::OnDraw(CDC* pDC) {
CRepintarDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc)
// Tamaño del área de cliente
CRect rect;
GetClientRect( rect );
int cx = (rect.right - rect.left):
int cy = (rect.bottom - rect.top);
// Establecer la escala del sistema de coordenadas
pDC->SetMapMode(MM_ISOTROPIC);
// Tamaño de la ventana
pDC->SetWindowExt( 200. 200 );
// Tamaño del área de dibujo (ventana gráfica)
pDC->SetViewportExt( cx, -cy )
// Establecer el origen de coordenadas en el centro
pDC->SetViewportOrg( cx/2, cy/2 );
// Dibujar
POSITION pos = pDoc->m_pListaFiguras->GetTailPosition();
while ( pos != NULL)
((CFigura *)(PDoc->m_ListaFiguras->GetPrev(Pos))->AutoPintado (PdC);
} Ing. Daniel Osorio Maldonado 29/11/2019 73
Si fuera el caso que a la aplicación se le pidiera dibujar otras figuras diferentes y
de distintos tamaños, se hará necesario que se observe que cada vez que se añade
una nueva figura a la colección, para pintarla hay que pintar todas ella.
Cuando en realidad esto debiera ocurrir solamente cuando la ventana sea ocultada
o redimensionada.
Este problema se soluciona definiendo en la clase CRepintarView una variable
m_bRepintarTodo de tipo BOOL que indique a OnDraw si tiene que repintar todas
las figuras o solamente la ultima dibujada.
Class CRepintarView:public Cview {
//................
//Attributes
public:
CRepintarDoc* GetDocument();
BOOL m_bRepintarTodo;
//..........
};
Inicialice esta variable en el constructor de la clase CRepintarView.
El valor TRUE indicara que hay que repintar todo.
Ing. Daniel Osorio Maldonado 29/11/2019 74
Un valor FALSE indicara que hay que repintar solo la figura que acabamos de
dibujar.
CRepintarView::CRepintarView()
{ m_bRepintadoTodo=TRUE;}
De lo expuesto debe modificar la función OnDraw para que ahora interrogue a la
variable m_bRepintadoTodo y para que deje dicha variable a valor TRUEN por si se
oculta o redimensiona la ventana.
void CRepintarView::OnDraw(CDC* pDC)
{
//.......... //Dibujar
if(m_bRepintado){
POSITION pos=pDoc->m_pListaFiguras ->GetTailPosition();
while (pos !=NULL)
((CFigura*) (pDoc ->m_pListaFiguras ->GetPrev(pos))) ->Autopintado(pDC);
}
else
((CFigura *)(pDC ->m_pListaFiguras ->GetHead())) ->Autopintado(pDC);
m_bRepintadoTodo=TRUE;
Ing. Daniel Osorio Maldonado 29/11/2019 75
}
La variable m_bRepintarTodo sólo debe de valer FALSE cuando pintemos una
nueva figura.
Por consiguiente hay la necesidad de modificar las funciones que llaman a
OnDraw para pintar cada una de las figuras, como se indica a continuación:
void CRepintarView::OnDibujarCirculo() {
// ............
//Dibujar
m_bRepintarTodo=FALSE:
invalidateRect(NULL,FALSE); // indirectamente llama a OnDraw
}
void CRepintarView::OnDibujarTexto()
{
//........
//Dibujar
m_bRepintarTodo=FALSE;
InvalidateRect(NULL,FALSE); //indirectamente llama a OnDraw
}
Agregar el
recurso Dialogo
Clic en New
Cambiando de Nombre el
IDD y el Caption del Recurso
Dialogo
Creando la Clase Funcion1
Editamos la Función
Aquí queda expedito para realizar otra aplicación
DIBUJAR LÍNEAS
La clase CDC de la biblioteca MFC proporciona varias funciones para
dibujar líneas rectas y curvas
Líneas rectas:
BOOL LineTo( int x, int y);
BOOL LineTo( POINT punto);
Line To pinta una línea desde la posición actual de la pluma hasta el punto
lógico especificado por los argumentos x e y, o por el argumento punto.
Por defecto, la posición inicial de la pluma es el punto lógico (0,0).
Puede establecer otro punto utilizando la función MoveTo. MoveTo y LineTo
son las únicas funciones que modifican la posición actual de la pluma.
Esta posición puede obtenerse por medio de la función
CDC::GetCurrentposition
CPoint GetCurrentposition() const;
Líneas curvas:
BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL Arc( LPCRECT lpRect, POINT ptInicio, POINT ptFin;
Arc pinta una línea que se corresponde con un arco delimitado por los
radios que pasan por los puntos (x3, y3) - (x4, y4), perteneciente a la
elipse circunscrita en el rectángulo definido por la esquina superior
izquierda (x1,y1]) y por la esquina inferior derecha (x2, y2).
En el segundo formato de Arc el principio y el final de la línea vienen dados
por los puntos ptInicio y ptFin, y el rectángulo por un objeto CRect o RECT
referenciado lpRect.
El arco
Ing. se pinta
Daniel enMaldonado
Osorio sentido contrario a las agujas del reloj. 29/11/2019 91
Líneas quebradas:
BOOL Polyline( LPPOINT lpPuntos, int nPuntos);
Polyline permite pintar una serie de líneas unidas entre sí.
El argumento lpPuntos representa un array con los puntos que se quieren
conectar y el argumento nPuntos indica el número de puntos
almacenados en el array.
Añada a un menu Graficos el submenu Lineas con las ordenes
Rectas, Curvas y Quebradas.
A continuación utilizando ClassWizard vincule a cada una de estas
ordenes las funciones
OnGraficosLineasRectas,OngraficosLineasCurvas y
OngraficosLineasQuebradas, respectivamente.
Cada una de estas funciones invocara a la función
CDldGraficos::OnPaint para pintar el grafico deseado.
Para saber que orden es la que se ha invocado a OnPaint añada a la
CRepintarView el dato miembro m_uIOrdenMenuGraficos para que
contenga el ID de la orden ejecutada.
Class CRepintarView : public Cview {
//..................
//Atributes
public:
CRepintarDoc* GetDocument();
BOOL m_bRepintarTodo;
UINT m_uIdOrdenMenuGraficos;
// ...........
} Ing. Daniel Osorio Maldonado 29/11/2019 92
Para que la función OnPaint pueda acceder a m_uIdOrdenMenuGraficos
necesita conocer un puntero a la vista.
Para ello añada a la clase CDlgGraficos el dato miembro pView para que
almacene un puntero a la vista.
Class CDlgGraficos: public Cdialog
{
private:
//Puntero a la vista
CrepintarView *pView;
//........
}
Cada vez que crea un objeto de la clase CDlgGraficos para visualizar una
caja de dialogo con el fin de mostrar un grafico, pase como argumento al
constructor de la clase, el puntero a la vista.
Vea la función OnGraficosPuntos
COLOREAR FIGURAS
Una figura puede ser rellenada utilizando un pincel de un color
sólido o un pincel según Un determinado patrón. Para crear un
pincel de un color sólido, vimos en el capítulo 6 la función
CreateSolidBrush En cambio, para crear un pincel que rellene
según un determinado patrón, utilizaremos la función miembro
CreateHatchBrush de la clase CBrush:
BOOL CreateHatchBrush( int nEstilo, COLORREF crColor );
Los valores posibles para nEstilo se indican en la tabla siguiente. El
parámetro crColor es el color de las líneas que forman el patrón.