Dibujar en una vista
Casi todos los dibujos de la aplicación se producen en la función miembro de la vista OnDraw
, que debe invalidar en la clase de vista. (La excepción es el dibujo del mouse, que se describe en Interpretación de la entrada del usuario a través de una vista). Su invalidación OnDraw
:
Obtiene los datos llamando a las funciones miembro del documento que se proporcione.
Muestra los datos mediante una llamada a las funciones miembro de un objeto de contexto del dispositivo que el marco pasa a
OnDraw
.
Cuando los datos de un documento cambian de alguna manera, la vista debe volver a dibujarse para reflejar los cambios. Normalmente, esto sucede cuando el usuario realiza un cambio a través de una vista del documento. En este caso, la vista llama a la función miembro UpdateAllViews del documento para notificar a todas las vistas del mismo documento que se actualicen. UpdateAllViews
llama a la función miembro OnUpdate de cada vista. La implementación predeterminada de OnUpdate
invalida todo el área de cliente de la vista. Puede invalidarlo para reemplazar solo las regiones del área de cliente que se asignan a las partes modificadas del documento.
La función miembro UpdateAllViews
de la clase CDocument
y la función miembro OnUpdate
de la clase CView
permiten pasar información que describe qué partes del documento se modificaron. Este mecanismo de "sugerencia" permite limitar el área que la vista debe volver a dibujar. OnUpdate
toma dos argumentos de "sugerencia". El primer, lHint, de tipo LPARAM, permite pasar los datos que desee, mientras que el segundo, pHint, de tipo CObject
*, permite pasar un puntero a cualquier objeto derivado de CObject
.
Cuando una vista deja de ser válida, Windows la envía un mensaje WM_PAINT. La función de controlador OnPaint de la vista responde al mensaje mediante la creación de un objeto de contexto del dispositivo de la clase CPaintDC y llama a la función miembro de la vista OnDraw
. Normalmente no es necesario escribir una función del controlador de invalidación OnPaint
.
Un contexto de dispositivo es un objeto de Windows donde se incluye información sobre los atributos de dibujo de un dispositivo como una pantalla o una impresora. Todas las llamadas de dibujo se realizan mediante un objeto de contexto de dispositivo. Para dibujar en la pantalla, OnDraw
se pasa un objeto CPaintDC
. Para dibujar en una impresora, se pasa un objeto CDC configurado hacia la impresora actual.
El código para dibujar en la vista recupera primero un puntero al documento y después realiza llamadas de dibujo a través del contexto del dispositivo. El siguiente ejemplo sencillo OnDraw
ilustra el proceso:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString s = pDoc->GetData(); // Returns a CString
CRect rect;
GetClientRect(&rect);
pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
}
En este ejemplo, se definiría la función GetData
como un miembro de la clase de documento derivada.
En el ejemplo se imprime la cadena que obtiene del documento, centrada en la vista. Si la llamada OnDraw
es para el dibujo de pantalla, el objeto CDC
pasado en pDC es un CPaintDC
cuyo constructor ya ha llamado a BeginPaint
. Las llamadas a las funciones de dibujo se realizan a través del puntero de contexto del dispositivo. Para obtener información sobre los contextos del dispositivo y las llamadas de dibujo, consulte la clase cdc en la Referencia de MFC y Trabajar con objetos de ventana.
Para obtener más ejemplos de cómo escribir OnDraw
, consulte los Ejemplos de MFC.