Операционные системы. Марапулец Ю.В. - 40 стр.

UptoLike

Составители: 

MM_ISOTROPIC
или MM_ANISOTROPIC, функция просто завершает свою
работу, не выполняя никаких действий.
Если режим отображения является изотропным или анизотропным,
функция CreateMapMode должна осуществить дополнительные операции. Во-
первых, вызывается функция GetDeviceCaps, которая возвращает
горизонтальный и вертикальный размеры экрана, а также разрешение.
nHRes = GetDeviceCaps( hdc, HORZRES ) ;
nVRes = GetDeviceCaps( hdc, VERTRES ) ;
nHSize = GetDeviceCaps( hdc, HORZSIZE );
nVSize = GetDeviceCaps( hdc, VERTSIZE ) ;
Последующие действия зависят от значений полей xExt и yExt, которые
могут быть положительными, отрицательными или нулевыми.
Если размеры полей заданы посредством положительных значений, они
воспринимаются как рекомендуемые размеры изображения в единицах
MM_HIMETRIC.
В этом случае вызывается функция SetViewportExtEx, которая
соответствующим образом задает размеры области просмотра.
if( lpMFP->xExt > 0 )
SetViewportExtEx( hdc,(int)((long) lpMFP->xExt * nHRes /
nHSize / 100 ), (int)((long) lpMFP->yExt * nHRes /
nHSize / 100 ), NULL );
Если указаны отрицательные значения, содержимое полей
интерпретируется как масштабный коэффициент. Поэтому сначала
производится расчет масштаба по отношению к контексту устройства.
else
if( lpMFP->xExt < 0 )
{
lMapScale = min( ( 100L * (long) cxWnd * nHSize / nHRes /
-lpMFP->xExt ), (100L * (long) cyWnd * nVSize /
nVRes /-lpMFP->yExt ) );
Вычисляются два масштаба: по оси Х и по оси Y. Однако в качестве
значения lMapScale берется меньшая из двух величин, чтобы результирующее
изображение точно помещалось на экране. Теперь функция SetViewportExtEx
вызывается еще раз - для согласования размеров изображения и области
просмотра.
SetViewportExtEx( hdc,(int)((long) -lpMFP->xExt * lMapScale * nHRes /
nHSize / 100 ),(int)((long) -lpMFP->yExt * lMapScale * nVRes /
nVSize / 100 ), NULL ); }
40
MM_ISOTROPIC или MM_ANISOTROPIC, функция просто завершает свою
работу, не выполняя никаких действий.
     Если режим отображения является изотропным или анизотропным,
функция CreateMapMode должна осуществить дополнительные операции. Во-
первых,     вызывается   функция    GetDeviceCaps,   которая   возвращает
горизонтальный и вертикальный размеры экрана, а также разрешение.

     nHRes = GetDeviceCaps( hdc, HORZRES ) ;
     nVRes = GetDeviceCaps( hdc, VERTRES ) ;
     nHSize = GetDeviceCaps( hdc, HORZSIZE );
     nVSize = GetDeviceCaps( hdc, VERTSIZE ) ;

      Последующие действия зависят от значений полей xExt и yExt, которые
могут быть положительными, отрицательными или нулевыми.
      Если размеры полей заданы посредством положительных значений, они
воспринимаются как рекомендуемые размеры изображения в единицах
MM_HIMETRIC. В этом случае вызывается функция SetViewportExtEx, которая
соответствующим образом задает размеры области просмотра.

     if( lpMFP->xExt > 0 )
           SetViewportExtEx( hdc,(int)((long) lpMFP->xExt * nHRes /
                       nHSize / 100 ), (int)((long) lpMFP->yExt * nHRes /
                       nHSize / 100 ), NULL );

     Если    указаны    отрицательные    значения,    содержимое  полей
интерпретируется как масштабный коэффициент. Поэтому сначала
производится расчет масштаба по отношению к контексту устройства.

     else
     if( lpMFP->xExt < 0 )
     {
            lMapScale = min( ( 100L * (long) cxWnd * nHSize / nHRes /
                   -lpMFP->xExt ), (100L * (long) cyWnd * nVSize /
                   nVRes /-lpMFP->yExt ) );

     Вычисляются два масштаба: по оси Х и по оси Y. Однако в качестве
значения lMapScale берется меньшая из двух величин, чтобы результирующее
изображение точно помещалось на экране. Теперь функция SetViewportExtEx
вызывается еще раз - для согласования размеров изображения и области
просмотра.

     SetViewportExtEx( hdc,(int)((long) -lpMFP->xExt * lMapScale * nHRes /
          nHSize / 100 ),(int)((long) -lpMFP->yExt * lMapScale * nVRes /
          nVSize / 100 ), NULL ); }

                                      40