正常使用映射模式的话会是这样
SetMapMode( hDC, MM_ANISOTROPIC );
SetViewportExtEx( hDC, 1, 1, NULL );
SetWindowExtEx( hDC, 1, -1, NULL );
SetViewportOrgEx( hDC, rc.right/2, rc.bottom/2, NULL );
::Rectangle(hDC,-20, 20, 20,-20) ;
SetMapMode( hDC, MM_ANISOTROPIC );
SetViewportExtEx( hDC, 1, 1, NULL );
SetWindowExtEx( hDC, 1, 1, NULL );
SetViewportOrgEx( hDC, 0, 0, NULL );
结果:
按照上面的代码运行,可以看到,矩形是全部显示在正中间,如果用到双缓冲的话会怎么样?
::BitBlt(hdcBackBuffer, 0,0,rc.right, rc.bottom, NULL, 0,0, WHITENESS) ;
SetMapMode( hDC, MM_ANISOTROPIC );
SetViewportExtEx( hDC, 1, 1, NULL );
SetWindowExtEx( hDC, 1, -1, NULL );
SetViewportOrgEx( hDC, rc.right/2, rc.bottom/2, NULL );
::Rectangle(hdcBackBuffer,-20, 20, 20,-20) ;
::BitBlt(hDC, 0,0,rc.right, rc.bottom, hdcBackBuffer, 0,0, SRCCOPY) ;
SetMapMode( hDC, MM_ANISOTROPIC );
SetViewportExtEx( hDC, 1, 1, NULL );
SetWindowExtEx( hDC, 1, 1, NULL );
SetViewportOrgEx( hDC, 0, 0, NULL );
结果:
可以看到只显示了四分之一
为什么会只显示四分之一呢?
原因:
hdcBackBuffer对应的位图大小是有限的,在这个设备上绘制矩形时是在左上角进行的,只能画四分之一,多余的部分直接被舍弃了,当把这个设备上的图像之间SRCCOPY到hDC这个设备上时,这四分之一个矩形就被坐标映射到中间了