下面程序是在珊格中画圆,鼠标左击画黑圆,鼠标右击画绿圆。但是,该程序在WINME中不正常:“鼠标左击画不出黑圆,鼠标右击能画出绿圆”;而该程序在WINXP中却正常:“鼠标左击能画出黑圆,鼠标右击也能画出绿圆”。
请问,这是什么原因?//GridCircle.cpp
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>//窗口函数声明
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//以下代码初始化窗口类
//////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     szCmdLine,
                   int       nCmdShow)
{
    
    HWND      hwnd;
    MSG       msg;
    WNDCLASS  wndclass;
char lpszClassName[]="映象模式";
char lpszTitle[]="My_Map_Mode";
    //窗口类风格
    wndclass.style=0;
    //窗口处理函数为WndProc
    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=lpszClassName;
    //如果注册失败则发出警告声
    if(!RegisterClass(&wndclass))
    {
        MessageBeep(0);
        return FALSE;
    }
    hwnd=CreateWindow(lpszClassName,
                        lpszTitle,
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        310,
                        330,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);
    //显示窗口
    ShowWindow(hwnd,nCmdShow);
    //绘制用户区
    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;
    static PAINTSTRUCT ps;    //定义绘图信息结构
    static HBRUSH      hB1;   //定义画刷
    static HPEN        hP1;   //定义画笔
    static int         nMode; //定义映象模式
    static int         flags=0;
    static int         nlbuttonx=0;
    static int         nlbuttony=0;
    int                i=0;    //消息处理语句
    switch (message)
    {
    case WM_CREATE:
flags=0;
nMode=MM_TEXT;
hB1=(HBRUSH)GetStockObject(BLACK_BRUSH);
break;
//单击鼠标左键更改映象模式为MM_ISOTROPIC
    case WM_LBUTTONDOWN:
        flags=1;
nMode=MM_ISOTROPIC;
        nlbuttonx=LOWORD(lParam); //当前鼠标的x轴坐标
        nlbuttony=HIWORD(lParam); //当前鼠标的y轴坐标
        hB1=(HBRUSH)GetStockObject(BLACK_BRUSH);
InvalidateRect(hwnd,NULL,0); //刷新客户区
        break;
    //单击鼠标右键更改映象模式为MM_ANISOTROPIC
    case WM_RBUTTONDOWN:
        flags=1;
nMode=MM_ANISOTROPIC;
        nlbuttonx=LOWORD(lParam); //当前鼠标的x轴坐标
        nlbuttony=HIWORD(lParam); //当前鼠标的y轴坐标
        hB1=CreateSolidBrush(RGB(0,255,0)); //创建绿色的画刷
InvalidateRect(hwnd,NULL,0); //刷新客户区
        break;
    //当客户区的一部分或全部变为无效以致必须刷新时,将由这个消息通知程序
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps); //取得设备环境句柄
        SetMapMode(hdc,nMode); //设置映象模式
SetWindowExtEx(hdc,300,300,NULL); //设置窗口区域
        SetWindowOrgEx(hdc,0,0,NULL); //设置视口原点
        SetViewportExtEx(hdc,300,300,NULL); //设置视口区域
hP1=CreatePen(PS_INSIDEFRAME,2,RGB(125,125,125));//创建灰色画笔
SelectObject(hdc,hP1); //当前画笔为hP1选入设备环境
        SelectObject(hdc,hB1); //当前画刷为hB1选入设备环境
if(flags)
{
SetMapMode(hdc,nMode); //设置映象模式
//在指定点以指定的大小画圆
Ellipse(hdc,
    (nlbuttonx/30)*30,
                    (nlbuttony/30)*30,
                    (nlbuttonx/30)*30+30,
                    (nlbuttony/30)*30+30);
}
else
{
for(i=30;i<=300;)
{
MoveToEx(hdc,i,0,NULL);//直线的起始点坐标
LineTo(hdc,i,300);//直线的终点坐标
i=i+30;
}
for(i=30;i<=300;)
{
MoveToEx(hdc,0,i,NULL);//直线的起始点坐标
LineTo(hdc,300,i);//直线的终点坐标
i=i+30;
}
}
EndPaint(hwnd,&ps); //释放设备环境句柄
break;
    //退出窗口
    case WM_DESTROY:
DeleteObject(hB1);//删除画刷
        DeleteObject(hP1);//删除画笔
        //调用PostQuitMessage函数发出WM_QUIT消息
        PostQuitMessage(0); 
        break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
    }
    return 0;
}