Red de conocimiento informático - Descarga de software - Función de punto de dibujo

Función de punto de dibujo

Programación de Imágenes en WINDOWS

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

Uno de los principales objetivos de la interfaz de dispositivo gráfico (GDI) es admitir gráficos independientes del dispositivo en dispositivos de salida como monitores de vídeo, impresoras y trazadores. GDI permite que las aplicaciones de Windows se ejecuten sin problemas en cualquier dispositivo de salida de gráficos compatible con Windows aislando aplicaciones de diferentes características del dispositivo de salida.

Los gráficos en Windows están hechos básicamente a partir de GDI. Se manejan las funciones de salida en el módulo EXE (aunque algunas funciones de dibujo en realidad tienen puntos de entrada USER.EXE), GDI. El módulo EXE llama a rutinas en diferentes archivos de controlador, incluido un archivo . El archivo del controlador DRV se utiliza para controlar la pantalla y puede haber uno o más archivos . Los archivos del controlador DRV se utilizan para controlar impresoras o trazadores.

Windows GDI utiliza dos sistemas de coordenadas. El uso del sistema de coordenadas virtuales puede hacer que el programa sea independiente del hardware específico, y el uso del sistema de coordenadas del dispositivo puede hacer que el programa y el hardware estén estrechamente vinculados.

GDI contiene funciones de operación de gráficos independientes del dispositivo que se ejecutan dentro de las aplicaciones de Windows. Estas funciones pueden producir una variedad de líneas, texto y mapas de bits, que se pueden enviar a muchos dispositivos de salida diferentes. GDI permite que una aplicación genere plumas, pinceles, fuentes y mapas de bits para usar en operaciones de salida específicas. A continuación se enumeran varios grupos de funciones comúnmente utilizadas en GDI:

·Funciones de contexto del dispositivo

·Funciones de elipse y polígono

·Funciones de herramientas de dibujo

·Función de mapa de bits

·Función de atributo de dibujo

·Función de rescate de texto

·Función de mapeo.

·Función de coordenadas

·Función de metarchivo

·Función de región

·Función de recorte·

p>

Los pasos para que la aplicación de ventana genere gráficos son los siguientes:

① Obtenga el contexto del dispositivo de visualización actual de la ventana especificada. El contexto del dispositivo de visualización es en realidad una estructura de datos, que incluye los parámetros de la ventana. ventana y Los valores de configuración actuales de varios gráficos y atributos de texto, que controlan futuros comandos de salida de texto y gráficos.

②Seleccione el sistema de coordenadas del usuario y el método de mapeo.

③Establezca la ventana de observación en el sistema de coordenadas del usuario y la ventana gráfica de visualización en el sistema de coordenadas del dispositivo.

④Gráficos de salida, texto e imágenes.

⑤ Libera el contexto del dispositivo de visualización utilizado.

Cuando desee dibujar gráficos en un dispositivo de salida de gráficos (como una pantalla o una impresora), primero debe obtener un identificador del contexto del dispositivo. Después de proporcionar este identificador primero, Windows permite que el programa use el dispositivo. Pase el identificador como parámetro en la función GDI para indicarle a Windows el dispositivo que debe usarse.

El contexto del dispositivo contiene muchas propiedades, que se utilizan cuando GDI funciona en diferentes dispositivos. El uso de estas propiedades permite a GDI preocuparse solo por el tamaño de las coordenadas iniciales y finales, sin tener que preocuparse por otras propiedades del objeto, como el color, el fondo, etc., porque todas ellas son parte del contexto del dispositivo. Cuando necesite modificar estas propiedades, solo necesita llamar a un parámetro que modifique las propiedades en el contexto del dispositivo, y las propiedades del contexto del dispositivo modificadas se usarán en programas posteriores. El contexto del dispositivo es el vínculo entre las aplicaciones de Windows, los controladores de dispositivos y los dispositivos de salida.

Hay muchas formas de obtener el identificador de contexto del dispositivo. El enfoque más general es obtener el contexto del dispositivo al procesar un mensaje y liberarlo antes de salir de la ventana.

El método de procesamiento general es el siguiente:

Al procesar el mensaje WM_PAINT

caso WM_PAINT:

hdc=BeginPaint(hwnd, &ps)

EndPaint (hwnd, &ps);

La estructura de datos es:

HDC hWnd;

PAINTSTRUCT ps;

Y en ventanas. La estructura de datos de PAINTSTRUCT está definida en h.

tipo struct tagPAINTSTRUCT {

HDC hdC;

BOOL fErase

RECT rcPaint

BOOL fRestore; ;

BOOL flncUpdate;

BYTE rgbReserved[16];

}PAINTSTRUCT;

Entre ellos, hdc se utiliza para identificar el contexto explícito, fErase indica si el fondo se vuelve a dibujar, rcPaint es el rectángulo pintado y el resto de los campos están reservados. hdc aquí es el identificador de contexto del dispositivo devuelto por BeginPaint. Con el identificador de contexto del dispositivo obtenido de DeginPaint, puede y solo puede dibujar dentro del rectángulo de rcPaint señalado por ps. La llamada a EndPaint hace que esta área sea válida.

El segundo método es el siguiente. El uso de este método para obtener y liberar el contexto del dispositivo puede dibujar imágenes en toda el área del usuario y los gráficos son válidos en toda el área del usuario:

>hdC= GetDc (hwnd);

...Operación de dibujo...

ReleaseDC (hwnd, hdc);

Utilice el tercer método siguiente para Para obtener y liberar el contexto del dispositivo, puede dibujar en toda la ventana y los gráficos son válidos en toda la ventana:

hdC=GetWindowDc(hwnd);

...Dibujar operación...

ReleaseDc(hwnd, hdc );

Utilice el cuarto método a continuación para obtener y liberar el contexto del dispositivo, puede dibujar imágenes dentro del área de visualización completa y el los gráficos son válidos dentro de toda el área de visualización:

hdc=CreateDC (lpszDriver, lpszDevice, lpszOutput, lpData);

...operación de dibujo...

ReleaseDC (hdc);

donde lpszDriver apunta al nombre del archivo DOS del controlador del dispositivo (sin extensión), lpszDevice apunta al nombre del dispositivo dedicado (como Epson Fx-80), lpszOutput apunta al Nombre del archivo DOS o nombre del dispositivo del medio de salida físico (archivo o puerto de salida), y lpData apunta al DEVMODE que contiene la estructura de datos de inicialización específica del dispositivo. Por ejemplo:

hdc=CreateDC ("DISPLAY", NULL, NULL, NULL

Usar dibujo de pantalla y:

hdc= CreateDC ("); IBMGRX ","IBM Graphics","LPT1",NULL);

Gráficos de salida en la impresora. Aquí lpData se establece en el valor predeterminado, que se puede configurar en WIN. El valor de inicialización se encuentra en el INI.

Si no necesita obtener el contexto del dispositivo, es decir, no necesita operar en el contexto del dispositivo y solo necesita conocer información sobre el contexto del dispositivo, puede utilizar la siguiente declaración :

hdcInfo = CreateDC (lpszDriver, lpszDevice, lpszOutput, lpData);

......

DeteteDC (hdcInfo);

Además, el contexto del dispositivo también se puede utilizar para controlar la memoria del mapa de bits, como se muestra a continuación:

hdcMem = CreateCompatibleDC (hdc)

OeleteDc (hdcMem);

Un metarchivo es una colección de llamadas GDI codificadas en formato binario. Se puede crear un archivo obteniendo un contexto de dispositivo de metarchivo:

hdcMeta=CreateMetaFile(lpszFilename);

...

hmf=CloseMetaFile(hdCMeta);

Mientras el contexto del dispositivo del metarchivo es válido, cualquier llamada GDI realizada utilizando hdcMeta pasa a formar parte del metarchivo cuando CloseMetaFile es. llamado, el cambio de identificador de contexto del dispositivo no es válido y la función devuelve el identificador del metarchivo (hmf).

El contexto de un dispositivo generalmente involucra un dispositivo físico, como un monitor de video, una impresora, etc., por lo que es necesario obtener información sobre el dispositivo, como el tamaño de la pantalla y las capacidades de color. Puede obtener dicha información llamando a la función GetDeviceCaps:

nValue=GetDeviceCaps (hdc, nIndex);

Aquí el hdc identifica el contexto del dispositivo y nIndex determina el valor de retorno, que puede ser ventana . Uno de los 28 identificadores definidos en h, como nIndex=DRIVEVERSION, la función devuelve el número de versión.

El atributo de contexto del dispositivo que realmente afecta el proceso de dibujo en el área de usuario es el "modo de mapeo". Estrechamente relacionados con el atributo del modo de mapeo están los siguientes cuatro atributos de contexto del dispositivo: origen de ventana, origen de ventana y. rango de ventana y rango de ventana.

Windows define ocho métodos de mapeo, a saber:

El TWIP aquí se refiere a 1/1440 de pulgada, pulg. Representa pulgadas.

Puedes llamar a la función setMapMode(hdc, MapMode) para configurar uno de estos ocho métodos de mapeo. hdc se utiliza para identificar el contexto del dispositivo, nMapMode puede tomar uno de ocho valores, como MM_TEXT, MM_LOMETRIC, MM_HIMETRIC. Después de configurar el método de asignación, Windows siempre utilizará este método de asignación hasta la próxima vez que se configure el método de asignación. Si desea obtener el modo de mapeo actual, puede usar:

nMapMode= GetMapMode (hdc)

Después de configurar el modo de mapeo, el tamaño y el método de incremento de la unidad lógica son especificado, en la función de dibujo GDI, puede usar números lógicos directamente sin considerar estos contenidos, como:

SetMapMode (hdc, MM_TEXT);

TextOut (hdc, 8,); 16, szBuffer , nLength)

Es decir, el texto comienza a escribirse desde el octavo píxel desde la izquierda del área de usuario y el 16º píxel desde arriba. Independientemente del método de mapeo, todas las coordenadas en las funciones de Windows se especifican como enteros cortos con signo entre -32768 y 32767.

Tenga en cuenta que el método de mapeo es solo un atributo de contexto del dispositivo, por lo que lo único que funciona con el método de mapeo es la función GDI que usa el método de mapeo como atributo de identificador de contexto del dispositivo y usa el identificador como atributo. parámetro, por lo que las funciones que no son GDI, como las funciones GDI de GetSystemMetrics, continuarán devolviendo valores de tamaño en unidades de dispositivo (valores de píxeles).

Utilice la función SetPixel de GDI para dibujar píxeles de un color específico:

rgbActualColor =SetPixel (hdc, x, y, rgbColor);

Aquí hdc identifica el contexto del dispositivo.Valor de brillo, el segundo byte contiene el valor de brillo relativo del color primario verde, el tercer byte contiene el valor de brillo relativo del color primario azul y el byte de orden superior debe ser cero. Puede utilizar la función RGB para obtener rgbColor.

rgbColor = RGB (byRed, byGreen, byBlue);

El rango de valores de byRed, byGreen y byBlue aquí es de 0 a 255, lo que representa el brillo de rojo, verde y azul respectivamente. Dados los parámetros correctos, SetPixel devuelve el color en la paleta más cercano al color deseado. También puede utilizar el siguiente método para obtener el color de un píxel específico:

rgbCotor= GetPixel(hdc, x, y);

Hay tres funciones principales de dibujo de líneas, LineTo , Polilínea y Arco. También hay cinco propiedades de contexto del dispositivo que afectan la apariencia de las líneas dibujadas por estas funciones: la posición actual del lápiz (afecta únicamente a LineTo), el lápiz, el modo de fondo (afecta a los lápices no sólidos) y el color de fondo (afecta al modo de fondo OPANO). ). ) y cómo dibujarlo.

Entre las propiedades de estos contextos de dispositivo, la posición actual del lápiz afecta el punto inicial del dibujo lineal, el lápiz afecta el grosor y otras formas de la línea, el modo de fondo afecta los gráficos de plantilla de la línea dibujada por el lápiz no sólido y el color de fondo afecta el color de fondo de la plantilla de línea, el método de dibujo afecta la línea continua, la línea de puntos y otros atributos de línea.

Los siguientes son pasos típicos de la operación de dibujo lineal:

MoveTo (hdc, xStart, yStart);

LineTo (hdc, xEnd, yEnd);

p>

Las dos oraciones anteriores dibujan una línea recta desde (xStart, yStart) hasta (xEnd, yEnd).

Puedes usar la declaración:

dwPoint = GetCurrentPosition (hdc);

Obtener la posición actual del lápiz. Aquí, el valor de retorno de dwPoint es un entero largo sin signo (o palabra de doble longitud), donde la palabra de orden inferior contiene la coordenada X y la palabra de orden superior contiene la coordenada Y.

Puedes utilizar la función MAKEPOINT para convertir dwPoint en una estructura PUNTO

point = MAKEPOINT (dwPoint);

El tipo de punto es PUNTO:

typedef struct togPOINT {kk1}

int x;

int y

}POINT; se utiliza para dibujar polilíneas, Ejemplo:

Polilínea (hdc, &pt, 5)

Conecta los 5 puntos en la matriz pt con segmentos de línea.

Arco se utiliza para dibujar el perímetro de la elipse:

Arco (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, XEnd, yEnd);

La elipse dibujada está delimitada por un rectángulo cuya esquina superior izquierda es (xLeft, yTop) y cuya esquina inferior derecha es (xRight, yBottom). El arco comienza en la intersección de la elipse y la línea que conecta (xStart, yStart). ) y el centro de la elipse. La periferia de la elipse se dibuja en el sentido de las agujas del reloj y termina en la intersección de la elipse y (xEnd, yEnd) con la pequeña línea que conecta la elipse.

Al llamar a LineTo, Polyline y Arc, Windows usa el lápiz seleccionado actualmente en el contexto del dispositivo para dibujar la línea. El lápiz determina el color, la densidad y el estilo de la línea, y el tipo de línea puede hacerlo. Puede ser una línea continua, una línea de puntos o una línea discontinua. El lápiz en el contexto predeterminado del dispositivo se llama BLACK_PEN. Independientemente del método de mapeo, seleccione un lápiz para dibujar una línea negra sólida con un ancho de un píxel. es uno de los tres "bolígrafos de respaldo" proporcionados por Windows. Uno, los otros dos son WHITE_PEN y NULL_PEN es un bolígrafo vacío que no dibuja nada.

Se puede hacer referencia al lápiz deseado mediante un identificador:

HPEN hPen;

hPen = GetStockObject(WHITE_PEN);

SelectObjeCt ( hdc, hPen);

SelectObject (hdc, hBrush);

Coloque el pincel lógico en el contexto del dispositivo. Si finaliza el uso, puede utilizar:

DeletObject (hBrush);

Eliminar un pincel establecido. Si necesita obtener información sobre el pincel en el programa, puede llamar. :

3. Estructura de formato de píxeles

Cada dispositivo de visualización OpenGL admite un formato de píxeles específico. Generalmente, se utiliza una estructura denominada PIXELFORMATDESCRIPTOR para representar un formato de píxel especial. Esta estructura contiene información de 26 atributos.

Win32 define PIXELFORMATDESCRIPTOR de la siguiente manera:

typedef struct tagPIXELFORMATDESCRIPTOR

{ kk1}

// pfd

WORD nSize

;

WORD nVersion;

DWORD dwFlags;

BYTE iPixelType;

BYTE cColorBits;

BYTE cRedBits;

BYTE cRedShift;

BYTE cGreenBits;

BYTE cBlueShift;

BYTE cBlueShift;

BYTE cAlphaBits;

BYTE cAlphaShift;

BYTE cAccumBits;

BYTE cAccumRedBits

BYTE cAccumGreenBits;

BYTE cAccumBlueBits;

BYTE cAccumAlphaBits;

BYTE cDepthBits;

BYTE cStencilBits;

BYTE cAuxBuffers;

BYTE iLayerType;

BYTE bReservado;

DWORD dwLayerMask;

DWORD dwVisibleMask

DWORD dwDamageMask;

}PIXELFORMATDESCRIPTOR;

4. Inicialización de la estructura PIXELFORMATDESCRIPTOR

Para conocer el significado y la configuración específicos de cada valor de variable en PIXELFORMATDESCRIPTOR, consulte la información relevante a continuación. Se proporciona un ejemplo de inicialización de PIXELFORMATDESCRIPTOR para explicar brevemente el significado de las variables relevantes.

El dfp que define la estructura PIXELFORMATDESCRIPTOR es el siguiente:

PIXELFORMATDESCRIPTOR pfd = { kk1}

sizeof(PIXELFORMATDESCRIPTOR), //tamaño de este dfp 1

PFD_DRAW_TO_WINDOW| / / ventana de soporte

PFD_SUPPORT_OPENGL| // soporte OpenGL

PFD_DOUBLEBUFFER, // doble buffer

PFD_TYPE_RGBA, // tipo RGBA

24 , // profundidad de color de 24 bits

0, 0, 0, 0, 0, 0, // bits de color ignorados

0, // sin búfer alfa

0, // bit de desplazamiento ignorado

0, // sin beneficio de acumulación

0,0,0,0, // bits de acumulación ignorados

32, // búfer z de 32 bits

0, // sin búfer de plantilla

0, // sin búfer auxiliar

PFD_MAIN_PLANE, // capa principal

0, // reservada

0, 0, 0 // máscaras de capa ignoradas

}; >En esta estructura Aquí, el significado de las dos primeras variables es muy obvio. El valor de la tercera variable dwFlags es

PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL,

indica que la aplicación utiliza funciones OpenGL para dibujar la ventana

La cuarta:

PFD_DOUBLEBUFFER,

indica que actualmente se usa el modo de color RGBA, y el quinto usa color verdadero de 24 bits, que son 16,7 millones de colores. Si es un sistema de 256 colores, color. el tramado se implementará automáticamente porque no hay caché alfa y caché de acumulación, por lo que las variables cAlphaBits a cAccumAlphaBits están todas configuradas en 0, el caché de profundidad está configurado en 32 bits, este caché puede resolver el problema de borrado de los tres; escena dimensional; la variable cAuxBuffers está configurada en 0, el caché auxiliar no es compatible con Windows 95. En Windows 95, la variable OpenGL ilayerType solo se puede configurar en PFD_MAIN_PLANE, pero otras plataformas pueden admitir PFD_MAIN_PLANE o PFD_MAIN_UNDERLAYPLANE; solo se puede establecer en 0, y las últimas tres variables no son compatibles con Windows 95, por lo que todas están configuradas en 0.