GDI


GDI

The operating system Microsoft Windows uses the GDI (Graphics Device Interface) to draw everything (or a large part) in the computer screen. Starting in Microsoft Windows XP, GDI+ was introduced to perform drawing in the computer. Both interfaces, GDI and GDI+, can be used to draw in: the screen, a document sent to the printer, or an image file. Microsoft Windows Vista, Windows 7 and Windows 8 are based on Direct2D which is part of DirectX.
El sistema operativo Microsoft Windows utiliza la GDI (Graphics Device Interface) para dibujar todo (o gran parte) de lo que aparece en la pantalla. A partir de Microsoft Windows XP se introdujo la librería GDI+ que es una librería de gráficos también usada para dibujar. Ambas interfaces, GDI y GDI+, se pueden usar para dibujar en la pantalla, un documento enviado a la impresora o bien un archivo de imagen. Microsoft Windows Vista, Windows 7 y Windows 8 están basados en Direct2D que es parte de DirectX.

Tip
The main advantage of using GDI is that it is very fast. The main advantage of GDI+ is that it supports more graphic effects, and it can create image files such as: GIF, JPG, etc., while GDI support only bitmaps BMP.
La principal ventaja de la GDI es que es rápida. La principal ventaja de GDI+ es que permite crear más efectos con los gráficos y puede crear archivos de imágenes tales como GIF, JPG, etc., mientras que GDI trabaja solamente con mapas de bits BMP.

WM_PAINT or Window_Paint

Each window (and each control) in a program must draw itself in the screen so that the user can see it. The operating system Microsoft Windows sends a message (WM_PAINT) or a notification Window_Paint when the window (or control) needs to be painted. For instance, a button has a function that paints the button. Thus, every time the button is displayed in the computer screen, Microsoft Windows notifies the button so that the button paints itself. All controls (textbox, list view, etc.) have a painting function that creates a drawing that allows the user to identify the control and its state.
Cada ventana (y cada control) en un programa debe dibujarse en la pantalla de tal forma que el usuario lo pueda ver. El sistema operativo Microsoft Windows envía un mensaje (WM_PAINT) o una notificación Window_Paint cuando la ventana (o control) necesita pintarse. Por ejemplo, un botón tiene una función que pinta el botón. Así, cada vez que el botón se muestra en la pantalla de la computadora, Microsoft Windows envía una notificación al botón para que el botón se pinte. Todos los controles (cajas de texto, list views, etc.) tienen una función de pintado que crea un dibujo que permite al usuario identificar el control y su estado.

Problem 1
Create a Window Application called Hello to draw the sentence "Hello World with GDI" in the center of a Window Application.
Cree una Window Application (Aplicación de ventana) llamado Hello para dibujar la frase: "Hello World with GDI" en el centro de una aplicación de ventana.

Step A
Open Wintempla a double click anywhere in the window area to open the Properties window. Click on the Events tab and mark the Paint event as shown. Close Wintempla and edit Hello.cpp file as shown.
Abra Wintempla y haga doble clic en cualquier lugar del área de la ventana para abrir la ventana de propiedades. Haga clic en la pestaña de Events y marque el evento Paint como se muestra. Cierre Wintempla y edite el archivo Hello.cpp como se muestra.

Window_Paint

Hello.cpp
void Hello::Window_Open(Win::Event& e)
{
}

void Hello::Window_Paint(Win::Event& e)
{
     CG::Gdi gdi(hWnd, true, false);
     gdi.SetTextAlign(TA_CENTER | TA_TOP);
     gdi.TextOut(width/2, 0, L"Hello World with GDI");
}

Hello

GDI Object

The three main GDI objects are: pen, brush and font. A pen is used to draw the border of an object. The brush is used to fill the interior of an object. A font is used to draw characters. There is always a pen, a brush and a font ready to draw.
Los tres objetos GDI son: pluma, brocha y fuente. Una pluma es usada para dibujar el borde de un objeto. La brocha es usada para llenar el interior de un objeto. Una fuente es usada para dibujar letras. Siempre hay una pluma, una brocha y una fuente lista para dibujar.

GdiObjects

Tip
Wintempla encapsulates GDI in the class Win::Gdi. One of the main advantages of this class is that it allows writing easy to read code because this class handles automatically object destruction and selection.
Wintempla encapsula GDI en la clase Win::Gdi. Una de las principales ventajas de esta clase es que permite escribir código fácil de leer ya que está maneja la destrucción y selección de objetos en forma automática.

Pixel

A pixel is the smallest unit that can be drawn. Each computer screen has a specific pixel resolution, however, the left top corner of each window has the coordinates x = 0, y = 0. As GDI coordinates points are specified as integer values, any computation using double values must be converted to int. In these cases, it is always a good idea to add 0.5 to round the conversion to the nearest integer value. For instance, 0.6 will be converted to 1, however, 0.4 will be converted to zero as shown in the code below.
Un pixel es la unidad más pequeña que puede ser dibujada. Cada monitor de computadora tiene una resolución específica en pixeles, sin embargo, la esquina superior izquierda de cada ventana tiene las coordenadas x = 0, y = 0. Como los puntos de coordenadas en las GDI se especifican en valores enteros, cualquier cálculo que involucre valores de punto flotante debe ser convertido a entero. En estos casos, es buena idea sumar 0.5 para redondear la conversión al valor entero más cercano. Por ejemplo, 0.6 será convertido a 1, sin embargo, 0.4 será convertido a cero como se muestra en el código de abajo.

Program.cpp
void Program::Window_Open(Win::Event& e)
{
     double y = 0.6;
     int iy = (int)(y+0.5);
     //
     double z = 0.4;
     int iz = (int)(z+0.5);
}


Problem 2
Create a program called PixelSin to draw a sine wave using green pixels as shown. You can use the pre-defined variables: width and height to know the width and height of the window.
Cree un programa llamada PixelSin para dibujar una onda senoidal usando pixeles verdes como se muestra. Usted puede usar las variables pre-definidas: width y height para conocer el ancho y el alto de la ventana.

PixelSinCoordinates

PixelSin

PixelSin.cpp
void PixelSin::Window_Open(Win::Event& e)
{
}

void PixelSin::Window_Paint(Win::Event& e)
{
     CG::Gdi gdi(hWnd, true, false);
     int x_screen, y_screen;
     double x_sine, y_sine;
     for (x_screen = 0; x_screen < width; x_screen++)
     {
          x_sine = ..
          y_sine = ...
          y_screen = ...
          gdi.SetPixel(x_screen, y_screen, RGB(0, 0, 0));
     }
}

Tip
When Microsoft Windows sends the message WM_PAINT or call the function Window_Paint requesting painting the window, it also especifies the exact area to paint in the variable ps.rcPaint or gdi.GetRcPaint(). When creating programs that draw in a window, always consider painting only the area specified instead of painting the whole window. For instance, in the example below, when the user diminishes the Message Box, the window underneath will receive a WM_PAINT messages specifying in the variable rcPaint indicating the area that was covered with the Message Box. The program can use this information to only paint this area instead of painting the whole window.
Cuando Microsoft Windows envía el mensaje WM_PAINT o llama la función Window_Paint solicitando el pintando de la ventana también específica el área que se requiere pintar dentro de la ventana por medio del elemento ps.rcPaint o gdi.GetRcPaint(). Cuando realice programas que pinten la ventana, siempre considere pintar solamente el área indicada en este rectángulo en lugar de toda la ventana. Por ejemplo, en el caso de abajo, cuando el usuario cierra la caja de mensaje, la ventaja de abajo recibirá un mensaje WM_PAINT especificando en la variable rcPaint el área que estaba cubierta con la caja de mensaje. El programa puede usar esta información para repintar solamente esta área de la ventana en lugar de volver a pintar toda la ventana.

RcPaint

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home