下面程序是在珊格中画圆,鼠标左击画黑圆,鼠标右击画绿圆。但是,该程序在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;
}
请问,这是什么原因?//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;
}
解决方案 »
- 完成端口发送文件的同步问题
- 用 VC2008操作OFFICE2007的问题
- C++ 技术交流QQ群16021099,欢迎大家加入,共同学习有关VC核心技术讨论,EVC,ACE,ATL,STL,P2P流媒体技术
- vega 自带的mfc例子,请问这段代码是哪里出了问题?
- vc与数据库求和函数问题100分在线等!!1
- 请问编98下的程序用c++.net好吗,是不是非得用vc6.
- 如何让程序和windows一起启动?高手指点!!
- 请问此种定义方式有什么用
- 关于模拟鼠标移动点击的问题
- 急求取一段可以实现类似于dir/s功能的C/C++代码,谢谢啦,急啊~~~(
- 请教图片显示问题?
- 一个socket通讯问题,在线等
case WM_LBUTTONDOWN:
flags=1;
nMode=MM_ANISOTROPIC;