Red de conocimiento informático - Material del sitio web - En la programación MFC, existe un concepto llamado "contexto de dispositivo". Por favor ayuden a los expertos, gracias.

En la programación MFC, existe un concepto llamado "contexto de dispositivo". Por favor ayuden a los expertos, gracias.

Simplemente léelo como DC directamente.

Es sólo un nombre.

Contexto del dispositivo significa que el significado del contexto del primer dispositivo es diferente.

Aunque ambos se llaman DC, el DC de diferentes dispositivos tiene funciones diferentes.

Comprensión de DC (Contexto del dispositivo) en Vc

P: ¿Cuál es el concepto de tabla de descripción de dispositivo DC? ¿Alguien puede explicarlo en términos sencillos? Gracias de antemano.

Al aprender Vc, lo primero que encuentra es este dc, que se utiliza para configurar tablas de descripción, generar texto y dibujar. Parece ser demasiado importante. Pero simplemente no entiendo qué es esto.

He leído algunos tutoriales, pero todavía no lo entiendo del todo. ¿Alguien puede explicarlo en términos sencillos para que pueda entenderlo rápidamente?

Respuesta: 1. Antes de pintar, es necesario preparar lienzo, pinceles, paleta, etc.

Cuando se utilizan funciones GDI como MoveToEx/LineTo, TextOut, solo le dice al sistema que dibuje líneas o escriba, pero qué tipo de bolígrafo se utiliza (HPEN), de qué color es la palabra (SetTextColor), ¿Y dónde se extrae? Es necesario leer un "papel" (HBITMAP) a partir de una estructura de datos definida por el sistema.

Esta estructura de datos se llama Contexto de Dispositivo (DC).

Es decir, la función GDI es solo la acción de pintar, mientras que DC guarda los materiales y herramientas necesarios para pintar.

2. Función de contexto del dispositivo (Contexto del dispositivo)

El contexto del dispositivo es una estructura que define una serie de objetos gráficos y sus atributos relacionados, así como métodos de dibujo que afectan los resultados de salida. . Estos objetos gráficos incluyen: bolígrafos (utilizados para dibujar líneas rectas), pinceles (utilizados para dibujar y rellenar), mapas de bits (utilizados para copiar o desplazarse por la pantalla), paletas (utilizadas para definir el conjunto de colores disponibles) y áreas de recorte. . (para recortar y otras operaciones), rutas (para operaciones de dibujo y pintura). Las funciones del entorno del dispositivo se utilizan para crear, eliminar u obtener información sobre el entorno del dispositivo.

P: ¿Cuáles son las diferencias esenciales entre DC, CDC, HDC, CClientDC....?

Respuesta: Todos son DC. HDC es el identificador de DC original. El primer parámetro de muchas API es un tipo HDC, como

HDC hDC = ::GetDC( m_hWnd ). ;

::MoveToEx( hDC, 0, 0, NULL

::LineTo( hDC, 0, 100, );

:: ReleaseDC); ( m_hWnd, hDC );

En MFC, para encapsular la API en una clase para su operación, hay un CDC adicional. Entonces, en MFC, todo es

CDC dc = GetDC();

dc.MoveTo( 0, 0 );

dc.LineTo( 0, 100 );

this->ReleaseDC( &dc );

Pero esto no es suficiente, porque CDC requiere que usted lo publique usted mismo y hay un CClientDC más en todos los MFC, por lo que usted Esto es:

CClientDC dc(this);

dc.MoveTo( 0, 0 );

dc.LineTo( 0, 100 );

El destructor de CClientDC se liberará solo.

DC no es un objeto, es la abreviatura de contexto del dispositivo.

Igual que CClientDC, también existen CWindowDC y CPaintDC, pero sus rangos de dibujo son diferentes.

Pero al final, es solo una encapsulación de HDC. Puede hacer referencia directamente a m_hDC en la clase CDC, que es el identificador HDC original.

CDC es una clase de DC de MFC

HDC es el identificador de DC, un tipo de datos similar a un puntero en la API.

Los prefijos de las clases de MFC son Comienza con C

La mayoría de las palabras que comienzan con H son identificadores

Esto es para mnemónicos y es un buen hábito para que la programación lea y escriba código.

CDC La clase base de todos los DC de MFC. El CClientDC dc(this) de uso común es una subclase (o clase derivada) de CDC.

Los CDC y otros dispositivos se clasifican hacia arriba y hacia abajo, y todos contienen variables miembro de una clase: m_nHdc; es decir, un identificador del tipo HDC.

Recuerde la siguiente oración, que le ayudará a comprender.

Las clases MFC se desarrollan utilizando declaraciones API de ventana. Un pequeño programa con ciertas funciones (también se puede llamar clase). El método predeterminado para usarlo es recordar su nombre y parámetros (puede usar notas en lugar de notas cerebrales). p>Si cambia la ventana API y se compara con el lenguaje ensamblador

Entonces MFC es equivalente al lenguaje básico.

A continuación se presenta la parte más importante de Vc-MFC

CWnd: ventana, es la clase principal de la mayoría de las "cosas visibles" (casi todo lo visible en Windows es una ventana y hay muchas ventanas pequeñas en una ventana grande), como la vista CView y la ventana de marco CFrameWnd. , la barra de herramientas CToolBar y los cuadros de diálogo CDialog, botones CButton, etc. una excepción es que los menús (CMenu) no se derivan de Windows. Esta categoría es enorme, por lo que no es necesario que la aprendas desde el principio, solo conócela.

CDocumento documento es responsable de la interacción entre los datos de la memoria y el disco. Los más importantes son OnOpenDocument (lectura), OnSaveDocument (escritura en disco) y Serialize (lectura y escritura)

CView, que es responsable de la interacción entre los datos de la memoria y los usuarios. Incluyendo visualización de datos, respuesta de operación del usuario (como selección de menú, respuesta del mouse). Lo más importante es OnDraw (redibujar ventana), que normalmente se inicia con CWnd::Invalidate(). Además, maneja menús, barras de herramientas, teclas de acceso directo y otros mensajes de usuario a través de mapas de mensajes. Se le deben añadir muchas funciones propias, y es con la que más te ocupas.

Texto del dispositivo CDC. Ya sea un monitor o una impresora, dibujan imágenes para que las vea el usuario. Esta imagen está extraída de los CDC. CDC, junto con otros GDI (Graphics Device Interface), completa la visualización de texto, gráficos e imágenes. Piense en el CDC como una hoja de papel. Cada ventana está asociada con un CDC que es responsable de dibujar la ventana. CDC tiene una subclase común CClientDC (área de cliente de ventana), y el dibujo generalmente se completa a través de CClientDC.

Cuadro de diálogo CDialog

Clase de aplicación CWinApp. Similar a la función principal en C, es la entrada y administrador de la ejecución del programa, responsable de la creación y destrucción del programa y de la creación de la ventana principal y la plantilla del documento. La función más utilizada InitInstance(): inicialización.

CGdiObject y sus subclases se utilizan para dibujar imágenes en texto del dispositivo. Todos deben seleccionarse en el DC antes de su uso.

CPen lápiz, dibuja líneas

CBrush pincel, rellena

CFont font, controla la fuente de salida de texto

CBitmap bitmap

p>

Paleta CPalette

Área CRgn, designa un área que se puede utilizar para procesamiento especial.

Archivo CFile. Los más importantes son Abrir, Leer y Escribir

Cadena CString. Encapsula la matriz de caracteres en C y es muy práctico.

CEl punto es (x, y) par

CEl rectángulo correcto es (izquierda, arriba, derecha, abajo)

CEl tamaño es (cx, cy) par (ancho, alto)

Windows utiliza un contexto de dispositivo gráfico independiente del dispositivo (DC: Device Context) para la visualización. La biblioteca de clases básicas de MFC define la clase de objeto del entorno del dispositivo ---- clase CDC.

La relación entre CDC y CGdiObject

Cuando se trata de la clase CDC, no podemos dejar de mencionar GdiObject, la clase de objeto gráfico. En las aplicaciones de Windows, el entorno del dispositivo y los objetos gráficos trabajan juntos para completar el trabajo de visualización del dibujo. Al igual que la pintura de un pintor, el entorno del dispositivo es como el lienzo del pintor y el objeto gráfico es como el pincel del pintor. Utilice un pincel para pintar sobre el lienzo. Diferentes pinceles dibujarán diferentes pinturas. Sólo seleccionando objetos gráficos y objetos de dibujo apropiados podrá completar la tarea de dibujo según sea necesario.

Herencia de la clase CDC

Clase padre: heredada directamente de CObject. Hereda varias características de la clase CObject, como la creación dinámica, etc.

Subclase: CClientDC------DC que representa la ventana de operación, que es una subclase de uso común

CMetaFileDC------DC que responde a Meta File, Meta El archivo son algunos mensajes GDI.

CPaintDC-------DC que responde al mensaje WM_PAINT.

CWindowDC ------DC que representa toda la pantalla

Miembros de datos de la clase CDC

Solo hay dos miembros de datos:

HDC m_hDC: el contexto del dispositivo de salida utilizado por el objeto CDC

HDC m_hAttribDC: el contexto del dispositivo de atributo utilizado por el objeto CDC

Ambos apuntan al mismo contexto de dispositivo cuando el Se crea el objeto CDC.

Pregunta: VC explica CDC *pDC=pWnd->GetDC();

Respuesta: Todas las clases y funciones relacionadas utilizadas en el dibujo se reúnen y se denominan Es el contexto del dispositivo. o entorno del dispositivo. Puedes pensar en esta colección de clases como una superclase. GetDC() es una función que obtiene el derecho a usar DC, lo que significa que te da el identificador (o puntero), lo que significa que te da la clave para usarlo. Puedes utilizar todas sus funciones ahora. No es necesario utilizar una función API para cada acción de dibujo. Si no desea cambiar su valor predeterminado, puede dibujar directamente. Por supuesto, proporciona funciones más potentes y más funciones que la API. Por supuesto, para los principiantes, lo más conveniente es que no necesitan recordar muchas funciones. Después de usarlo para crear una instancia de un objeto (también llamado obtener el contexto del dispositivo (DC)), solo necesitan usar -. > o . Utilice la ayuda para seleccionar la función adecuada.

CDC *pDC=pWnd->GetDC();

1. Utilice CDC (contexto de dispositivo MFC) para crear una instancia de un puntero de objeto

2. puntero de este objeto a pWnd

3. pWnd se asigna a GetDC Es equivalente a usar el DC de la API para crear una instancia del puntero pWnd de un objeto

Resumen: Uso de MFC. contexto del dispositivo Crea una instancia de un objeto de punteros cuyo valor proviene de la creación de instancias del contexto del dispositivo de la API.

=============

De hecho, la mayoría de las funciones llamadas por MFC finalmente llaman a las funciones correspondientes en la API

P: ¿Cuál es la función de this->GetDC() usado para dibujar en VC++? También está esto->ReleaseDC(pDC)

Respuesta: 1. Este puntero es el puntero del objeto de la clase actual. Apunta al objeto después de que se crea una instancia de la clase. puntero. Cada objeto Hay uno. Es conveniente de usar. No necesita definir punteros usted mismo.

------------------- ------------ ----------

2. this->GetDC(); Obtener DC,

Equivalente a

CDC *pDC;

pDC->GetDC();

También equivalente a

CDC dc;

dc.GetDC();

---------------------------------

3. esto-> ReleaseDC() es para liberar DC

------------------------ ---------------

4. DC a menudo se denomina contexto de dispositivo o entorno de dispositivo. Es una colección muy grande de clases o funciones. dibujo, impresión y otras clases y funciones relacionadas. Siempre que declare su objeto o puntero, obtendrá el derecho de utilizar todas sus clases y funciones, como bolígrafos, pinceles, mapas de bits, funciones de dibujo... y así. on. Todo lo que necesita hacer es usar /dc. /this->/pDC->etc. puede llamar directamente a su función.

CClientDC

La clase CClientDC se deriva de CDC. y la función de Windows GetDC se llama durante la construcción. ReleaseDC se llama durante la destrucción. Esto significa que el contexto del dispositivo asociado con el objeto CClientDC es el área del cliente de la ventana.

Varios DC y sus diferencias

CClientDC: (Contexto de dispositivo del área del cliente) se utiliza para la salida del área del cliente. Está asociado a una ventana específica y permite a los desarrolladores acceder a ella. área del cliente en la ventana de destino Su constructor contiene GetDC y su destructor contiene ReleaseDC:

El uso es: CClientDC dc(this);//esto generalmente apunta a esta ventana o a la vista activa actual dc. TextOut(10,10, str,str.GetLength());// Use dc para generar texto. Si se usa en CScrollView, también preste atención a llamar a OnPrepareDC(&dc) para ajustar las coordenadas del contexto del dispositivo. CPaintDC se utiliza para dibujar resultados en respuesta a mensajes de redibujado de ventanas (WM_PAINT). CPaintDC llama a BeginPaint() en el constructor para obtener el contexto del dispositivo y llama a EndPaint() en el destructor para liberar el contexto del dispositivo. Además de liberar el contexto del dispositivo, EndPaint() también es responsable de borrar los mensajes WM_PAINT de la cola de mensajes. Por lo tanto, al manejar el redibujado de ventanas, se debe usar CPaintDC; de lo contrario, el mensaje WM_PAINT no se puede borrar de la cola de mensajes, lo que provocará un redibujado continuo de ventanas. CPaintDC solo se puede utilizar en el procesamiento de mensajes WM_PAINT.

Detach();}CWindowDC: asocia una ventana específica, lo que permite a los desarrolladores dibujar en cualquier parte de la ventana de destino, incluidos los bordes y los títulos. Este DC se envía junto con el mensaje WM_NCPAINT

<. p > La diferencia entre CWindowDC y CClientDC, CPaintDC: CWindowDC puede dibujar gráficos en el área que no es del cliente, mientras que CClientDC, CPaintDC solo puede dibujar gráficos en el área del cliente.

El origen de coordenadas inferior de CWindowDC está en la esquina superior izquierda de la pantalla, y el origen de coordenadas inferior de CClientDC y CPaintDC está en la esquina superior izquierda del área del cliente. La diferencia entre CClientDC y CPaintDC:

El objeto CPaintDC se usa generalmente en OnPaint para responder al mensaje de Windows WM_PAINT, completar automáticamente el dibujo y volver a dibujar toda la ventana para mantener la integridad de la ventana original. La aplicación CClientDC realiza un dibujo en tiempo real sin responder al mensaje de Windows WM_PAINT y el área dibujada se vuelve a dibujar.

La relación entre CDC y CGdiObject

Hablando de la clase CDC, no podemos dejar de mencionar GdiObject, la clase de objeto gráfico. En las aplicaciones de Windows, el entorno del dispositivo y los objetos gráficos trabajan juntos para completar el trabajo de visualización del dibujo. Al igual que la pintura de un pintor, el entorno del dispositivo es como el lienzo del pintor y el objeto gráfico es como el pincel del pintor. Utilice un pincel para pintar sobre el lienzo. Diferentes pinceles dibujarán diferentes pinturas. Sólo seleccionando objetos gráficos y objetos de dibujo apropiados podrá completar la tarea de dibujo según sea necesario.

Herencia de la clase CDC

Clase principal: Hereda directamente de CObject. Hereda varias características de la clase CObject, como la creación dinámica, etc.

Subclase: CClientDC------DC que representa la ventana de operación, que es una subclase más utilizada

CMetaFileDC------DC que responde a Meta File. Meta File son algunos mensajes GDI.

CPaintDC-------DC que responde al mensaje WM_PAINT.

CWindowDC ------DC que representa toda la pantalla

Miembros de datos de la clase CDC

Solo hay dos miembros de datos:

HDC m_hDC: contexto del dispositivo de salida utilizado por los objetos CDC.

HDC m_hAttribDC: Contexto del dispositivo de atributo utilizado por los objetos CDC.

Ambos apuntan al mismo contexto de dispositivo cuando se crea el objeto CDC.

Archivos de encabezado requeridos: #include