#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("LineDemo") ;
HWND  hwnd ;
MSG   msg ;
WNDCLASS wndclass ;
     
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc= WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
     
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"), 
                     szAppName, MB_ICONERROR) ;
return 0 ;
}
     
hwnd = CreateWindow ( szAppName, TEXT ("Line Demonstration"),
                 WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
     
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
     
while (GetMessage (&msg, NULL, 0, 0))
{
  TranslateMessage (&msg) ;
  DispatchMessage (&msg) ;
     }
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
     TCHAR szbuffer[90];
 SIZE size,size1;
switch (message)
{
          
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 50, 100, NULL) ;
SetViewportExtEx (hdc, 5,5, NULL) ;
GetWindowExtEx(hdc,&size);
GetViewportExtEx(hdc,&size1);
TextOut(hdc,0,0,szbuffer,wsprintf(szbuffer,TEXT("%d %d %d %d"),size.cx,size.cy,size1.cx,size1.cy));
Ellipse (hdc,    1000,    1000, 5000, 5000) ;
         
EndPaint (hwnd, &ps) ;
return 0 ;
          
case  WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}程序就是这样,为什么我用MM_ISOTROPIC画出的圆不圆,只是比用MM_ANISOTROPIC好一点,windows不是可以自动调整吗,怎么回事呢?

解决方案 »

  1.   

    你设置的比例有问题:
    SetWindowExtEx (hdc, 100, 100, NULL) ; 
      

  2.   

    你的窗口尺度与视口尺寸的设置要一致:你将以下代码
    SetWindowExtEx (hdc, 50, 100, NULL) ; 
    SetViewportExtEx (hdc, 5,5, NULL) ; 
    改为:SetWindowExtEx (hdc, 50, 100, NULL) ; 
    SetViewportExtEx (hdc, 5,10, NULL) ; 即可.编译运行程序,圆是正常的圆,而不是椭圆了!
      

  3.   

    但是windows据说是可以自动调整的,那它怎么没有调整呢
      

  4.   

    你说得没错,windows是调整了,但是windows的依据你得给它吧,mapingmode就是为此设置的:若logic device与physicaldevice的映射关系不按比例的话,windows靠什么去调整呢?