VC++6.0鼠标响应程序求解
这是我写的代码,没有错误可是得不到预期的效果,请帮忙修改一下。原问题:设计一个鼠标程序,在按下Ctrl键的同事按下鼠标左键,在窗口中拖动鼠标,可以画出一个圆;在按下shi...
这是我写的代码,没有错误可是得不到预期的效果,请帮忙修改一下。
原问题:设计一个鼠标程序,在按下Ctrl键的同事按下鼠标左键,在窗口中拖动鼠标,可以画出一个圆;在按下shift键 同时按下鼠标左键,在窗口中拖动,画出一个矩形。(按下shift不用写)。
代码:(运行环境VC6.0 工程Window32 Application)
#include<windows.h>
#include<stdlib.h>
#include<string.h>
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG Message;
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
while(GetMessage(&Message,0,0,0)) //消息循环
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
WORD x,y,x1,y1; //定义表示坐标的变量
HDC hDC; //定义表示鼠标的变量
HBRUSH hBrush;
PAINTSTRUCT PtStr;
switch(iMessage) //消息处理
{
case WM_LBUTTONDOWN:
x=LOWORD(lParam);
y=HIWORD(lParam);
if(wParam&MK_CONTROL)//如果Ctrl键被按下
{
switch(wParam)
{
case WM_LBUTTONUP:
x1=LOWORD(lParam);
y1=HIWORD(lParam);
case WM_PAINT:
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_TEXT);
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
SelectObject(hDC,hBrush);
Ellipse(hDC,x,y,x1,y1);
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
case WM_DESTROY: //处理结束应用程序消息
PostQuitMessage(0); //结束应用程序
return 0;
default://其他消息处理程序
return(DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
}
}
BOOL InitWindowsClass(HINSTANCE hInstance) //初始化窗口类
{
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,"END");
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName="WinMouse";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
return RegisterClass(&WndClass);
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) //初始化窗口
{
HWND hWnd;
hWnd=CreateWindow("WinMouse", //生成窗口
"Ctrl+鼠标左键=圆;Shift+鼠标左键=矩形",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd);
return TRUE;
}
(刚开始学VC,感觉不好学啊,这个适应时间要多长呢?只能求助各位大高人指点了,在此先谢谢)
可不是么!这么重要的我都忽视了,可是修改后还是没有结果。请帮忙在仔细看看。 展开
原问题:设计一个鼠标程序,在按下Ctrl键的同事按下鼠标左键,在窗口中拖动鼠标,可以画出一个圆;在按下shift键 同时按下鼠标左键,在窗口中拖动,画出一个矩形。(按下shift不用写)。
代码:(运行环境VC6.0 工程Window32 Application)
#include<windows.h>
#include<stdlib.h>
#include<string.h>
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG Message;
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
while(GetMessage(&Message,0,0,0)) //消息循环
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
WORD x,y,x1,y1; //定义表示坐标的变量
HDC hDC; //定义表示鼠标的变量
HBRUSH hBrush;
PAINTSTRUCT PtStr;
switch(iMessage) //消息处理
{
case WM_LBUTTONDOWN:
x=LOWORD(lParam);
y=HIWORD(lParam);
if(wParam&MK_CONTROL)//如果Ctrl键被按下
{
switch(wParam)
{
case WM_LBUTTONUP:
x1=LOWORD(lParam);
y1=HIWORD(lParam);
case WM_PAINT:
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_TEXT);
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
SelectObject(hDC,hBrush);
Ellipse(hDC,x,y,x1,y1);
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
case WM_DESTROY: //处理结束应用程序消息
PostQuitMessage(0); //结束应用程序
return 0;
default://其他消息处理程序
return(DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
}
}
BOOL InitWindowsClass(HINSTANCE hInstance) //初始化窗口类
{
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,"END");
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName="WinMouse";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
return RegisterClass(&WndClass);
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) //初始化窗口
{
HWND hWnd;
hWnd=CreateWindow("WinMouse", //生成窗口
"Ctrl+鼠标左键=圆;Shift+鼠标左键=矩形",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd);
return TRUE;
}
(刚开始学VC,感觉不好学啊,这个适应时间要多长呢?只能求助各位大高人指点了,在此先谢谢)
可不是么!这么重要的我都忽视了,可是修改后还是没有结果。请帮忙在仔细看看。 展开
2个回答
展开全部
case WM_LBUTTONDOWN:
后面少了break
所以只要有鼠标按键程序就会退出
-----------------------------------------
static flag = false;
case WM_LBUTTONDOWN:
x=LOWORD(lParam);
y=HIWORD(lParam);
if(wParam&MK_CONTROL)//如果Ctrl键被按下
{
flag = true;
}
return 0;
case WM_LBUTTONUP:
if(flag)
{;
_RPT0(_CRT_WARN, "error\n");
x1=LOWORD(lParam);
y1=HIWORD(lParam);
//anflag = true;
//SendMessage(hWnd, WM_PAINT, 0, 0);
flag = false;
_RPT0(_CRT_WARN, "another error\n");
hDC= GetDC (hWnd) ;
SetMapMode(hDC,MM_TEXT);
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
SelectObject(hDC,hBrush);
Ellipse(hDC,x,y,x1,y1);
DeleteObject(hBrush);
ReleaseDC(hWnd, hDC);
}
return 0;
--------------------------------------------
这样修改一下就行了
你的程序switch(iMessage) //消息处理
没有意义的
后面少了break
所以只要有鼠标按键程序就会退出
-----------------------------------------
static flag = false;
case WM_LBUTTONDOWN:
x=LOWORD(lParam);
y=HIWORD(lParam);
if(wParam&MK_CONTROL)//如果Ctrl键被按下
{
flag = true;
}
return 0;
case WM_LBUTTONUP:
if(flag)
{;
_RPT0(_CRT_WARN, "error\n");
x1=LOWORD(lParam);
y1=HIWORD(lParam);
//anflag = true;
//SendMessage(hWnd, WM_PAINT, 0, 0);
flag = false;
_RPT0(_CRT_WARN, "another error\n");
hDC= GetDC (hWnd) ;
SetMapMode(hDC,MM_TEXT);
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
SelectObject(hDC,hBrush);
Ellipse(hDC,x,y,x1,y1);
DeleteObject(hBrush);
ReleaseDC(hWnd, hDC);
}
return 0;
--------------------------------------------
这样修改一下就行了
你的程序switch(iMessage) //消息处理
没有意义的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询