INFORMACIÓN: Modos de asignación y errores de redondeo OFF

Seleccione idioma Seleccione idioma
Id. de artículo: 89215 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
3.10 3.00 4.00 | WINDOWS 3.50 3.51 | WINDOWS NT kbgraphic
Expandir todo | Contraer todo

En esta página

Resumen

Asignación modos, las extensiones de ventana y orígenes y área de visualización y orígenes de las extensiones permiten manipulación coordenada muy eficaces, como escala o mover objetos. Sin embargo, debe saber que hay casos cuando utilizar modos de asignación distintos del MM_TEXT da como resultado pintura incorrecta debido a errores de redondeo.

Redondear - desactivar errores producirse cuando una unidad lógica no equivale a una unidad de dispositivo, y una aplicación solicita la interfaz de dispositivo de gráficos (GDI) para realizar una acción que resultaría en un número no integral de píxeles que necesitan dibujarse, desplazado, blt d, y así sucesivamente.

Redondear - desactivar errores pueden manifestar de muchas maneras, incluyendo unpainted partes de un área de cliente al desplazarse, huecos entre objetos que no deberían tener espacios (o viceversa), objetos que reducción o aumentan píxel de una función en donde están en la pantalla, objetos de tamaños inesperados y así sucesivamente.

Más información

Para comprender mejor errores de redondeo, considere el siguiente código:
   SetMapMode (hDC, MM_ANISOTROPIC);
   SetWindowExt (hDC, 2, 2);
   SetViewportExt (hDC, 3, 3);
   PatBlt (hDC, 0, 0, 5, 2, BLACKNESS);
				
este código indica la GDI para tratar dos unidades lógicas (coordenadas utilizadas por la mayoría de las funciones GDI), en tanto la vertical y horizontal dirección, como igual a tres unidades de dispositivo (píxeles). Se le pide la GDI para dibujar un rectángulo negro cinco unidades lógicas ancho por tres unidades lógicas altos comenzando en el punto lógico (0,0) qué cantidades.

La GDI traduciría esta solicitud de una solicitud para dibujar un rectángulo 7.5 (5 * 3/2 = 7,5) píxeles de ancho por (2 * 3/2 = 3) de 3 píxeles de alto. Sin embargo, las tarjetas de presentación no pueden dibujar la mitad de un píxel, por lo que sería la GDI cualquiera tenga que redondear el ancho de hasta 8 o truncar a 7. Si una aplicación dependía de un comportamiento u otro, podría producirse pintura incorrecta.

Tenga en cuenta que uso modos de asignación, orígenes y extensiones de ventana y orígenes de área de visualización o las extensiones no significa que una aplicación tendrá errores de redondeo. La aparición de round - desactivar errores depende de lo que estas características son utilización, la estructura de la aplicación y otros factores. Muchas aplicaciones aprovechan asignación modos, orígenes y extensiones de ventana y orígenes de área de visualización o las extensiones sin alguna vez encontrar errores de redondeo adversos.

Si una aplicación presenta errores de redondeo, no hay varias formas de evitarlos, algunos que se describen a continuación.

Método 1

Sólo utilizar modo de asignación de MM_TEXT, donde una unidad lógica siempre es igual a una unidad de dispositivo. Sin embargo, la aplicación debe hacer todo su propia escala y movimiento de objetos. La ventaja de este enfoque es que la aplicación tiene control estricto sobre cómo se ajusta y se mueven objetos; puede buscar en el código para ver el álgebra que conduce a redondear - desactivar errores y contador correctamente estos errores. El inconveniente de este enfoque es que facilita el código más complicado y más difíciles de leer que sería si se utilizaron las funciones SetMapMode , SetWindowOrg , SetWindowExt , SetViewportOrg y SetViewportExt .

Método 2

Modo de asignación MM_TEXT de mezcla con el modo de asignación necesario. A veces las aplicaciones sólo tienen problemas de redondeo con determinados tipos de objetos. Por ejemplo, en un programa de gráficos, la aplicación que desee establecer un determinado modo de asignación para dibujar un gráfico de barras; este modo de asignación podría provocar las fuentes que dibuja la aplicación de un tamaño incorrecto.

Para evitar problemas como éste, mezclar MM_TEXT modo de asignación con el modo de asignación de elección. Puede utilizar MM_TEXT al tratar con objetos que necesiten tamaños exactos o selección de ubicación y el modo de asignación para otro dibujo.

Las ventajas y desventajas de este método son prácticamente los mismos que para el método 1. Sin embargo, con el método 2, las aplicaciones pueden aprovechar la asignación de modos para algunos de la escala y movimiento de objetos.

Método 3

Si orígenes y extensiones de ventana o área de visualización se establecen en tiempo de compilación, asegúrese de que sólo las operaciones que daría como resultado sin errores de redondeo. Por ejemplo, asumir la fracción WindowExt ViewportExt y reducir esta fracción. A continuación, sólo realice operaciones que implican múltiplos de los valores de WindowExt reducidos. Por ejemplo, dada la siguiente
    WindowExt   = ( 6, 27)
    ViewportExt = (50, 39)
				
convertir esto en una fracción y reducirlo. Produce:
    in x direction:   6/50 = (2 * 3) / (2 * 5 * 5)  = 3/25
    in y direction:  27/39 = (3 * 3 * 3) / (3 * 13) = 9/13
				
por tanto, nada se realiza en la dirección x puede realizarse utilizando un múltiplo de tres unidades lógicas; nada se realiza en la dirección y puede realizarse utilizando un múltiplo de nueve unidades lógicas. Por ejemplo, si la aplicación desea desplazarse horizontalmente de la ventana, podrían desplazarse 3, 6, 9, 12 y unidades lógicas etc. sin tener que tratar errores de redondeo. Utilizando estos valores, la aplicación nunca tendrá errores de redondeo.

Una ventaja de este método es que una aplicación puede beneficiarse de orígenes y extensiones de ventana y orígenes de área de visualización o las extensiones. Una desventaja es que la aplicación está limitada a un determinado conjunto de orígenes y extensiones (es decir, aquellos integrada en la aplicación en tiempo de compilación).

Método 4

Las aplicaciones pueden realizar el método 3 sobre la marcha. Esto permite la aplicación tratar con orígenes y extensiones de ventana arbitrario y orígenes de área de visualización o las extensiones. Para determinar el número mínimo de unidades lógicas podría utilizar una aplicación dados los valores extensión arbitrario, puede resultar útil (el código mostrado es para determinar el valor que se utiliza en la dirección horizontal) en el siguiente código:
   int GetMinWinXFactor (HDC hDC)

   {

   int nMinX, xWinExt, xViewExt, nGCD;

   xWinExt  = LOWORD (GetWindowExt (hDC));
   xViewExt = LOWORD (GetViewportExt (hDC));
   while ((nGCD = GreatestCommonDivisor (xWinExt, xViewExt)) != 1)

      {
      xWinExt  /= nGCD;
      xViewExt /= nGCD;
      }

   return xWinExt;

   }

   int GreatestCommonDivisor (int i, int j)

   {

   while (i != j)

      if (i < j)
         i -= j;
      else
         j -= i;

   return i;

}
				
el valor devuelto de la función GetMinWinXFactor anterior podrá utilizarse como en el método 3 (es decir, la aplicación puede realizar todos los resultados basándose en múltiplos de este valor).

Notas finales

La discusión anterior no tuvo en cuenta el origen de ventana, que puede contribuir a redondear - desactivar errores. Cómo afectan orígenes y extensiones a las coordenadas que usa GDI se sumarán en "referencia del programador.

Desarrolladores que utilizan los modos de asignación se anima a estudiar las ecuaciones presentadas en la referencia del programador. La GDI utiliza estas ecuaciones al convertir entre lógicas y unidades de dispositivo. Cuando se producen errores de redondeo en una aplicación, siempre es una buena idea para ejecutar los números a través de estas ecuaciones para intentar determinar la causa de los errores.

Propiedades

Id. de artículo: 89215 - Última revisión: jueves, 30 de enero de 2014 - Versión: 2.2
La información de este artículo se refiere a:
  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32 Application Programming Interface
Palabras clave: 
kbnosurvey kbarchive kbmt kbinfo KB89215 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 89215

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com